Iptables

iptables 出口防火牆不適用於 IPv6

  • March 24, 2019

我有一個執行 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

引用自:https://serverfault.com/questions/959697