LINUX.ORG.RU
ФорумAdmin

Выборочный роутинг через vpn (dnsmasq)

 , , ,


0

2

Всем привет :)

Подскажите, что я делаю не так :)

Идея состоит в том, чтобы только сайты из списка использовали 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

Если кто знает, подскажите, что с этим можно сделать, где ошибка?



Последнее исправление: CoolAller (всего исправлений: 19)

Ответ на: комментарий от ValdikSS

При добавлении 127.0.0.1 ничего не изменяется, как и при использовании встроенного dnsmasq в Network Mananger. Опции в dnsmasq.conf не дают результата:

no-resolv
listen-address=127.0.0.1
CoolAller
() автор топика
Последнее исправление: CoolAller (всего исправлений: 1)
Ответ на: комментарий от anc

ss -a | grep 127.0.0.1

ss -a | grep 127.0.0.1 
tcp     LISTEN   0        5     127.0.0.1:ipp          0.0.0.0:*                  
tcp     LISTEN   0        128   127.0.0.1:postgresql   0.0.0.0:*                  
tcp     LISTEN   0        20    127.0.0.1:smtp         0.0.0.0:*
netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:139             0.0.0.0:*               LISTEN      1791/smbd           
tcp        0      0 0.0.0.0:53              0.0.0.0:*               LISTEN      21424/dnsmasq       
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      19514/cupsd         
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      705/postgres        
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1901/exim4          
tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN      1791/smbd           
tcp6       0      0 :::139                  :::*                    LISTEN      1791/smbd           
tcp6       0      0 :::53                   :::*                    LISTEN      21424/dnsmasq       
tcp6       0      0 ::1:631                 :::*                    LISTEN      19514/cupsd         
tcp6       0      0 ::1:5432                :::*                    LISTEN      705/postgres        
tcp6       0      0 ::1:25                  :::*                    LISTEN      1901/exim4          
tcp6       0      0 :::445                  :::*                    LISTEN      1791/smbd           
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           565/avahi-daemon: r 
udp        0      0 0.0.0.0:1701            0.0.0.0:*                           1585/xl2tpd         
udp        0      0 0.0.0.0:43065           0.0.0.0:*                           4323/xl2tpd         
udp        0      0 0.0.0.0:49149           0.0.0.0:*                           565/avahi-daemon: r 
udp        0      0 0.0.0.0:53              0.0.0.0:*                           21424/dnsmasq       
udp        0      0 0.0.0.0:68              0.0.0.0:*                           885/dhclient        
udp        0      0 192.168.0.255:137       0.0.0.0:*                           1533/nmbd           
udp        0      0 192.168.0.104:137       0.0.0.0:*                           1533/nmbd           
udp        0      0 0.0.0.0:137             0.0.0.0:*                           1533/nmbd           
udp        0      0 192.168.0.255:138       0.0.0.0:*                           1533/nmbd           
udp        0      0 192.168.0.104:138       0.0.0.0:*                           1533/nmbd           
udp        0      0 0.0.0.0:138             0.0.0.0:*                           1533/nmbd           
udp        0      0 0.0.0.0:4500            0.0.0.0:*                           4214/charon         
udp        0      0 0.0.0.0:500             0.0.0.0:*                           4214/charon         
udp        0      0 0.0.0.0:631             0.0.0.0:*                           19515/cups-browsed  
udp        0      0 0.0.0.0:21116           0.0.0.0:*                           32167/rudesktop     
udp6       0      0 :::5353                 :::*                                565/avahi-daemon: r 
udp6       0      0 :::52436                :::*                                565/avahi-daemon: r 
udp6       0      0 :::53                   :::*                                21424/dnsmasq       
udp6       0      0 :::4500                 :::*                                4214/charon         
udp6       0      0 :::500                  :::*                                4214/charon
dig play.google.com

; <<>> DiG 9.16.27-Debian <<>> play.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58814
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;play.google.com.		IN	A

;; ANSWER SECTION:
play.google.com.	277	IN	A	142.250.74.46

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed May 31 01:06:23 MSK 2023
;; MSG SIZE  rcvd: 60
CoolAller
() автор топика
Последнее исправление: CoolAller (всего исправлений: 4)