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

uiw*_*e83 4 debian ipv6

我愿意为 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
Run Code Online (Sandbox Code Playgroud)

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

更新。感谢那些回答有关整套规则的宝贵信息的人。如果有人需要现在正在运行的配置,这适用于打开 80 和 22 个端口的基本 Web 服务器,无状态(用于高流量应用程序):

#!/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
Run Code Online (Sandbox Code Playgroud)

kas*_*erd 7

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

这不是你规则中的唯一缺陷。您正在丢弃大量 ICMPv6 数据包,这是正确操作所必需的。此外,静默丢弃数据包不是一个好习惯,因为它会使问题更难调试并引入额外的问题,如果您发送正确的错误消息,这些问题就不会存在。

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

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

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