Итак, мои настройки следующие. У меня есть две домашние сети и сервер, стоящий в другом месте. Я использую OpenVPN в качестве сервера, на сервере, чтобы соединить две домашние сети в одну большую сеть. Поскольку я хотел, чтобы все работало прозрачно для всех пользователей в домашних сетях, это уровень 2. Кроме того, ящики в домашних сетях, на которых работают клиенты OpenVPN, также используют DHCP-сервер, поэтому я могу соответствующим образом настроить пользователей.

Я использую подсеть 192.168.16.1/22 для всей сети, но настраиваю пулы DHCP на 192.168.16.1/23 и 192.168.18.1/23. Просто чтобы иметь возможность отличить его легче. Однако DHCP-серверы объявляют маску сети 255.255.255.252.

Шлюзы - 192.168.16.1 и 192.168.18.1 соответственно. Поля OpenVPN/DHCP: 192.168.17.1 и 192.168.19.1.

Оба блока OpenVPN имеют один сетевой адаптер eth0, подключенный к их локальной сети, через который они достигают своего шлюза. У них есть адаптер, созданный OpenVPN tap0. А также виртуальный мостовой адаптер br0. eth0 и tap0 порабощены br0, чтобы соединить локальную сеть и VPN.

Базовая настройка работает как шарм. Однако одной из проблем является DHCP. Поскольку это мост уровня 2, также передается DHCP, что приводит к тому, что DHCP-сервер для удаленной домашней сети отвечает на запросы пользователей в локальной домашней сети.

Я попытался сделать это на сервере OpenVPN. Как считается, это лучшее место. Однако, похоже, я не в состоянии. К сожалению, я не знаю, если это моя вина (скорее всего), или что-то еще.

Я пытаюсь сделать это с помощью NFT. Я использую (почти) последнюю версию Arch Linux (в настоящее время версия ядра 4.8.10).

Моя текущая конфигурация для nft, адаптированная из [1] и [2], поскольку на nft мало что можно найти, выглядит следующим образом.

# nft list ruleset
table bridge filter {
    chain input {
        type filter hook input priority -200; policy accept;
        iifname "tap0" udp sport bootps-bootpc counter packets 34 bytes  11569 drop
        iifname "tap0" udp dport bootps-bootpc counter packets 0 bytes 0 drop
    }

    chain forward {
        type filter hook forward priority -200; policy accept;
        iifname "tap0" udp sport bootps-bootpc counter packets 34 bytes 11569 drop
        iifname "tap0" udp dport bootps-bootpc counter packets 0 bytes 0 drop
    }

    chain output {
        type filter hook output priority -200; policy accept;
    }
}

Как вы можете видеть, некоторые правила на самом деле сработали. Тем не менее, правила всегда срабатывают в одно и то же время, поэтому я предполагаю, что один и тот же пакет, а также пакет, обнаруживаемый в удаленной домашней сети (определяется по размеру пакета и относится только к пакету, связанному с DHCP).

Изменить: пакеты, которые проходят, кажется, широковещательные. Следовательно, они, вероятно, вызывают цепочку INPUT и FORWARD.

Я перепробовал множество других правил, частично используя iptables, иногда используя пре- или пост-маршрутный хук таблицы inet, но, похоже, ничто не работает неправильно.

Так что я совершенно не понимаю, в чем проблема. Или что не так с моей настройкой или мышлением.

[1] http://www.linksysinfo.org/index.php?threads/block-dhcp-over-bridged-vpn.68790/#post-231073

[2] http://www.dd-wrt.com/wiki/index.php/OpenVPN_-_Site-to-Site_Bridged_VPN_Between_Two_Routers

0