我正在尝试ip6tables
(版本1.6.0)在使用 Debian 9 AMI 的 EC2 实例上,我注意到一段时间后我失去了与 IPv6 地址上的服务器的连接,但我仍然可以到达 IPv4 地址上的服务器,当然我已将安全组设置为允许所有流量IPv4 和 IPv6,包括 ICMP。
我将链的默认策略设置INPUT
为DROP
并允许特定端口或 IP 地址以及所有 ICMP 流量,并且我尝试从 AWS 外部的其他主机(来自 Linode 和 DigitalOcean)对服务器执行 ping 操作,一段时间后所有数据包停止到达 EC2 实例,而且我还在端口上运行 3 个 nginx 服务80,8080和5555, 端口8080和5555是 nginx Docker 容器的已发布端口,但这并不重要,因为我正在尝试在所有这些端口上发出同样问题的 GET 请求。
奇怪的是,我正在观察数据包数量,当连接丢失时,丢弃的数据包数量并没有增加ip6tables -L -xvn
:
Chain INPUT (policy DROP 21 packets, 2748 bytes)
但是当我将默认策略更改为ACCEPT
( ip6tables -P INPUT ACCEPT
) 时,它又开始工作,我不知道这是否是巧合。
我还在nat
使用 观察表的数据包数量watch -n 1 ip6tables -t nat -L -xvn
,当一切正常时,链中的数据包计数都会增加PREROUTING
,我注意到的一件事是,当发生此问题时,我可以看到链INPUT
中的数据包数量增加PREROUTING
表的链nat
中的数据包没有增加,而且我没有在表中设置任何规则。INPUT
nat
nat
Chain PREROUTING (policy ACCEPT 396 packets, 35498 bytes)
另外,我安装了根本不使用的 Docker ip6tables
,我尝试停止 Docker 容器并禁用 Docker 守护进程并刷新iptables
Docker 设置的规则,但没有任何运气,一段时间后会发生同样的问题。
我正在ping
3curl
个不同的服务器上尝试:
ping6 HOST_IP
和:
while true; do curl http://HOST_IP:5555 --connect-timeout 10; sleep 1; done
这些是ip6tables
我正在使用的规则:
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -s IPv6_OF_ONE_OF_MY_OTHER_HOSTS -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5555 -j ACCEPT
-P INPUT DROP
我正在尝试测试白名单主机是否能够访问所有端口,而其他 2 台主机只能访问端口5555。
我做错了什么吗?我该如何解决这个问题?
答案1
经过一些测试后,我发现了问题,当我546
使用以下命令启用 DHCPv6 客户端端口时:
-A INPUT -m conntrack --ctstate NEW -m udp -p udp --dport 546 -d fe80::/64 -j ACCEPT
一切开始正常工作,我还尝试删除此规则以确保这是真正的问题,是的,确实,当删除此规则时,这些数据包会被丢弃,并且我会失去与 IPv6 地址上的服务器的连接。