Iptables 阻止来自子网的网络接口的传入连接

Iptables 阻止来自子网的网络接口的传入连接

我有一台使用 Hostapd 提供 WiFi 热点的 Linux 机器。我还有一个 Raspberry Pi,它作为 DHCP 客户端连接到此 WiFi 热点。Linux 机器有一个蜂窝接口,并使用内核中的 ipv4 转发与 Raspberry Pi 共享此互联网连接。此外,该机器有一个名为“wg0”的 Wireguard 接口。我可以从 Linux 机器通过 SSH 进入 Raspberry Pi,并成功 ping 10.10.10.1 和蜂窝接口的 ip 地址。我可以对 10.10.0.3 的 Wireguard 接口进行 ping 操作。 在此处输入图片描述

我想要的是阻止 Raspberry Pi ping 10.10.0.3 处的 Wireguard 接口。我希望 Raspberry Pi 不知道 wg0 接口的存在。

我认为我可以使用以下 iptables 规则阻止从 10.10.10.0/24 子网入站到 wg0 的所有流量:

iptables -I INPUT 1 -i wg0 -s 10.10.10.0/24 -j DROP

但是,Pi 仍然可以 ping 10.10.0.3。如何让 wg0 接口对 wan0 热点上连接的客户端不可见?

答案1

使用时,请按照以下步骤操作iptables

  • 丢弃到主机本身的目的地 10.10.0.3 的流量:

    数据包从wan0接口进入,而不是从wg0接口进入。源地址实际上并不重要:设备 2 已被输入接口识别。只需说明目的地:

    iptables -I INPUT 1 -i wan0 -d 10.10.0.3 -j DROP
    

    这是不可能的iptables仅使用接口名称执行此类过滤,wg0而不声明 10.10.0.3 地址,因为wg0不是输出接口(INPUT 路径没有输出接口)。

  • 流量也会下降转发wan0wg0(这次wg0 输出接口):

    iptables -I FORWARD -i wan0 -o wg0 -j DROP
    
  • 并彻底阻止 ARP 探测以获得答案

    Linux 跟随弱者主机模型并且也将此模型应用于 ARP:默认情况下,Linux 还将回复来自其他 IP LAN 和/或接口的 ARP 请求:

    arp_ignore- 整数

    Define different modes for sending replies in response to
    received ARP requests that resolve local target IP addresses:
    
    - 0 - (default): reply for any local target IP address, configured
      on any interface
    - 1 - reply only if the target IP address is local address
      configured on the incoming interface
    - 2 - reply only if the target IP address is local address
      configured on the incoming interface and both with the
      sender's IP address are part from same subnet on this interface
    

    [...]

    因此,即使地址在 IP 级别受到防火墙保护,仍然可以通过在设备 2 上运行在 ARP 级别发现该地址:

    arping 10.10.0.3
    

    使用arptablesnft防火墙来阻止此类 ARP 请求会有些过头。您可以直接告诉内核更改其wan0接口的行为:

    sysctl -w net.ipv4.conf.wan0.arp_ignore=1
    

    尽管可以选择 2,但值 1 就足够了。

相关内容