Iptables

IPv6 防火牆規則

  • March 29, 2018

我有一個 DigitalOcean droplet,它用於一些事情,主要用作 Web 主機和 SMTP 伺服器。我最近開始涉足 IPv6,並在 VPS 上成功配置了它;ping6適用於 google.com 等。本地 LAN 網路通過 slaac 配置了 IPv6,可以毫無問題地 ping 並連接到 DO droplet。

我遇到問題的地方是設置ip6tables. 我做了一個只允許 SSH、Web 和 SMTP 的基本配置,但是在添加規則之後,一切都無法通過 IPv6 連接到 VPS。我一沖桌子就沒事了。似乎如果我在添加規則之前設置了一個連接(如 web 或 ssh),則在添加規則後連接工作,它只是一點點。我不確定此時是什麼阻止了連接,任何指導都會有所幫助。

ip6tables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
1880  121K ACCEPT     all      *      *       ::/0                 ::/0                 ctstate RELATED,ESTABLISHED
   2   136 ACCEPT     all      lo     *       ::/0                 ::/0                
   1    84 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:22
   0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:25
   0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:80
   1    80 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:443
   0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:587
 774 55932 DROP       all      *      *       ::/0                 ::/0                

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         
2537  168K ACCEPT     all      *      *       ::/0                 ::/0

更新:添加了一條日誌語句來擷取一些日誌,然後繼續嘗試從我知道不起作用的客戶端進行 SSH。它無法連接,我在等了大約 10 秒後放棄了。

Mar 29 08:57:55 cloud kernel: [170352.518576] IN=eth0 OUT= MAC=33:33:ff:e2:40:01:84:b5:9c:f9:18:30:86:dd SRC=fe80:0000:0000:0000:0000:0000:0000:0001 DST=ff02:0000:0000:0000:0000:0001:ffe2:4001 LEN=72 TC=192 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=135 CODE=0 
Mar 29 08:57:56 cloud kernel: [170353.518091] IN=eth0 OUT= MAC=33:33:ff:e2:40:01:84:b5:9c:f9:18:30:86:dd SRC=fe80:0000:0000:0000:0000:0000:0000:0001 DST=ff02:0000:0000:0000:0000:0001:ffe2:4001 LEN=72 TC=192 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=135 CODE=0 
Mar 29 08:57:57 cloud kernel: [170354.517936] IN=eth0 OUT= MAC=33:33:ff:e2:40:01:84:b5:9c:f9:18:30:86:dd SRC=fe80:0000:0000:0000:0000:0000:0000:0001 DST=ff02:0000:0000:0000:0000:0001:ffe2:4001 LEN=72 TC=192 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=135 CODE=0 
Mar 29 08:57:59 cloud kernel: [170356.517573] IN=eth0 OUT= MAC=33:33:ff:e2:40:01:84:b5:9c:f9:18:30:86:dd SRC=fe80:0000:0000:0000:0000:0000:0000:0001 DST=ff02:0000:0000:0000:0000:0001:ffe2:4001 LEN=72 TC=192 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=135 CODE=0 

為什麼是 SRC fe80::1?這絕對不是我連接的源 IP(它的縮寫前綴是2600:1700)。此外,DSTff02::1:ffe2:4001似乎也在介面上配置:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
   link/ether 04:01:3a:XX:XX:XX brd ff:ff:ff:ff:ff:ff
   inet 104.236.XXX.XXX/18 brd 104.236.XXX.XXX scope global eth0
      valid_lft forever preferred_lft forever
   inet6 2604:a880:800:XXXX::YYYY:4001/64 scope global 
      valid_lft forever preferred_lft forever
   inet6 fe80::601:3aff:fe85:dd01/64 scope link 
      valid_lft forever preferred_lft forever

ip -6 route
2604:a880:800:10::/64 dev eth0 proto kernel metric 256  pref medium
fe80::/64 dev tun0 proto kernel metric 256  pref medium
fe80::/64 dev tap0 proto kernel metric 256  pref medium
fe80::/64 dev eth0 proto kernel metric 256  pref medium
default via 2604:a880:800:XXXX::1 dev eth0 metric 1024  pref medium

按照要求,ip6tables-save

ip6tables-save
# Generated by ip6tables-save v1.6.0 on Thu Mar 29 09:03:33 2018
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 587 -j ACCEPT
-A INPUT -j LOG
-A INPUT -j DROP
-A OUTPUT -j ACCEPT
COMMIT
# Completed on Thu Mar 29 09:03:33 2018

IPv6 節點都具有鏈路本地地址,這些地址位於fe80::/10網路中。節點將對保留在本地連結上的各種事物(無法路由)使用連結本地定址,因此您必須在規則中允許該定址。

IPv6 沒有廣播,因此它大量使用了多播。節點將在一個介面上有多個單播/任播地址,並且節點必須為每個地址訂閱請求節點的多播地址。請求節點多播地址基於單播地址的最後 24 位,因此,如果所有單播/多播地址的最後 24 位相同,那麼介面將只有一個請求節點多播組(這是理想)。

IPv6 鄰居發現使用請求節點多播地址。由於 IPv6 沒有廣播,因此不使用 ARP 將第 2 層地址與第 3 層地址相關聯。IPv6 為此使用 ND,並且使用請求節點多播地址。

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