为什么 ip6tables -A INPUT -j DROP 会阻止传出的服务器连接

为什么 ip6tables -A INPUT -j DROP 会阻止传出的服务器连接

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

配置如下:

#!/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),一切正常。可能是什么问题?

更新。感谢那些回答了整套规则并提供了宝贵信息的人。如果有人需要现在可以使用的配置,这是针对基本 Web 服务器的配置,其中打开了 80 和 22 端口,无状态(适用于高流量应用程序):

#!/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

答案1

该规则不会阻止传出连接。但它会丢弃发送到所有传出连接的回复。

这不是你的规则中唯一的缺陷。你丢弃了大量 ICMPv6 数据包,而这些数据包是正常运行所必需的。此外,默默地丢弃数据包并不是一个好的做法,因为这会使问题更难调试,并引入额外的问题,而如果你发送了正确的错误消息,这些问题就不会出现。

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

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

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

答案2

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

  • 一切lo
  • 目的端口为 53 的 UDP
  • 目标端口为 80 的 TCP
  • 目标端口为 22 的 TCP
  • ICMPv6 类型回应答复

实际上,你正在阻止所有其他传入数据包,包括对传出数据包的回复。你应该使用“状态”模块研究“状态防火墙”。请参阅https://www.sixxs.net/wiki/IPv6_Firewalling举一些例子。

您还阻止了太多 ICMPv6。路由器通告和邻居发现都是可能需要的 ICMPv6 的示例。

相关内容