我的家庭网络目前如下所示:
我想将其重组为如下所示(去掉 ISP 交换机并将 STB 插入我的交换机):
我的网关是一台带有两个以太网端口的 PC(执行 NAT 并向我的 LAN 提供 DHCP 和 DNS),并且运行 GNU/Linux。
障碍在于 ISP 的 STB(机顶盒,类似于有线电视盒,但使用以太网 IPTV)。它们发送 DHCP 请求,当 ISP 网关收到该请求时,会使用内部 IP (10.xyz) 而不是 WAN IP 进行应答。这些设备尝试连接的 IPTV 门户只能从内部 IP 访问。
因此,我需要有效地做的是让我的网关对于具有特定 MAC 地址的设备充当交换机(网桥?)。
我想我需要执行以下操作:
- 添加 iptables 规则,直接将源地址与机顶盒 MAC 匹配的数据包从 LAN 复制到 WAN 接口
- 添加 iptables 规则,直接将目标地址与 STB MAC 匹配的数据包从 WAN 复制到 LAN 接口(即与上述相反)
- 确保网关的 DHCP 服务器不回复 STB 的 DHCP 请求
- 免除来自 STB MAC 的数据包进行 NAT 处理吗?
- 我需要担心 ARP 请求吗?
答案1
为了回答上述问题,我从朋友网络专家那里得到了一些建议,以桥接 LAN 和 WAN 接口,然后使用ebtables
过滤掉要桥接的内容:
lan0: [add LAN IPs and use as LAN interface]
eth0 (LAN)
eth1 (WAN) [add WAN IPs and use as WAN interface]
# Forward traffic to/from STBs
ebtables -A FORWARD -i eth0 -o eth1 -s $STB_MAC -j ACCEPT
ebtables -A FORWARD -i eth1 -o eth0 -d $STB_MAC -j ACCEPT
# Allow DHCP responses
ebtables -A FORWARD -i eth0 -o eth0 -d ff:ff:ff:ff:ff:ff -p ipv4 --ip-proto udp --ip-sport 67 --ip-dport 68 -j ACCEPT
# Allow ARP requests
ebtables -A FORWARD -i eth0 -o eth0 -d ff:ff:ff:ff:ff:ff -p arp --arp-ip-dst ! $LAN_SUBNET -j ACCEPT
# The WAN is not really part of the LAN
ebtables -A INPUT -i eth1 -j DROP
ebtables -A FORWARD -i eth1 -j DROP
ebtables -A FORWARD -o eth1 -j DROP
ebtables -A OUTPUT -o eth1 -j DROP
# Allow eth1 to be used to access the WAN
ebtables -t broute -A BROUTING -i eth1 -d $STB_MAC -j ACCEPT
ebtables -t broute -A BROUTING -i eth1 -d $STB_MAC -j ACCEPT
ebtables -t broute -A BROUTING -i eth1 -j DROP
然而,在这种情况下,事实证明 ISP 交换机正在进行基于端口的 VLAN 标记(一个 VLAN 用于 PC 端口,另一个 VLAN 用于 STB 端口)。
因此,要摆脱 ISP 路由器,我需要:
- 在网关的 WAN 网卡上设置两个 VLAN
- 将 WAN IP 配置从 NIC 移至 WAN VLAN(包括 NAT)
- 将网关 DHCP 服务器中的 STB MAC 地址列入黑名单
- 将 ISP 的内部 VLAN 与我的 LAN 桥接
- (可选)添加防火墙规则,以避免 LAN 数据包泄漏到 ISP VLAN 中。
这是有效的,因为 ISP DHCP 服务器已经只回复 STB 的 DHCP 请求,因此在网关上将它们列入黑名单会导致所有 DHCP 回复都由网关或 ISP DHCP 服务器应答。如果使用dnsmasq
,可以使用例如dhcp-host=01:23:45:*:*:*,ignore
in 来完成黑名单/etc/dnsmasq.conf
。
其他一切都可以使用 systemd-networkd 配置文件完成: -.netdev
为 VLAN 创建文件 - 将它们(作为VLAN
条目)添加到.network
WAN NIC 上匹配的文件 -.network
为 VLAN 创建文件 -.netdev
为 LAN/STB 桥创建文件 - 添加STB VLAN 和 LAN NIC 到网桥
这是 systemd-networkd 配置文件的完整示例集:
/etc/systemd/network/isp-link.network
- WAN NIC 的网络配置:这里我们只设置VLAN。确保将 VLAN ID 更改为 ISP 使用的 ID。此示例使用 1234 作为 WAN VLAN,使用 56 作为内部 (IPTV) VLAN。
[Match] Name=eno1 [Network] VLAN=eno1.1234 VLAN=eno1.56
/etc/systemd/network/eno1.1234.netdev
- 广域网VLAN:[NetDev] Name=eno1.1234 Kind=vlan [VLAN] Id=1234
/etc/systemd/network/eno1.56.netdev
- 用于 IPTV 的 ISP 内部 VLAN:[NetDev] Name=eno1.56 Kind=vlan [VLAN] Id=56
/etc/systemd/network/home-bridge.netdev
- ISP-VLAN/家庭 LAN 桥接设备:[NetDev] Name=br0 Kind=bridge
/etc/systemd/network/home-bridge.network
- 所述网桥的网络:确保此处未启用 DHCP 服务器。由于 systemd-networkd 不允许配置要忽略的 MAC 黑名单,因此您需要使用另一个 DHCP 服务器(例如 dnsmasq)。
[Match] Name=br0 [Network] Address=192.168.0.1/24 IPForward=yes IPMasquerade=yes DHCP=no DHCPServer=no
/etc/systemd/network/home-lan.network
- LAN NIC 的网络文件:[Match] Name=enp9s0 [Network] Bridge=br0
/etc/systemd/network/isp-vlan-wan.network
- 您的网关的 WAN 配置:这使用 DHCP - 如果您有静态配置,请将其更改为//
Address
设置。Gateway
DNS
[Match] Name=eno1.1234 [Network] IPForward=yes DHCP=yes
/etc/systemd/network/isp-vlan-internal.network
- 内部 VLAN 的网络文件:[Match] Name=eno1.56 [Network] Bridge=br0
/etc/dnsmasq.conf
- DHCP服务器配置:# Disable DNS server - will be handled by systemd-networkd port=0 # Enable and configure DHCP server dhcp-range=192.168.0.129,192.168.0.254,12h # Specify which interfaces to listen on listen-address=127.0.0.1 listen-address=::1 listen-address=192.168.0.1 # Ignore DHCP requests from the STBs dhcp-host=01:23:45:*:*:*,ignore