На StackExchange были похожие вопросы, но ни один из ответов мне не помог, поэтому я задам собственный вопрос.
У меня есть VPN-соединение через OpenVPN. По умолчанию весь трафик перенаправляется через туннель с использованием уловки OpenVPN «два более конкретных маршрута», но я отключил это. Моя таблица маршрутизации такая:
198.144.156.141 192.168.2.1 255.255.255.255 UGH 0 0 0 eth0
10.30.92.5 0.0.0.0 255.255.255.255 UH 0 0 0 tun1
10.30.92.1 10.30.92.5 255.255.255.255 UGH 0 0 0 tun1
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 10.30.92.5 0.0.0.0 UG 0 0 0 tun1
0.0.0.0 192.168.2.1 0.0.0.0 UG 0 0 0 eth0
А конфигурация интерфейса такая:
# ifconfig
eth0 Link encap:Ethernet HWaddr XX-XX-
inet addr:192.168.2.100 Bcast:192.168.2.255 Mask:255.255.255.0
inet6 addr: fe80::211:9ff:fe8d:acbd/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:394869 errors:0 dropped:0 overruns:0 frame:0
TX packets:293489 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:388519578 (370.5 MiB) TX bytes:148817487 (141.9 MiB)
Interrupt:20 Base address:0x6f00
tun1 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.30.92.6 P-t-P:10.30.92.5 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:64 errors:0 dropped:0 overruns:0 frame:0
TX packets:67 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:9885 (9.6 KiB) TX bytes:4380 (4.2 KiB)
плюс устройство lo.
В таблице маршрутизации есть два маршрута по умолчанию: один через eth0 через мой локальный сетевой маршрутизатор (модем DSL) по адресу 192.168.2.1, а другой через tun1 через шлюз VPN. В этой конфигурации, если я подключаюсь к сайту, выбирается прямой маршрут (потому что у него меньше переходов?):
# traceroute 8.8.8.8 -n
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 192.168.2.1 0.427 ms 0.491 ms 0.610 ms
2 213.191.89.13 17.981 ms 20.137 ms 22.141 ms
3 62.109.108.48 23.681 ms 25.009 ms 26.401 ms
...
Это нормально, потому что моя цель - отправлять через туннель только трафик от определенных приложений (особенно передача, используя параметр -i / bind-address-ipv4). Чтобы проверить, может ли это вообще работать, я сначала проверяю это с помощью параметра traceroute -s:
# traceroute 8.8.8.8 -n -s 10.30.92.6
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 * * *
2 * * *
3 * * *
...
Это означает, что подключение с использованием локального адреса туннеля в качестве источника невозможно.
Что возможно (хотя только как root), так это указать исходный интерфейс:
# traceroute 8.8.8.8 -n -i tun1
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 10.30.92.1 129.337 ms 297.758 ms 297.725 ms
2 * * *
3 198.144.152.17 297.653 ms 297.652 ms 297.650 ms
...
Итак, видимо, интерфейс tun1 работает, и он является через него можно посылать пакеты.
Но выбор исходного интерфейса не реализован в моем фактическом целевом приложении (передаче), поэтому я хотел бы, чтобы выбор исходного адреса работал.
Что я делаю не так?
Редактировать: Основываясь на ответе DerfK, вот моя конфигурация OpenVPN:
Включите эти команды в файл .conf- или .ovpn.
# disable automatic route configuration
route-noexec
# enable executing scripts
script-security 2
# script to configure routes
up updown.sh
# script to deconfigure routes
down updown.sh
И сценарий updown.sh
содержит:
#!/bin/bash
case $script_type in
up) echo routes up
# reproduce OpenVPN's standard routes
ip route add $trusted_ip via $route_net_gateway
ip route add $route_network_1 via $route_vpn_gateway
# but put the default route in an extra table
ip route add default via $route_vpn_gateway table 200
# and make sure it is activated by selection of the interface's address
ip rule add from $ifconfig_local/32 table 200
# flush routing cache (but everything seems to work without this, too)
ip route flush cache
;;
down) echo routes down
ip route del $trusted_ip
;;
esac
В этой конфигурации traceroute -s
команда дает тот же результат, что и traceroute -i
отображение маршрута через VPN к целевому адресу.
То, что я не объяснил в своем исходном сообщении: рассматриваемый VPN не обеспечивает доступ к защищенной локальной сети, а к Интернету, но из другого места / IP-адреса. В противном случае в добавлении маршрута по умолчанию вообще не было бы необходимости.
То, что вы ищете, называется "маршрутизацией на основе источника", а старый route
программа не может справиться с этим. Вам нужно будет использовать iproute2
и настроить альтернативную таблицу маршрутизации на основе IP-адреса источника. Использование руководства Вот у вас будет что-то вроде:
# Designate "table 200" as "vpntunnel"
# - optional, but otherwise we'd have to use 200 everywhere. Also, 200 is an arbitrary number, 0 253 254 255 are reserved.
echo 200 vpntunnel >> /etc/iproute2/rt_tables
# Packets from your tunnel address use this table
ip rule add from 10.30.92.6/32 table vpntunnel
# The default route for packets using the vpntunnel is...
ip route add default via 10.30.92.5 dev tun1 table vpntunnel
# Flush routing cache
ip route flush cache
Я не уверен, нужно ли вам убрать маршрут из обычного route
table перед тем, как сделать это, но оставить его должно быть нормально (на самом деле это может быть необходимо, чтобы ядро выбрало правильный исходный IP-адрес для взаимодействия с 10.30.92.5 для приложений, которые не привязаны к IP-адресу).