使某些设备免于 NAT

使某些设备免于 NAT

我的家庭网络目前如下所示:

我想将其重组为如下所示(去掉 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 路由器,我需要:

  1. 在网关的 WAN 网卡上设置两个 VLAN
  2. 将 WAN IP 配置从 NIC 移至 WAN VLAN(包括 NAT)
  3. 将网关 DHCP 服务器中的 STB MAC 地址列入黑名单
  4. 将 ISP 的内部 VLAN 与我的 LAN 桥接
  5. (可选)添加防火墙规则,以避免 LAN 数据包泄漏到 ISP VLAN 中。

这是有效的,因为 ISP DHCP 服务器已经只回复 STB 的 DHCP 请求,因此在网关上将它们列入黑名单会导致所有 DHCP 回复都由网关或 ISP DHCP 服务器应答。如果使用dnsmasq,可以使用例如dhcp-host=01:23:45:*:*:*,ignorein 来完成黑名单/etc/dnsmasq.conf

其他一切都可以使用 systemd-networkd 配置文件完成: -.netdev为 VLAN 创建文件 - 将它们(作为VLAN条目)添加到.networkWAN 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设置。GatewayDNS

    [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
    

相关内容