IPv6 防火墙规则

IPv6 防火墙规则

我有一个 DigitalOcean droplet,它有几种用途,主要是作为网络主机和 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

答案1

IPv6 节点均具有链路本地地址,这些地址位于fe80::/10网络中。节点将使用链路本地寻址来处理本地链路上保留的各种事物(无法路由),因此您必须在规则中允许该寻址。

IPv6 没有广播,因此大量使用多播。节点在接口上将有多个单播/任播地址,并且节点必须订阅每个地址的请求节点多播地址。请求节点多播地址基于单播地址的最后 24 位,因此如果您的所有单播/多播地址都有相同的最后 24 位,那么您将只有一个接口的请求节点多播组(这是理想情况)。

IPv6 邻居发现使用请求节点多播地址。由于 IPv6 没有广播,因此不使用 ARP 将第 2 层地址与第 3 层地址关联起来。IPv6 使用 ND 来实现这一点,而 ND 使用请求节点多播地址。

相关内容