Маршрутизация части траффика на VPN

Knoppix

Модераторы: Warderer, Модераторы разделов

AlexShap2025
Сообщения: 6
ОС: debian 12

Маршрутизация части траффика на VPN

Сообщение AlexShap2025 »

Добрый день, народ.
Прошу совета.

Есть такая задача. У меня локальная сеть 192.168.0.0/24. Есть роутер он же шлюз в интернет - 192,168,0,1.
Есть в сети комп с Debian 12. На нем интерфейсы enp3s0 (192.168.0.10) и подключение к vpn tun0 (10.8.0.2 со шлюзом 10,8,0,1). На нем же развернул dnsmasq.
У клиентов в качестве шлюза и днс указываю 192,168,0,10 .

Необходимо траффик до некоторых хостов заворачивать на vpn. Хосты прописываю в ipset.

Вот написал скрипт. Идея такая: Маркирую определенные пакеты (для определенных хостов) приходящие на интерфейс enp3s0; Потом заворачиваю только маркированные пакеты в tun0, остальные отправляю на шлюз 192,168,0,1. Но так нечего не работает. И не пойму почему. Очень прошу помощи и совета.

Код скрипта. Так ничего не работает:

Код: Выделить всё

#!/bin/bash

# Настройки
VPN_GATE="10.8.0.1"
VPN_IFACE="tun0"
LOCAL_GW="192.168.0.1"
IPSET_NAME="vpn_sites"

# Создание ipset для хранения IP-адресов
ipset create $IPSET_NAME hash:ip
ipset add $IPSET_NAME (xx.xx.xx.xx тут мой хост)
# Настройка маркировки пакетов для трафика через VPN
iptables -t mangle -N VPN_MANGLE
iptables -t mangle -A VPN_MANGLE -m set --match-set $IPSET_NAME dst -j MARK --set-mark 1
iptables -t mangle -A VPN_MANGLE -j RETURN

# Применение маркировки к входящему трафику
iptables -t mangle -A PREROUTING -j VPN_MANGLE

# Настройка маршрутизации на основе меток
ip rule add fwmark 1 table 500
ip route add default via $VPN_GATE table 500
ip route flush cache

# Остановка маршрутизации для остального трафика
ip route add default via $LOCAL_GW

# Установка правил на iptables для принятия и маршрутизации трафика
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m mark --mark 1 -j ACCEPT

# Разрешить локальный трафик
iptables -A INPUT -i $VPN_IFACE -j ACCEPT
iptables -A INPUT -i enp3s0 -j ACCEPT
iptables -A OUTPUT -o $VPN_IFACE -j ACCEPT

iptables -t nat -A POSTROUTING -o $VPN_IFACE -m mark --mark 1 -j MASQUERADE

Но если последнюю строку меняю на
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
то весь траффик уходит на tun0.

Вот мой выводы ip route:

Код: Выделить всё

ip route
0.0.0.0/1 via 10.8.0.1 dev tun0 
default via 192.168.0.1 dev enp3s0 onlink 
10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.2 
xx.xx.xx.xx (адрес моего белого впн сервера) via 192.168.0.1 dev enp3s0 
128.0.0.0/1 via 10.8.0.1 dev tun0 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
172.18.0.0/16 dev br-f8fe3b6cfc9a proto kernel scope link src 172.18.0.1 
172.20.0.0/16 dev br-b9d7b22bfcfb proto kernel scope link src 172.20.0.1 linkdown 
192.168.0.0/24 dev enp3s0 proto kernel scope link src 192.168.0.10 

ip rule
0:	from all lookup local
32765:	from all fwmark 0x1 lookup 500
32766:	from all lookup main
32767:	from all lookup default

ip route show table 500
default via 10.8.0.1 dev tun0 

Что я делаю не так. Как разделить траффик? Может я еще какое правило должен прописать?
Очень нужная помощь. Хотя бы подсказкой. Спасибо большое за внимание.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5383
ОС: Gentoo

Re: Маршрутизация части траффика на VPN

Сообщение /dev/random »

Одна из проблем. Возможно, далеко не единственная.
У вас в таблице main написано:

Shell

ip route
0.0.0.0/1 via 10.8.0.1 dev tun0
...
128.0.0.0/1 via 10.8.0.1 dev tun0
...
т.е. заворачивать весь трафик на tun0. Первая из этих строк заворачивает адреса 0.*.*.*-127.*.*.*, а вторая - все остальные.
Пока не смотрел, есть ли другие ошибки.
Спасибо сказали:
AlexShap2025
Сообщения: 6
ОС: debian 12

