IPv6 防火牆規則
我有一個 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,並且使用請求節點多播地址。