Iptables
iptables 出口防火牆不適用於 IPv6
我有一個執行 Ubuntu 16.04 的伺服器,它的應用程序只需要傳出連接來進行包更新和 NTP 時間同步。為此,它在單獨的網路介面上具有動態 IPv6 地址。所有其他連接都通過另一個介面上的 LAN,該介面沒有通往 WAN 的網關。
我想通過禁止除包更新和 NTP 時間同步之外的任何傳出連接來保護這台機器。
但是,當我嘗試以下規則時,沒有任何內容被阻止:
ip6tables -A OUTPUT -o lo -p all -j ACCEPT ip6tables -A OUTPUT -p icmpv6 -j ACCEPT ip6tables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT ip6tables -A OUTPUT -p udp -m owner --uid-owner systemd-timesync -j ACCEPT ip6tables -A OUTPUT -p tcp --dport 53 -j ACCEPT ip6tables -A OUTPUT -p udp --dport 53 -j ACCEPT while read p; do ip6tables -A OUTPUT -d $p -j ACCEPT done < firewall/hosts-to-allow.list ip6tables -A OUTPUT -o ens18 -j REJECT
請注意,允許傳入的 icmpv6 請求,但會阻止所有其他傳入埠。
請注意,在此問題的先前狀態中,我在記錄所有數據包後首先錯誤地丟棄了所有數據包。
應用規則如下:
Chain INPUT (policy ACCEPT 70 packets, 126K bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all * lo ::/0 ::/0 8 536 ACCEPT icmpv6 * * ::/0 ::/0 67 6405 ACCEPT all * * ::/0 ::/0 state NEW,RELATED,ESTABLISHED 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:53 0 0 ACCEPT udp * * ::/0 ::/0 owner UID match 100 0 0 ACCEPT tcp * * ::/0 2001:67c:1560:8001::14 0 0 ACCEPT tcp * * ::/0 2001:67c:1360:8001::17 0 0 ACCEPT tcp * * ::/0 2001:67c:1360:8001::21 0 0 ACCEPT tcp * * ::/0 2001:67c:1560:8001::11 0 0 ACCEPT udp * * ::/0 2001:67c:1560:8001::14 0 0 ACCEPT udp * * ::/0 2001:67c:1360:8001::17 0 0 ACCEPT udp * * ::/0 2001:67c:1360:8001::21 0 0 ACCEPT udp * * ::/0 2001:67c:1560:8001::11 0 0 ACCEPT tcp * * ::/0 2001:67c:1562::19 0 0 ACCEPT tcp * * ::/0 2001:67c:1560:8001::14 0 0 ACCEPT tcp * * ::/0 2001:67c:1562::16 0 0 ACCEPT tcp * * ::/0 2001:67c:1360:8001::21 0 0 ACCEPT tcp * * ::/0 2001:67c:1360:8001::17 0 0 ACCEPT tcp * * ::/0 2001:67c:1560:8001::11 0 0 ACCEPT udp * * ::/0 2001:67c:1562::19 0 0 ACCEPT udp * * ::/0 2001:67c:1560:8001::14 0 0 ACCEPT udp * * ::/0 2001:67c:1562::16 0 0 ACCEPT udp * * ::/0 2001:67c:1360:8001::21 0 0 ACCEPT udp * * ::/0 2001:67c:1360:8001::17 0 0 ACCEPT udp * * ::/0 2001:67c:1560:8001::11 0 0 REJECT all * ens18 ::/0 ::/0 reject-with icmp6-port-unreachable Chain LOGGING (0 references) pkts bytes target prot opt in out source destination
您的 OUTPUT 表立即開始將 ens18 的所有流量發送到 LOGGING 表,該表繼續記錄然後刪除所有流量。
請記住,iptables 規則是按順序解釋的。因為您已經丟棄了 ens18 的所有流量,所以不會針對該流量評估 OUTPUT 中的其他規則。
我懷疑日誌記錄規則應該在表的末尾,而不是在開頭。當然,您已經在那裡放置了 REJECT 目標規則,因此您應該決定您想要哪一個。
我還懷疑如果您嘗試在受影響的介面上通過 IPv6 連接到您的伺服器,您會很快注意到,因為您會立即註意到沒有流量流動……
此外,在您解決該問題後,您實際上是明確允許此規則中的所有流量:
ip6tables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
這匹配每個可能的有效連接狀態。我希望您不想允許所有
NEW
連接,只允許那些連接RELATED
以及ESTABLISHED
您以後允許的連接。您需要從中刪除
NEW
(並使用-m conntrack
而不是 deprecated-m state
)並將其添加到您要允許的出站連接中,例如:ip6tables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
和
ip6tables -A OUTPUT -m conntrack --ctstate NEW -d $p -j ACCEPT