我有一个运行 Ubuntu 16.04 的服务器,它的应用程序只需要传出连接来进行包更新和 NTP 时间同步。为此,它在单独的网络接口上具有动态 IPv6 地址。所有其他连接都通过另一个接口上的 LAN,该接口没有通往 WAN 的网关。
我想通过禁止除包更新和 NTP 时间同步之外的任何传出连接来保护这台机器。
但是,当我尝试以下规则时,没有任何内容被阻止:
ip6tables -A OUTPUT -o lo -p all -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 -j ACCEPT
ip6tables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
ip6tables -A OUTPUT -p udp -m owner --uid-owner systemd-timesync -j ACCEPT
ip6tables -A OUTPUT -p tcp --dport 53 -j ACCEPT
ip6tables -A OUTPUT -p udp --dport 53 -j ACCEPT
while read p; do
ip6tables -A OUTPUT -d $p -j ACCEPT
done < firewall/hosts-to-allow.list
ip6tables -A OUTPUT -o ens18 -j REJECT
请注意,允许传入的 icmpv6 请求,但会阻止所有其他传入端口。
请注意,在此问题的先前状态中,我在记录所有数据包后首先错误地丢弃了所有数据包。
应用规则如下:
Chain INPUT (policy ACCEPT 70 packets, 126K bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all * lo ::/0 ::/0
8 536 ACCEPT icmpv6 * * ::/0 ::/0
67 6405 ACCEPT all * * ::/0 ::/0 state NEW,RELATED,ESTABLISHED
0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:53
0 0 ACCEPT udp * * ::/0 ::/0 owner UID match 100
0 0 ACCEPT tcp * * ::/0 2001:67c:1560:8001::14
0 0 ACCEPT tcp * * ::/0 2001:67c:1360:8001::17
0 0 ACCEPT tcp * * ::/0 2001:67c:1360:8001::21
0 0 ACCEPT tcp * * ::/0 2001:67c:1560:8001::11
0 0 ACCEPT udp * * ::/0 2001:67c:1560:8001::14
0 0 ACCEPT udp * * ::/0 2001:67c:1360:8001::17
0 0 ACCEPT udp * * ::/0 2001:67c:1360:8001::21
0 0 ACCEPT udp * * ::/0 2001:67c:1560:8001::11
0 0 ACCEPT tcp * * ::/0 2001:67c:1562::19
0 0 ACCEPT tcp * * ::/0 2001:67c:1560:8001::14
0 0 ACCEPT tcp * * ::/0 2001:67c:1562::16
0 0 ACCEPT tcp * * ::/0 2001:67c:1360:8001::21
0 0 ACCEPT tcp * * ::/0 2001:67c:1360:8001::17
0 0 ACCEPT tcp * * ::/0 2001:67c:1560:8001::11
0 0 ACCEPT udp * * ::/0 2001:67c:1562::19
0 0 ACCEPT udp * * ::/0 2001:67c:1560:8001::14
0 0 ACCEPT udp * * ::/0 2001:67c:1562::16
0 0 ACCEPT udp * * ::/0 2001:67c:1360:8001::21
0 0 ACCEPT udp * * ::/0 2001:67c:1360:8001::17
0 0 ACCEPT udp * * ::/0 2001:67c:1560:8001::11
0 0 REJECT all * ens18 ::/0 ::/0 reject-with icmp6-port-unreachable
Chain LOGGING (0 references)
pkts bytes target prot opt in out source destination
您的 OUTPUT 表立即开始将 ens18 的所有流量发送到 LOGGING 表,该表继续记录然后删除所有流量。
请记住,iptables 规则是按顺序解释的。因为您已经丢弃了 ens18 的所有流量,所以不会针对该流量评估 OUTPUT 中的其他规则。
我怀疑日志记录规则应该在表的末尾,而不是在开头。当然,您已经在那里放置了 REJECT 目标规则,因此您应该决定您想要哪一个。
我还怀疑如果您尝试在受影响的接口上通过 IPv6 连接到您的服务器,您会很快注意到,因为您会立即注意到没有流量流动......
此外,在您解决该问题后,您实际上是明确允许此规则中的所有流量:
这匹配每个可能的有效连接状态。我希望您不想允许所有
NEW
连接,只允许那些连接RELATED
以及ESTABLISHED
您以后允许的连接。您需要从中删除
NEW
(并使用-m conntrack
而不是 deprecated-m state
)并将其添加到您要允许的出站连接中,例如:和