为什么ip6tables -A INPUT -j DROP阻塞出站服务器连接

我愿意为IPv6configurationiptables和ip6tables。 但由于一些未知的原因,我的configuration中的最后一个ip6tables规则阻止了我的服务器(apt-get,wget,ping,ping6等)的任何传出连接。 服务器是Debian 8.1,这是一个configuration了IPv6的DO滴。

这是configuration:

#!/bin/sh # Flush all existing first sudo iptables -F # Disable tracking sudo iptables -t raw -I PREROUTING -p tcp --dport 80 -j NOTRACK sudo iptables -t raw -I PREROUTING -p tcp --dport 22 -j NOTRACK sudo iptables -t raw -I OUTPUT -p tcp --dport 80 -j NOTRACK sudo iptables -t raw -I OUTPUT -p tcp --dport 22 -j NOTRACK # Local sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A OUTPUT -o lo -j ACCEPT # DNS sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT sudo iptables -A OUTPUT -p udp --sport 53 --dport 1024:65535 -j ACCEPT # Custom rules sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # Allow ping from inside sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT # Allow ping from outside sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT # Drop everything else sudo iptables -A INPUT -j DROP # IPv6 # Flush all existing first sudo ip6tables -F # Disable tracking sudo ip6tables -t raw -I PREROUTING -p tcp --dport 80 -j NOTRACK sudo ip6tables -t raw -I PREROUTING -p tcp --dport 22 -j NOTRACK sudo ip6tables -t raw -I OUTPUT -p tcp --dport 80 -j NOTRACK sudo ip6tables -t raw -I OUTPUT -p tcp --dport 22 -j NOTRACK # Local sudo ip6tables -A INPUT -i lo -j ACCEPT sudo ip6tables -A OUTPUT -o lo -j ACCEPT # DNS sudo ip6tables -A INPUT -p udp --dport 53 -j ACCEPT sudo ip6tables -A OUTPUT -p udp --sport 53 --dport 1024:65535 -j ACCEPT # Custom rules sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT # Allow ping from inside sudo ip6tables -A OUTPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-reply -j ACCEPT # Allow ping from outside sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT sudo ip6tables -A OUTPUT -p icmpv6 --icmpv6-type echo-reply -j ACCEPT # Drop everything else sudo ip6tables -A INPUT -j DROP 

如果我删除了最后一条规则(ip6tables -A INPUT -j DROP),一切正常。 可能是什么问题呢?

UPD。 感谢那些已经回答了整套规则的宝贵信息的人。 如果任何人需要现在正在工作的configuration,这是一个基本的Web服务器,打开80和22端口,无状态(对于高stream量的应用程序):

 #!/bin/sh # Flush all existing first sudo iptables -F # Local sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A OUTPUT -o lo -j ACCEPT # Allow outbound DNS sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT # Allow inbound HTTP (apt-get, wget etc.) sudo iptables -A INPUT -p tcp --sport 80 -j ACCEPT # Custom rules sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # Allow ICMP sudo iptables -A INPUT -p icmp -j ACCEPT sudo iptables -A OUTPUT -p icmp -j ACCEPT # Drop everything else sudo iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited # IPv6 # Flush all existing first sudo ip6tables -F # Local sudo ip6tables -A INPUT -i lo -j ACCEPT sudo ip6tables -A OUTPUT -o lo -j ACCEPT # Allow outbound DNS sudo ip6tables -A OUTPUT -p udp --dport 53 -j ACCEPT sudo ip6tables -A INPUT -p udp --sport 53 -j ACCEPT # Allow inbound HTTP (apt-get, wget etc.) sudo ip6tables -A INPUT -p tcp --sport 80 -j ACCEPT # Custom rules sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT # Allow ICMP sudo ip6tables -A INPUT -p icmpv6 -j ACCEPT sudo ip6tables -A OUTPUT -p icmpv6 -j ACCEPT # Drop everything else sudo ip6tables -A INPUT -j REJECT --reject-with icmp6-adm-prohibited 

该规则不阻止传出连接。 然而,它将放弃发送给所有外出连接的答复。

这不是你的规则中唯一的缺陷。 您正在丢弃大量正确操作所需的ICMPv6数据包。 此外,静静地丢弃数据包不是一个好的做法,因为它会使问题更难以debugging,并引入其他问题,如果您发送正确的错误消息,则不会出现这些问题。

要解决第一个问题,您需要启用连接跟踪,以便允许回复您的传出连接。或仔细评估您需要的传出连接,并决定一组无状态规则,以允许传入stream量匹配该传出stream量。

要解决第二个问题,您需要允许所有ICMPv6错误消息以及邻居发现。

要解决第三个问题,使用REJECT --reject-with icmp6-adm-prohibited而不是DROP

INPUT(IPv6)上允许的唯一数据包是:

  • 一切都在
  • 目标端口53的UDP
  • 目标端口为80的TCP
  • TCP与目标端口22
  • ICMPv6types的回应答复

在实践中,您将阻止所有其他传入数据包,包括对传出数据包的答复。 你应该看看“状态防火墙”使用“状态”模块。 有关示例,请参阅https://www.sixxs.net/wiki/IPv6_Firewalling

你也阻止了太多的ICMPv6。 路由器广告和neigbor发现都是可能需要ICMPv6的例子。