我有一个带两个 Wi-Fi 接口的 dd-wrt 路由器(ath0
,ath1
)。我希望打开的所有设备ath0
都不要有任何类型的 WAN 访问。只有 LAN(往返于设备)。
我该如何以最简单、最强大的方式做到这一点?
之前我也尝试过使用 ath1 来实现这一点,方法是添加虚拟 AP、为 AP 添加新桥接器以及一些高级路由和防火墙设置。不过这太复杂了,我认为使用我未使用的ath0
(5GHz)接口来实现此目的应该容易得多。
我使用 OpenVPN 作为客户端,这让事情变得有点复杂。当使用旧方法的 iptables 防火墙时,我总是必须手动重新设置防火墙设置,因为 /etc/ 中的一个文件会-I
因为 VPN 而覆盖我的规则(在顶部),只要通过 VPN,就允许一切 WAN 访问。由于 squashFS,我找不到阻止这种情况的方法,而且总是必须在保存设置/重新启动路由器后手动覆盖它,这不是很好。另外,我不确定它以后是否会再次覆盖它。
我也不想ath0
使用 VPN 访问权限。我无法使用带有源 IP 的 iptables,因为它应该适用于该 SSID/接口上的所有客户端,并且只要它们连接,所以我实际上不会提前知道 IP。
我尝试查找这个,但除了过于先进的虚拟 AP/桥接解决方案外,我找不到任何适合我的情况的东西。
答案1
假设路由器上除了有 之外还有ebtables
(或),并且所有(W)LAN 接口都是同一主接口(名为)的桥接从接口:ebtables-nft
iptables
bridge0
ebtables -I INPUT -i ath0 -j mark --set-mark 0xabcd
iptables -I FORWARD -i bridge0 -m mark --mark 0xabcd -j DROP
(请注意,标记值0xabcd
是任意的。)
这会导致从“LAN 端”进入路由器的所有流量“停留在”广播域内。原因是,ebtables
'INPUT
不包括从桥接从属设备/端口到另一个桥接从属设备/端口的流量(即 L2 转发)。对于以路由器本身为目标的流量(来自路由器ath0
并因此被标记),我们不希望它们在 L3 上转发(即能够从“LAN”转到“WAN”/VPN/...)。
另外,您也可以在不依赖 iptables 或数据包标记的情况下执行此操作:
ebtables -I INPUT -i ath0 -d Unicast -p ip ! --ip-dst $ROUTER_LAN_IP -j DROP
虽然没有测试过,但-d Unicast
应该可以保持 DHCP 等正常工作。如果您还需要 IPv6(流量对于 L3 上的路由器) 才能工作,您可能需要/想要一个额外的链来处理更多例外(这也允许您使用另一种方法允许 DHCP),例如:
ebtables -N ATH0
ebtables -A ATH0 -p ip --ip-dst $ROUTER_LAN_IP -j ACCEPT # unicast
ebtables -A ATH0 -p ip --ip-dport 67 -j ACCEPT # broadcast
ebtables -A ATH0 -p ip ... -j ACCEPT
...
ebtables -A ATH0 -p ip6 ... -j ACCEPT
...
ebtables -A ATH0 -j DROP
ebtables -I INPUT -i ath0 -j ATH0
但正如您所见,后一种方法更加笨拙。
PS 我对所有 WRT 或类似产品都没有经验,所以我不知道如何使 xtables 规则在它们上持久化。(不过公平地说,据我所知,即使在“典型的”Linux 发行版上,它也是特定于发行版的。)