Re: Маршрутизация части траффика на VPN

Сообщение AlexShap2025 »

Эти маршруты сформированы атоматически при подключении к vpn. Я пробовал удалять 0,0,0,0/1 маршрут, все перестает работать. Попробую удалить еще 128,0,0,0/1 маршрут.
Спасибо сказали:
AlexShap2025
Сообщения: 6
ОС: debian 12

Re: Маршрутизация части траффика на VPN

Сообщение AlexShap2025 »

Удалил оба этих маршрута:

Код: Выделить всё

0.0.0.0/1 via 10.8.0.1 dev tun0
128.0.0.0/1 via 10.8.0.1 dev tun0
Трассировка пошла:
Траффик разделяется, но сайты с vpn не работают.
Я так понимаю возвращаемые пакеты теряют маркировку и дропятся? Или я ошибаюсь?
Добавлено (20:08):
Уже попробовал добавить правила:

Код: Выделить всё

iptables -A FORWARD -i tun0 -o enp3s0 -j ACCEPT
iptables -A FORWARD -i enp3s0 -o tun0 -j ACCEPT
Не помогло
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5383
ОС: Gentoo

Re: Маршрутизация части траффика на VPN

Сообщение /dev/random »

У вас форвардинг для этих интерфейсов включён (через sysctl)?
И покажите окончательные правила iptables (через iptables-save).
И послушайте tun0 через tcpdump. Туда пакеты уходят? А обратно приходят?
Спасибо сказали:
AlexShap2025
Сообщения: 6
ОС: debian 12

Re: Маршрутизация части траффика на VPN

Сообщение AlexShap2025 »

iptables-save:

Код: Выделить всё

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:VPN_MANGLE - [0:0]
-A PREROUTING -j VPN_MANGLE
-A VPN_MANGLE -m set --match-set vpn_sites dst -j MARK --set-xmark 0x1/0xffffffff
-A VPN_MANGLE -j RETURN
COMMIT
*filter
:INPUT ACCEPT [19080:25357145]
:FORWARD ACCEPT [1316:457701]
:OUTPUT ACCEPT [16859:1489063]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
:ufw-after-forward - [0:0]
:ufw-after-input - [0:0]
:ufw-after-logging-forward - [0:0]
:ufw-after-logging-input - [0:0]
:ufw-after-logging-output - [0:0]
:ufw-after-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-before-input - [0:0]
:ufw-before-logging-forward - [0:0]
:ufw-before-logging-input - [0:0]
:ufw-before-logging-output - [0:0]
:ufw-before-output - [0:0]
:ufw-reject-forward - [0:0]
:ufw-reject-input - [0:0]
:ufw-reject-output - [0:0]
:ufw-track-forward - [0:0]
:ufw-track-input - [0:0]
:ufw-track-output - [0:0]
-A INPUT -p tcp -m tcp --dport 8082 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8000 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j ufw-before-logging-input
-A INPUT -j ufw-before-input
-A INPUT -j ufw-after-input
-A INPUT -j ufw-after-logging-input
-A INPUT -j ufw-reject-input
-A INPUT -j ufw-track-input
-A INPUT -i tun0 -j ACCEPT
-A INPUT -i enp3s0 -j ACCEPT
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o br-f8fe3b6cfc9a -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-f8fe3b6cfc9a -j DOCKER
-A FORWARD -i br-f8fe3b6cfc9a ! -o br-f8fe3b6cfc9a -j ACCEPT
-A FORWARD -i br-f8fe3b6cfc9a -o br-f8fe3b6cfc9a -j ACCEPT
-A FORWARD -o br-b9d7b22bfcfb -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-b9d7b22bfcfb -j DOCKER
-A FORWARD -i br-b9d7b22bfcfb ! -o br-b9d7b22bfcfb -j ACCEPT
-A FORWARD -i br-b9d7b22bfcfb -o br-b9d7b22bfcfb -j ACCEPT
-A FORWARD -j ufw-before-logging-forward
-A FORWARD -j ufw-before-forward
-A FORWARD -j ufw-after-forward
-A FORWARD -j ufw-after-logging-forward
-A FORWARD -j ufw-reject-forward
-A FORWARD -j ufw-track-forward
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m mark --mark 0x1 -j ACCEPT
-A FORWARD -i enp3s0 -o tun0 -j ACCEPT
-A FORWARD -i tun0 -j ACCEPT
-A OUTPUT -j ufw-before-logging-output
-A OUTPUT -j ufw-before-output
-A OUTPUT -j ufw-after-output
-A OUTPUT -j ufw-after-logging-output
-A OUTPUT -j ufw-reject-output
-A OUTPUT -j ufw-track-output
-A OUTPUT -o tun0 -j ACCEPT
-A DOCKER -d 172.18.0.4/32 ! -i br-f8fe3b6cfc9a -o br-f8fe3b6cfc9a -p tcp -m tcp --dport 8082 -j ACCEPT
-A DOCKER -d 172.18.0.4/32 ! -i br-f8fe3b6cfc9a -o br-f8fe3b6cfc9a -p tcp -m tcp --dport 80 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-b9d7b22bfcfb ! -o br-b9d7b22bfcfb -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-f8fe3b6cfc9a ! -o br-f8fe3b6cfc9a -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-b9d7b22bfcfb -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-f8fe3b6cfc9a -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
COMMIT
*nat
:PREROUTING ACCEPT [418:56286]
:INPUT ACCEPT [230:21782]
:OUTPUT ACCEPT [269:25078]
:POSTROUTING ACCEPT [204:25768]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.18.0.0/16 ! -o br-f8fe3b6cfc9a -j MASQUERADE
-A POSTROUTING -s 172.20.0.0/16 ! -o br-b9d7b22bfcfb -j MASQUERADE
-A POSTROUTING -s 192.168.0.0/24 -o enp3s0 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 9200 -j MASQUERADE
-A POSTROUTING -s 172.18.0.4/32 -d 172.18.0.4/32 -p tcp -m tcp --dport 80 -j MASQUERADE
-A POSTROUTING -s 172.18.0.4/32 -d 172.18.0.4/32 -p tcp -m tcp --dport 8082 -j MASQUERADE
-A POSTROUTING -o tun0 -m mark --mark 0x1 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
-A DOCKER -i br-b9d7b22bfcfb -j RETURN
-A DOCKER -i br-f8fe3b6cfc9a -j RETURN
-A DOCKER ! -i br-f8fe3b6cfc9a -p tcp -m tcp --dport 8082 -j DNAT --to-destination 172.18.0.4:8082
-A DOCKER ! -i br-f8fe3b6cfc9a -p tcp -m tcp --dport 8000 -j DNAT --to-destination 172.18.0.4:80
COMMIT
Форвардинг включен:

