使用 ip6tables 时,为什么一段时间后我会失去与 IPv6 主机的连接?

使用 ip6tables 时,为什么一段时间后我会失去与 IPv6 主机的连接?

我正在尝试ip6tables(版本1.6.0)在使用 Debian 9 AMI 的 EC2 实例上,我注意到一段时间后我失去了与 IPv6 地址上的服务器的连接,但我仍然可以到达 IPv4 地址上的服务器,当然我已将安全组设置为允许所有流量IPv4 和 IPv6,包括 ICMP。

我将链的默认策略设置INPUTDROP并允许特定端口或 IP 地址以及所有 ICMP 流量,并且我尝试从 AWS 外部的其他主机(来自 Linode 和 DigitalOcean)对服务器执行 ping 操作,一段时间后所有数据包停止到达 EC2 实例,而且我还在端口上运行 3 个 nginx 服务80,80805555, 端口80805555是 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中的数据包没有增加,而且我没有在表中设置任何规则。INPUTnatnat

Chain PREROUTING (policy ACCEPT 396 packets, 35498 bytes)

另外,我安装了根本不使用的 Docker ip6tables,我尝试停止 Docker 容器并禁用 Docker 守护进程并刷新iptablesDocker 设置的规则,但没有任何运气,一段时间后会发生同样的问题。

我正在ping3curl个不同的服务器上尝试:

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 地址上的服务器的连接。

相关内容