В конце концов я решил сесть и сделать то, что давно было в моем списке дел: заставить мою виртуальную сеть действительно работать.
Проще говоря: у меня есть чистое виртуальное мостовое устройство (созданное ifcfg-script при загрузке), к которому libvirtd подключает гостевые os: ses по мере их появления. Также на мосту работает dnsmasq-dhcp. Поскольку мост виртуальный, доступа в Интернет нет, и устройство openvpn tun0 нельзя напрямую добавить к мосту. Теперь моя цель - перенаправить весь исходящий трафик на интерфейс tun0. Казалось бы, легкая работа с прямыми правилами firewalld, но я потратил на нее один день.
Внутренний трафик на мосту работает нормально, включая DHCP, но не смог заставить исходящий трафик работать вообще. Проблема не в таблицах маршрутизации (использование iproute2 для второй таблицы маршрутизации для tun0, проверка с помощью curl --interface ... для получения внешнего ip-адреса tun0) или самого соединения openvpn.
Без лишних слов, вот мои файлы конфигурации:
ifcfg-tun0:
DEVICE=tun0
BOOTPROTO=none
ONBOOT=no
TUNNEL=’tun’
ifcfg-virtbr10:
DEVICE=virbr10
NAME=virbr10
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Bridge
DELAY=2
STP=on
IPADDR=10.8.3.1
NETMASK=255.255.255.0
IPV6INIT=no
ZONE=virbr10
/etc/firewalld/direct.xml:
<?xml version="1.0" encoding="utf-8"?>
<direct>
<rule priority="0" table="nat" ipv="ipv4" chain="POSTROUTING">-o tun0 -j MASQUERADE</rule>
<rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-o tun0 -i virbr10 -m state --state RELATED,ESTABLISHED -j ACCEPT</rule>
<rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-o virbr10 -i tun0</rule>
</direct>
и некоторые команды:
брандмауэр-cmd --get-активные-зоны:
home
interfaces: enp2s0 br0
virbr10
interfaces: virbr10
purevpn
interfaces: tun0
firewall-cmd --zone = purevpn --query-masquerade:
yes
Все службы запущены и работают без ошибок, и я просматривал эти файлы в течение нескольких часов, не замечая никаких явных ошибок. Любая помощь приветствуется. Есть одна вещь, с которой я не уверен, что делать, и это то, что команда "firewall-cmd --permanent --direct --get-all-rules" ничего не возвращает. Хотя я не уверен, что это так.
Да, и система - это CentOS 7, а vpn - это openvpn с некоторыми настраиваемыми скриптами для заполнения второй таблицы маршрутизации.
edit: забыл упомянуть, что маршрутизация включена в /etc/sysctl.conf.
edit2: Было указано, что я на самом деле не задавал никаких вопросов ... Так что кто-нибудь заметил какую-либо (менее) очевидную ошибку, которую я сделал, или есть какие-либо идеи, как заставить эту сеть работать так, как задумано.
Через какое-то время мне удалось это исправить самостоятельно. Моя конфигурация сама по себе не была неправильной (хотя я переписал прямые правила), но не была полной. Я понял, что хотя мой виртуальный мост может пересылать пакеты на интерфейс tun0, он этого не делает, потому что маршрут по умолчанию отсутствует. Т.е. он не знает, что может отправлять пакеты в tun0. Просто исправлено добавлением третьей таблицы маршрутизации для интерфейса virbr10 и изменением сценария openvpn route-up-up, чтобы добавить маршрут по умолчанию в эту таблицу после установления соединения. Это в сочетании с пересмотренными правилами пересылки firewalld, казалось, помогло.