Выборочный роутинг через vpn (dnsmasq)
Всем привет :)
Подскажите, что я делаю не так :)
Идея состоит в том, чтобы только сайты из списка использовали vpn соединение (ppp0), а остальные шли через физический интерфейс проводного сетевого подключения (enp3s0), куда приходит интернет с роутера.
Через интерфейс enp3s0, при помощи Network Manager, подключается vpn соединение (L2TP), в настройках указываю не использовать в качестве соединения по умолчанию (never be used as the default network connection), в результате чего создается вирутальный интерфейс ppp0.
Далее делаю так:
Добавляю в файл /etc/NetworkManager/NetworkManager.conf строку dns=none для того чтобы Network Manager не изменял resolv.conf:
[main]
plugins=ifupdown,keyfile
dns=none
Редактирую файл конфигурации dnsmasq /etc/dnsmasq.conf. Указываю список доменов для занесения соответствующих им IP адресов в ipset list с именем VIAVPN
ipset=/rutracker.org/nnmclub.to/VIAVPN
Создаю список VIAVPN:
ipset create VIAVPN hash:ip
Создаю правило iptables, которое будет маркировать пакеты, к IP адресам доменов (то есть с пометкой VIAVPN), маркером 1
iptables -I PREROUTING -t mangle -m set --match-set VIAVPN dst -j MARK --set-mark 1
В файл /etc/iproute2/rt_tables создаю таблицу vpnrouting:
252 vpnrouting
Добавляю маршрут по умолчанию (default gateway) в созданную таблицу:
ip route add table vpnrouting default dev ppp0
Вывожу список всех правил поиска маршрута для наглядности:
ip rule show
0: from all lookup local
220: from all lookup 220
32766: from all lookup main
32767: from all lookup default
Задача указать правило поиска до таблицы main. Указываю приоритет явным образом, например, 100:
ip rule add prio 100 fwmark 1 lookup vpnrouting
Вывожу список всех правил поиска маршрута для проверки:
ip rule show
0: from all lookup local
100: from all fwmark 0x1 lookup vpnrouting
220: from all lookup 220
32766: from all lookup main
32767: from all lookup default
Проверяю состояние rp_filter:
cat /proc/sys/net/ipv4/conf/ppp0/rp_filter
0
Для нормальной работы, результат должен быть либо 0, либо 2.
Делаю проверки:
Проверяю, что ipset-набор создан, но по какой-то причине не заполняется, это можно увидеть в выводе:
ipset --list
Name: VIAVPN
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 88
References: 0
Number of entries: 0
Members:
Проверяю, что отработало правило файервола, помечающее пакеты:
iptables-save | grep VIAVPN
-A PREROUTING -m set --match-set VIAVPN dst -j MARK --set-xmark 0x1/0xffffffff
Проверяю, что существует таблица роутинга для помеченных пакетов:
ip rule list | grep vpnrouting
100: from all fwmark 0x1 lookup vpnrouting
Проверяю, что в нужной таблице пакеты отправляются в правильный сетевой интерфейс, соответвующий VPN-соединению:
ip route list table vpnrouting
default dev ppp0 scope link
Проверяю содержимое файла resolv.conf:
cat /etc/resolv.conf
nameserver 127.0.0.1
nameserver 8.8.8.8
Проверяю статус сервиса dnsmasq:
systemctl status dnsmasq.service
● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2023-05-31 15:31:58 MSK; 6min ago
Process: 638 ExecStartPre=/usr/sbin/dnsmasq --test (code=exited, status=0/SUCCESS)
Process: 649 ExecStart=/etc/init.d/dnsmasq systemd-exec (code=exited, status=0/SUCCESS)
Process: 666 ExecStartPost=/etc/init.d/dnsmasq systemd-start-resolvconf (code=exited, status=0/SUC
Main PID: 665 (dnsmasq)
Tasks: 1 (limit: 4915)
Memory: 2.7M
CGroup: /system.slice/dnsmasq.service
└─665 /usr/sbin/dnsmasq -x /run/dnsmasq/dnsmasq.pid -u dnsmasq -7 /etc/dnsmasq.d,.dpkg-di
May 31 15:31:58 computer dnsmasq[665]: started, version 2.80 cachesize 150
May 31 15:31:58 computer dnsmasq[665]: DNS service limited to local subnets
May 31 15:31:58 computer dnsmasq[665]: compile time options: IPv6 GNU-getopt DBus i18n IDN DHCP DHCP
May 31 15:31:58 computer dnsmasq[665]: reading /etc/resolv.conf
May 31 15:31:58 computer dnsmasq[638]: dnsmasq: syntax check OK.
May 31 15:31:58 computer dnsmasq[665]: ignoring nameserver 127.0.0.1 - local interface
May 31 15:31:58 computer dnsmasq[665]: using nameserver 8.8.8.8#53
May 31 15:31:58 computer dnsmasq[665]: read /etc/hosts - 6 addresses
May 31 15:31:58 computer systemd[1]: Starting dnsmasq - A lightweight DHCP and caching DNS server...
May 31 15:31:58 computer systemd[1]: Started dnsmasq - A lightweight DHCP and caching DNS server.
Вывод команды: # ss -lp ‘sport = :domain’
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 0.0.0.0:domain 0.0.0.0:* users:(("dnsmasq",pid=22373,fd=5))
udp UNCONN 0 0 [::]:domain [::]:* users:(("dnsmasq",pid=22373,fd=7))
tcp LISTEN 0 32 0.0.0.0:domain 0.0.0.0:* users:(("dnsmasq",pid=22373,fd=6))
tcp LISTEN 0 32 [::]:domain [::]:* users:(("dnsmasq",pid=22373,fd=8))
uname -a
Linux computer 4.19.0-21-amd64 #1 SMP Debian 4.19.249-2 (2022-06-30) x86_64 GNU/Linux
Вывод route -n показывает какую-то хрень:
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 100 0 0 enp3s0
1.0.0.1 0.0.0.0 255.255.255.255 UH 50 0 0 ppp0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 enp3s0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 enp3s0
192.168.0.1 0.0.0.0 255.255.255.255 UH 100 0 0 enp3s0
219.100.37.108 192.168.0.1 255.255.255.255 UGH 100 0 0 enp3s0
IP-адрес 219.100.37.108 в выводе утилиты соответствует шлюзу, который использовался при настройке vpn соединения. IP-адрес 192.168.0.1 это адрес роутера (шлюз)
Вывод ifconfig:
enp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.103 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::d09b:3147:64ac:2e6a prefixlen 64 scopeid 0x20<link>
ether 00:1f:c6:e2:50:2d txqueuelen 1000 (Ethernet)
RX packets 5892 bytes 3198154 (3.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6122 bytes 962733 (940.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 18
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1400
inet 10.239.17.44 netmask 255.255.255.255 destination 1.0.0.1
ppp txqueuelen 3 (Point-to-Point Protocol)
RX packets 3 bytes 54 (54.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3 bytes 54 (54.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Вывод # ip addr:
enp2s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether 00:1f:c6:e2:50:2e brd ff:ff:ff:ff:ff:ff
ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UNKNOWN group default qlen 3
link/ppp
inet 10.239.17.44 peer 1.0.0.1/32 scope global ppp0
valid_lft forever preferred_lft forever
Самое интересное, что если без всех этих настроек по маркировке пакетов просто, например, для rutracker.org сделать следующее, то сайт будет работать через vpn:
#ip route add 172.67.187.38 via 1.0.0.1 dev ppp0
#ip route add 104.21.72.173 via 1.0.0.1 dev ppp0
Если кто знает, подскажите, что с этим можно сделать, где ошибка?