您如何使用 iptables(在 Ubuntu 上)設置出口規則?
如何在 Ubuntu 上使用 iptables 設置出口規則?
我試圖在那裡找到有關出口規則和 iptables 的資訊,但資訊不完整或不准確。在四處探勘並斷開我的 ssh 會話幾次後,我想通了,並認為我會在 ServerFault 上分享它。
出口規則是任何安全策略的關鍵,並且是滿足許多安全標準(例如 PCI DSS)所必需的。
注意:這裡的命令假設是基於 Debian 的發行版(例如,Ubuntu 伺服器)。各個發行版的 iptables 命令應該是相同的,但是請查看您自己發行版的參考指南,了解如何保存和載入 iptables,因為這些步驟會有所不同。如果有人想 wikify 並添加 RH 或其他 dist 差異,那就去吧。
在下面的範例中,我們將為只需要獲取軟體包更新的伺服器設置相當通用的規則。請記住,這些是區分大小寫的命令,並且您鍵入它們的順序是它們被評估的順序(即,如果您通過 SSH 連接,請不要先執行 -A OUTPUT -j REJECT)。
範例規則集
sudo iptables -A OUTPUT -o lo -p all -j ACCEPT sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --dport 80 -d security.ubuntu.com -j ACCEPT sudo iptables -A OUTPUT -p tcp --dport 80 -d us.archive.ubuntu.com -j ACCEPT sudo iptables -A OUTPUT -j REJECT
重要提示:請勿添加 security.ubuntu.com 或 us.archive.ubuntu.com 規則,除非您
/etc/hosts
為這些規則添加條目(但請參閱打開 DNS 查詢的“其他出口規則”)。請記住,iptables 將在應用規則時評估這些地址的 IP。因此,如果 ubuntu 更改了這些地址,您需要重新創建這些規則或重新啟動電腦(這些規則在啟動時應用)。讓我們來看看這些規則中的每一個:
本地介面規則
sudo iptables -A OUTPUT -o lo -p all -j ACCEPT
這是添加一個條目,表示我們應該接受任何想要在本地 (127.0.0.1) 介面上出站的流量。一些應用程序使用這個介面來交換資訊,我們不想破壞這些。
秘製醬料規則(已建立/相關會議)
sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
這是經常被遺忘的規則,導致會話斷開和混亂。這說的是允許與已建立的會話或與已建立的會話相關的出站流量。例如,如果您的伺服器上有 SSH,您可以打開埠 22 入站,但是伺服器如何將數據發送回客戶端(這甚至可能建議為後續通信使用備用更高埠)?這就是這個規則允許的。
允許 Ubuntu apt-get 更新
sudo iptables -A OUTPUT -p tcp --dport 80 -d security.ubuntu.com -j ACCEPT sudo iptables -A OUTPUT -p tcp --dport 80 -d us.archive.ubuntu.com -j ACCEPT
這些規則只是告訴 iptables 允許流量進入 ubuntu 更新伺服器的埠 80。這些可能因您所在的地區而異,並且可能更多,因此您必須在
apt-get update
執行此操作後進行操作以確保它適合您。重要提示:正如我之前提到的,在沒有先將相應 IP 映射到/etc/hosts
. 此外,如果 Ubuntu 更改了這些 IP,您將需要更新主機條目並重新啟動或重新創建這些規則,因為 iptables 會在應用規則時評估地址。“殺手”法則
sudo iptables -A OUTPUT -j REJECT
這是殺死所有其他流量的規則。這絕對應該是您鏈條中的最後一條規則,否則其他規則將不起作用。
不要忘記做:
sudo sh -c “iptables-save >/etc/iptables.rules”
如果你想保留規則,然後添加:
pre-up iptables-restore < /etc/iptables.rules
在中的介面(eth0 或其他)下
/etc/network/interfaces
。其他出口規則
要允許“ping”工作(從伺服器):
sudo iptables -A OUTPUT -p icmp --icmp echo-request -j ACCEPT sudo iptables -A OUTPUT -p icmp --icmp echo-reply -j ACCEPT
允許 DNS 工作(從伺服器)。請注意,添加這些意味著您不必
/etc/hosts
在上面的範例中使用,但可以說安全性較低。sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
允許 NTP 時間同步客戶端:
sudo iptables -A OUTPUT -p udp -m owner --uid-owner systemd-timesync -j ACCEPT
(隨意添加)