我有一个 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 使用请求节点多播地址。