Isenta alguns dispositivos do NAT

3

Atualmente, minha rede doméstica é assim:

Eugostariadereestruturá-loparaficarassim(livre-sedoswitchISPeconecteosSTBsnomeu):

Meu gateway é um PC com duas portas Ethernet (fazendo NAT e fornecendo DHCP e DNS para minha LAN) e está executando o GNU / Linux.

O obstáculo é o STB do ISP (set-top boxes, como caixas de cabo, mas usando IPTV sobre Ethernet). Estes enviam um pedido DHCP que, quando recebido pelo gateway ISP, é respondido com um IP interno (10.x.y.z) em vez de um WAN. O portal de IPTV a que esses dispositivos tentam se conectar é acessível somente a partir do IP interno.

Então, o que eu preciso fazer efetivamente é fazer com que meu gateway se comporte como um switch (bridge?) para dispositivos com determinados endereços MAC.

Suponho que precisaria fazer o seguinte:

  • Adicione regras iptables para copiar diretamente pacotes com endereços de origem que correspondem a MACs de STBs da LAN para a interface WAN
  • Adicione regras de iptables para copiar diretamente os pacotes com endereços de destino que correspondem aos MACs dos STBs da WAN para a interface da LAN (ou seja, o oposto do acima)
  • Verifique se o servidor DHCP do gateway não responde às solicitações DHCP dos STBs
  • Pacotes isentos de MACs dos STBs do NAT?
  • Preciso me preocupar com solicitações de ARP?
por Vladimir Panteleev 11.03.2017 / 00:08

1 resposta

3

Para responder à pergunta como foi dito, recebi alguns conselhos de um guru da rede de amigos para fazer a ponte entre as interfaces de LAN e WAN e, em seguida, use ebtables para filtrar o que será interligado:

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

No entanto, neste caso, descobriu-se que o switch ISP está fazendo a marcação VLAN baseada em porta (uma VLAN para a porta PC e outra VLAN para as portas STB).

Portanto, para se livrar do roteador do ISP, eu precisava:

  1. Configure as duas VLANs na NIC WAN do gateway
  2. Mover a configuração do IP da WAN da NIC para a WAN VLAN (incluindo o NAT)
  3. Bloqueie os endereços MAC dos STBs do servidor DHCP do meu gateway
  4. Conecte a VLAN interna do ISP à minha LAN
  5. (Opcional) Adicione regras de firewall para evitar que os pacotes da LAN vazem para a VLAN do ISP.

Isso funciona porque o servidor DHCP do ISP já responde apenas às solicitações DHCP dos STBs, portanto, colocá-los na lista negra nos resultados do gateway faz com que todas as respostas DHCP sejam respondidas pelo gateway ou pelo servidor DHCP do ISP. Se estiver usando dnsmasq , a lista negra pode ser feita usando, e. dhcp-host=01:23:45:*:*:*,ignore em /etc/dnsmasq.conf .

Tudo o mais pode ser feito usando os arquivos de configuração systemd-networkd: - Criar arquivos .netdev para VLANs - Adicione-os (como VLAN entries) ao arquivo .network correspondente na WAN NIC - Crie arquivos .network para as VLANs - Criar um arquivo .netdev para a ponte LAN / STB - Adicione o STB VLAN e o LAN NIC à ponte

Aqui está um conjunto completo de exemplos de arquivos de configuração systemd-networkd:

  • /etc/systemd/network/isp-link.network - Configuração de rede para a NIC WAN:

    Aqui apenas configuramos as VLANs. Certifique-se de alterar os IDs de VLAN para o que o ISP usa. Este exemplo usa 1234 para a WAN VLAN e 56 para a interna (IPTV).

    [Match]
    Name=eno1
    
    [Network]
    VLAN=eno1.1234
    VLAN=eno1.56
    
  • /etc/systemd/network/eno1.1234.netdev - WAN VLAN:

    [NetDev]
    Name=eno1.1234
    Kind=vlan
    
    [VLAN]
    Id=1234
    
  • /etc/systemd/network/eno1.56.netdev - VLAN interna do ISP para IPTV:

    [NetDev]
    Name=eno1.56
    Kind=vlan
    
    [VLAN]
    Id=56
    
  • /etc/systemd/network/home-bridge.netdev - O dispositivo de ponte ISP-VLAN / home-LAN:

    [NetDev]
    Name=br0
    Kind=bridge
    
  • /etc/systemd/network/home-bridge.network - A rede da referida ponte:

    Certifique-se de não ativar o servidor DHCP aqui. Como o systemd-networkd não permite configurar uma lista negra de MACs para ignorar, você precisará usar outro servidor DHCP (por exemplo, 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 - Arquivo de rede para o NIC da LAN:

    [Match]
    Name=enp9s0
    
    [Network]
    Bridge=br0
    
  • /etc/systemd/network/isp-vlan-wan.network - Configuração de WAN do seu gateway:

    Isso usa o DHCP - se você tiver uma configuração estática, altere isso para Address / Gateway / DNS settings.

    [Match]
    Name=eno1.1234
    
    [Network]
    IPForward=yes
    DHCP=yes
    
  • /etc/systemd/network/isp-vlan-internal.network - O arquivo de rede para a VLAN interna:

    [Match]
    Name=eno1.56
    
    [Network]
    Bridge=br0
    
  • /etc/dnsmasq.conf - configuração do servidor 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
    
por 12.03.2017 / 16:13