IPtables является линейным и читает правила сверху вниз, пока не достигнет цели ACCEPT, REJECT или DROP, а затем прекращает чтение правил. В вашем случае вы хотите иметь iptables -I DOCKER-USER -j DROP
как самое последнее правило в вашей цепочке, иначе каждый пакет будет отброшен. Кроме того, нет необходимости в правиле RETURN в конце, потому что IPtables перестанет читать правила, как только дойдет до правила DROP прямо над ним. Эти правила IPtables с tun0 выглядят нормально, но убедитесь, что у вас также есть эти правила:
iptables -t filter -I INPUT 1 -i tun0 -j DOCKER-USER
iptables -t filter -I ВЫВОД 2 -o tun0 -j DOCKER-USER
Для хорошей практики убедитесь, что вы принимаете весь петлевой трафик, который никогда не достигнет Интернета и не покинет машину:
iptables -t фильтр -I ВВОД 3 -i tun0 -j ПРИНЯТЬ
Давайте рассмотрим ваши требования один за другим:
- Любые службы, назначенные этому узлу, используют исключительно VPN-соединение.
Вы бы не использовали IPtables для этого. Запустите эти команды на серверах:
IP-маршрут добавить по умолчанию через ${LOCAL_VPN_IP}
Я думаю, что OpenVPN обычно использует 10.8.0.0/16, поэтому шлюз по умолчанию, вероятно, будет 10.8.0.1 или что-то в этом роде. IProute2 (команда ip) встроен в ядро, как и IPtables.
- Отсутствие утечек (например, DNS или другого трафика)
Сначала вы должны перенаправить весь трафик через VPN, поместив это в конфигурацию вашего сервера OpenVPN:
нажмите "перенаправление-шлюз автолокальный"
Это заставляет клиентов направлять весь свой трафик через VPN, даже DNS и тому подобное. Если сервер OpenVPN выйдет из строя, интернет перестанет работать на клиентах.
- Если VPN отключается, весь трафик сбрасывается
См. шаг 2
- Разрешить обнаружение сервисов и подключение к другим контейнерам в Swarm
Я считаю, что OpenVPN делает это по умолчанию. Я могу выполнить ping/arp от одного клиента к другим клиентам, которые находятся на сервере OpenVPN.Вы определенно должны иметь доступ к службам, которые есть на других клиентах.
Я надеюсь, что это отвечает на ваши вопросы!