我有一台运行 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
答案1
您的 OUTPUT 表立即开始将所有 ens18 的流量发送到 LOGGING 表,该表继续记录然后删除所有流量。
请记住,iptables 规则是按顺序解释的。由于您已经丢弃了 ens18 的所有流量,因此不会针对该流量评估 OUTPUT 中的其他规则。
我怀疑日志记录规则应该放在表的末尾,而不是开头。当然,您已经在那里放置了 REJECT 目标规则,因此您应该决定要使用哪一个。
我还怀疑,如果您尝试通过受影响的接口上的 IPv6 连接到您的服务器,您会更早注意到这一点,因为您会立即注意到没有流量流动……
此外,修复该问题后,您实际上明确允许此规则中的所有流量:
ip6tables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
这匹配所有可能的有效连接状态。我希望你这样做不是想要允许全部 NEW
连接,仅限那些RELATED
以及ESTABLISHED
您稍后允许的连接。
您需要NEW
从中删除(并使用-m conntrack
已弃用的-m state
)并将其添加到您想要允许的出站连接中,例如:
ip6tables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
和
ip6tables -A OUTPUT -m conntrack --ctstate NEW -d $p -j ACCEPT