我设置了两个 Tomato 固件路由器。路由器 X 通过其 WAN 端口连接到互联网。路由器 Y 的 WAN 连接到路由器 X 的 LAN1 端口。我想限制路由器 Y,使其只能连接到互联网,而不能访问路由器 X 上的本地网络。我尝试在路由器 X 上使用这些 iptables:
iptables -I FORWARD -m mac --mac-source XX:XX:XX:XX:XX -d 192.168.1.0/24 -j DROP
iptables -I FORWARD -s 192.168.1.18 -d 192.168.1.0/24 -j DROP
我分别和一起尝试了这两条规则(在路由器 X 上),但我在连接到路由器 Y 时仍然可以访问路由器 X 上的局域网?(1.18 是路由器 Y 的 WAN 地址,它运行自己的 NAT 网络)
我已经在路由器 X 上尝试使用 TCPDUMP,甚至没有看到对 LAN 的流量访问,但它连接了吗?
答案1
由于您没有提及路由器的品牌和型号,因此大致思路如下:消费级路由器通常由一个“WAN”端口和多个“LAN”端口组成。大多数廉价路由器 SoC 都有两个集成网络接口,一个用于 WAN,一个用于 LAN。当然,这与 LAN 端口的数量不匹配 — 有一个内置交换机。
在大多数路由器中,这些交换机实际上是可编程的。它们可以执行基于端口的 VLAN 和 VLAN 标记。这意味着您可以创建一个“物理分离的”网络接口。
通常是这样的:
+-------------+ +--------------+
| CPU | | LAN1 |--
--| WAN LAN |--| Switch LAN2 |--
+-------------+ | LAN3 |--
+--------------+
无论连接到 LAN1(路由器 Y 所连接的位置)的是什么,都可以完全访问 LAN2 和 LAN3。
但是,我们可以重新配置交换机并创建两个 VLAN:
+---------------+ +--------------+
| CPU | | Switch |
| LAN.1 |--| VLAN1 LAN1 |--
--| WAN | +--------------+
| LAN.2 |--| VLAN2 LAN2 |--
+---------------+ | LAN3 |--
+--------------+
完成所有设置后,每个 VLAN 都将作为单独的网络接口出现在系统中。由于 LAN1 不再与 LAN2/3 位于同一广播域中,因此操作系统会接收流量并决定是否将数据包从 VLAN1 转发到 VLAN2。
为了避免混淆,您通常会为不同的 VLAN 选择不同的子网,因此路由器确实必须进行路由。:)
我不知道 Tomato 是否能做到这一点。OpenWrt 可以,如果我没记错的话,DD-WRT 也可以。它本质上是一个有线访客网络。
如果您无法提供这种级别的隔离,则需要尝试在路由器 Y 上进行过滤,使用类似以下规则:
iptables -A FORWARD -d 192.168.0.0/16 -j DROP
iptables -A FORWARD -d 172.16.0.0/12 -j DROP
iptables -A FORWARD -d 10.0.0.0/8 -j DROP
这当然依赖于路由器 Y 来执行您想要的策略。
答案2
问题是路由器 Y 不需要 FORWARD 链即可到达您的内部网络。其 WAN 接口为 192.168.1.18,因此到达此接口的任何发往 192.168.1.0/24 的数据包都将在本地路由,而无需到达 FORWARD。
我希望如果你在第二条规则中将 FORWARD 更改为 INPUT,事情就会按照你的预期开始工作:
iptables -I INPUT -s 192.168.1.18 -d 192.168.1.0/24 -j DROP