iptables 出口防火墙无法与 IPv6 配合使用

iptables 出口防火墙无法与 IPv6 配合使用

我有一台运行 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

相关内容