![使用 Netfilter 在互联网和 LAN 之间隔离网络流量](https://linux22.com/image/632057/%E4%BD%BF%E7%94%A8%20Netfilter%20%E5%9C%A8%E4%BA%92%E8%81%94%E7%BD%91%E5%92%8C%20LAN%20%E4%B9%8B%E9%97%B4%E9%9A%94%E7%A6%BB%E7%BD%91%E7%BB%9C%E6%B5%81%E9%87%8F.png)
我有一个公司“网络设备”,允许手持设备通过 wifi 连接到它。我正在尝试弄清楚如何允许该设备访问互联网(以便它可以下载供应商更新),而不允许它访问 LAN 上的资源。
我已将设备插入 Linux 机箱,这样我就可以使用 iptables 来过滤 eth1 上的流量(参见此处的图片:https://i.stack.imgur.com/THQxy.png)。通常情况下,我会在防火墙上设置第三个接口,这样我就可以通过出站接口过滤出口,但这次我不能。
问题是,我的 LAN 上有许多不同的子网,我不想管理 LAN 上每个子网的出口规则。有没有办法告诉 Netfilter 允许端口 80/443 前往互联网网关,即使出口将与 LAN 运行相同的接口?
答案1
如果我理解正确的话,您有一个连接到 LAN 的 Linux 机器,它不用作路由器。该 Linux 机器有两个以太网接口,一个连接到 LAN,另一个直接连接到 WiFi 设备。
您无法真正过滤“网关 IP”,因为在典型情况下,网关 IP 的唯一用途是通过 ARP 解析网关的 MAC 地址。数据包被发送到该 MAC 地址,但其实际目标 IP 在 LAN 内不会改变。您的路由器正在执行 NAT 的工作;获取源 IP(例如 10.0.0.1)并将其转换为面向公众的 IP,反之亦然。
你也无法根据目标 MAC 地址进行过滤,因为这种情况会发生后iptables 已完成过滤/路由/处理等。该操作在数据包传出之前立即发生,并且发生在低于网络层(原始 IP 协议)的数据链路层(以太网)。
这可能不是最理想的情况,但您可能希望研究 IP 集。这是一项 netfilter 功能,可让您定义一系列 IP 地址或范围,然后将它们全部与单个 iptables 规则匹配。它为您节省了处理 iptables 的精力,还允许您从阻止 LAN 访问的规则中添加或删除子网,甚至无需触碰 iptables。
一个例子:
ipset create lan-block hash:net # Create an ipset called 'lan-block' that will store network/mask pairs.
ipset add lan-block 192.168.1.0/24 # add 192.168.1.0-192.168.1.255 to this set
ipset add lan-block 172.16.0.0/16 # add 172.16.0.0-172.16.255.255 to this set
ipset add lan-block 10.0.0.0/15 # add 10.0.0.0-10.1.255.255 to this set
...
iptables -A FORWARD -m set --match-set lan-block src,dst -j DROP # block all packets whose source or destination is found in the set lan-block.
请参阅 ipset 和 iptables-extensions 的手册页以了解更多信息。
在某些发行版中,ipset 不包含在内,但您应该能够从发行版的存储库中获取它。
希望这可以帮助。