Код: Выделить всё

sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
А как правильно прослушать tcpdumpom?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5383
ОС: Gentoo

Re: Маршрутизация части траффика на VPN

Сообщение /dev/random »

AlexShap2025 писал(а):
15.02.2025 21:35
А как правильно прослушать tcpdumpom?
tcpdump -n -i tun0 и попробуйте обратиться из локалки к одному из адресов, который вы форвардите.

На выходе должны быть пакеты между вашим 10.8.0.2 и внешними адресами из упомянутого ipset, в обе стороны, но не должно быть никаких других, особенно между адресами из локалки и внешними адресами. Если это не так, напишите, что именно не так.
Добавлено (22:06):
AlexShap2025 писал(а):
15.02.2025 21:35
-A POSTROUTING -o tun0 -m mark --mark 0x1 -j MASQUERADE
И "-m mark --mark 0x1" тут стоит убрать.
Спасибо сказали:
AlexShap2025
Сообщения: 6
ОС: debian 12

Re: Маршрутизация части траффика на VPN

Сообщение AlexShap2025 »

Убрал -m mark --mark 0x1 и все заработало. Большое спасибо за помощь.

Но теперь не пойму почему приходящие запросы с внешки со шлюза 192,168,0,1 не получают ответы по портам, например на 6075. Порт у меня открыт, все работало, до подключения к VPN. Я так понимаю это из-за маршрутов. На что обратить внимание.
Спасибо сказали:
AlexShap2025
Сообщения: 6
ОС: debian 12

Re: Маршрутизация части траффика на VPN

Сообщение AlexShap2025 »

AlexShap2025 писал(а):
17.02.2025 17:53
Но теперь не пойму почему приходящие запросы с внешки со шлюза 192,168,0,1 не получают ответы по портам, например на 6075. Порт у меня открыт, все работало, до подключения к VPN. Я так понимаю это из-за маршрутов. На что обратить внимание.
Все работает. Нашел проблемный маршрут у себя, который перенаправлял траффик на внутренний сервис на ВПН. Удалил его и все заработало.
Спасибо за помощь.
Спасибо сказали: