Чтобы найти точку, вы должны либо убрать ее, либо включить в квадратные скобки. Чтобы исключить начальный пробел, просто не добавляйте его в regex вообще (при этом вы рискуете выбрать текст после недопустимого символа, отличного от пробела). Наконец, нет необходимости включать выделение цифр более одного раза, если вы используете +
(т.е. хотя бы одно совпадение) вместо *
(ноль или более совпадений), за которым следует указанное совпадение:
array=nslookup -q=srv SOME_ADDRESS | grep -o '[a-z0-9.-]\+\.$'
Обратите внимание, что приведенный выше regex исключает символы с заглавной буквы и подчеркивания. Если они вам нужны, вы можете использовать [:alnum:]
, а также допустимые символы.
array=nslookup -q=srv SOME_ADDRESS | grep -o '[[:alnum:]_.-]\+\.$'
Чтобы ответить на поставленный вопрос, я получил совет от знакомого сетевого гуру соединить 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).
Поэтому, чтобы избавиться от маршрутизатора провайдера, мне нужно:
Это работает, потому что 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