我目前正在尝试使用 Linux(更具体地说是 Archlinux)为我的家庭网络设置路由器。我使用的嵌入式板有 3 个 LAN 接口,称为wan0
、lan0
,lan1
以及两个 wifi 卡,称为
wifi0
和wifi1
。我想要有两个独立的网络,一个供我的客人使用,一个供我和我的家人使用。我当前的设置如下所示:
+-------+
| wifi0 +----------------+
+-------+ +----+---+
| brg0 |
+-------+ +----+---+
| eth0 +----------------+
+-------+
+-------+
| wifi1 +----------------+
+-------+ +----+---+
| brg1 |
+-------+ +----+---+
| eth1 +----------------+
+-------+
我配置了一个包含lan0
和wifi0
、 名为brd0
、 具有 ip 地址 的网桥,以及一个包含和、 名为 、 具有 ip 地址 的192.168.10.1/24
网桥。 On以及dnsmasq 正在 dhcpd 模式下运行,以将 IP 地址传播到范围为和范围为 的 客户端。该网络是我的访客网络,同时 是我的家庭网络。lan1
wifi1
brd1
192.168.20.1/24
brd0
brd1
192.168.10.50-125
brd0
192.168.20.50-125
brd1
192.168.20.1/24
192.168.10.1/24
到目前为止,此设置有效。然而,有一件事让我大吃一惊。不过,由于访客网络和家庭网络位于两个不同的子网中,因此它们之间的流量也是分开的。但是,当我连接到访客网络时,即使没有设置静态路由器或转发,我也可以访问家庭网络上的服务和计算机。 (反之亦然)。我想这与桥接设备在 Linux 下的工作方式有关。
我的问题是,如何配置路由器以使两个网络彼此分离?我需要使用流量过滤规则吗?这可以用etables来实现吗?或者我的设置是否以某种方式损坏,并且应该无法从一个网络到另一个网络提供服务?
答案1
我将使用文本作为参考,因为您的界面名称在图片和文本之间不匹配。
这路由器是在具有 IP 的所有接口之间进行路由,因此brd0
(家庭)、brd1
(访客)和wan0
(您忘记在图片中添加),正如路由器所期望的那样。
brd0
由于稍后您将需要在和wan0
之间进行路由,brd1
因此wan0
您不能简单地禁用路由。您可以使用两条 iptablesFORWARD
规则来禁止此路由,每个方向一条:
iptables -A FORWARD -i brd0 -o brd1 -j DROP
iptables -A FORWARD -i brd1 -o brd0 -j DROP
如果您想让家庭网络能够访问访客网络,而不是相反,有状态规则可以做到这一点,而是使用:
iptables -A FORWARD -i brd1 -o brd0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i brd1 -o brd0 -j DROP
第一个规则可能可以通过删除接口名称与未来的类似规则“分解”:
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
注意:来自一个网络的系统仍然可以 ping 属于另一网络的路由器 IP(例如,来自192.168.20.2
,ping 192.168.10.1
会成功),因为它没有被路由,因此不会遍历这些FORWARD
规则,但这会有点过分解决它(使用正确的规则)在INPUT
链中)。我只是留下它作为评论。
注意2:这个答案中没有任何内容需要处理 和 是桥的事实brd0
:brd1
这都是关于路由的。