Освобождение некоторых устройств от NAT

Чтобы найти точку, вы должны либо убрать ее, либо включить в квадратные скобки. Чтобы исключить начальный пробел, просто не добавляйте его в regex вообще (при этом вы рискуете выбрать текст после недопустимого символа, отличного от пробела). Наконец, нет необходимости включать выделение цифр более одного раза, если вы используете + (т.е. хотя бы одно совпадение) вместо * (ноль или более совпадений), за которым следует указанное совпадение:

array=nslookup -q=srv SOME_ADDRESS | grep -o '[a-z0-9.-]\+\.$'

Обратите внимание, что приведенный выше regex исключает символы с заглавной буквы и подчеркивания. Если они вам нужны, вы можете использовать [:alnum:], а также допустимые символы.

array=nslookup -q=srv SOME_ADDRESS | grep -o '[[:alnum:]_.-]\+\.$'
3
11.03.2017, 01:18
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

Однако в данном случае оказалось, что коммутатор провайдера делает тегирование VLAN на основе портов (один VLAN для порта ПК и другой VLAN для портов STB).

Поэтому, чтобы избавиться от маршрутизатора провайдера, мне нужно:

  1. Настроить две VLAN на сетевой карте WAN шлюза
  2. Перенести конфигурацию IP WAN с сетевой карты в WAN VLAN (включая NAT)
  3. Занести MAC-адреса STB в черный список DHCP-сервера шлюза
  4. Установить мост между внутренней VLAN провайдера и моей LAN
  5. (необязательно) Добавить правила брандмауэра, чтобы избежать утечки пакетов LAN в VLAN провайдера.

Это работает, потому что DHCP-сервер провайдера уже отвечает только на DHCP-запросы STB, поэтому внесение их в черный список на шлюзе приводит к тому, что на все DHCP-ответы отвечает либо шлюз, либо DHCP-сервер провайдера. При использовании dnsmasq, черный список может быть составлен, например, с помощью dhcp-host=01:23:45:*:*:*:*,ignore в /etc/dnsmasq.conf.

Все остальное можно сделать с помощью конфигурационных файлов systemd-networkd: - Создайте файлы .netdev для виртуальных локальных сетей. - Добавьте их (как записи VLAN) в файл .network, соответствующий сетевой карте WAN. - Создайте файлы .network для сетей VLAN - Создайте файл .netdev для моста LAN/STB. - Добавьте VLAN STB и сетевую карту LAN в мост


Вот полный пример набора конфигурационных файлов systemd-networkd:

  • /etc/systemd/network/isp-link.network - Конфигурация сети для сетевой карты WAN:

    Здесь мы просто настраиваем VLAN. Обязательно измените идентификаторы VLAN на те, которые использует провайдер. В данном примере используется 1234 для WAN VLAN и 56 для внутренней (IPTV).

    [Match]
    Имя=eno1
    
    [Сеть]
    VLAN=eno1.1234
    VLAN=eno1.56
    
  • /etc/systemd/network/eno1.1234.netdev - WAN VLAN:

    [NetDev]
    Имя=eno1.1234
    Тип=vlan
    
    [VLAN]
    Id=1234
    
  • /etc/systemd/network/eno1.56.netdev - Внутренняя VLAN провайдера для IPTV:

    [NetDev]
    Имя=eno1.56
    Тип=vlan
    
    [VLAN]
    Id=56
    
  • /etc/systemd/network/home-bridge.netdev - Устройство моста ISP-VLAN/home-LAN:

    [NetDev]
    Имя=br0
    Тип=мост
    
  • /etc/systemd/network/home-bridge.network - Сеть для указанного моста:

    Убедитесь, что здесь не включен DHCP-сервер. Поскольку systemd-networkd не позволяет настраивать черный список игнорируемых MAC, вам придется использовать другой DHCP-сервер (например, dnsmasq).

    [Match]
    Имя=br0
    
    [Сеть]
    Address=192.168.0.1/24
    IPForward=да
    IPMasquerade=да
    DHCP=нет
    DHCPServer=нет
    
  • /etc/systemd/network/home-lan.network - Сетевой файл для сетевой карты LAN:

    [Match]
    Имя=enp9s0
    
    [Сеть]
    Bridge=br0
    
  • /etc/systemd/network/isp-vlan-wan.network - Конфигурация WAN вашего шлюза:

    Здесь используется DHCP - если у вас статическая конфигурация, измените это на Адрес/Шлюз/DNS настройки.

    [Match]
    Имя=eno1.1234
    
    [Сеть]
    IPForward=yes
    DHCP=да
    
  • /etc/systemd/network/isp-vlan-internal.network - Файл сети для внутренней VLAN:

    [Match]
    Имя=eno1.56
    
    [Сеть]
    Bridge=br0
    
  • /etc/dnsmasq.conf - Конфигурация DHCP сервера:

    # Отключить DNS сервер - будет обрабатываться systemd-networkd
    порт=0
    
    # Включите и настройте DHCP-сервер
    dhcp-range=192.168.0.129,192.168.0.254,12h
    
    # Укажите, какие интерфейсы прослушивать
    listen-address=127.0.0.1
    listen-address=::1
    listen-address=192.168.0.1
    
    # Игнорировать запросы DHCP от приставок
    dhcp-host=01:23:45:*:*:*,ignore
    
2
27.01.2020, 21:25

Теги

Похожие вопросы