Я запускаю ubuntu 12.04 и хочу, чтобы vpn использовался только для определенных приложений, которые могут подключаться к порту (адресу) vpn. Если я подключаюсь к VPN со всем трафиком, маршрутизируемым через порт VPN, все работает нормально (как показано на втором маршруте ниже). Если я отмечу опцию «Использовать это соединение только для ресурсов в своей сети», маршрут будет выглядеть так, как будто я этого и ожидал, и другие программы могут подключиться к Интернету, но я не могу подключиться к удаленному серверу, привязанному к порту vpn, например « telnet google.com 80 -b 10.187.1.9 "Кажется, я могу получать пакеты, но, может быть, нет. Кто-нибудь знает, что не так с маршрутом?"
При установке «Использовать это соединение только для ресурсов в своей сети»: (Невозможно подключиться к удаленному серверу только с помощью tun0 (10.187.1.9)
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth2
10.187.1.1 10.187.1.9 255.255.255.255 UGH 0 0 0 tun0
10.187.1.9 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
130.185.155.58 192.168.1.1 255.255.255.255 UGH 0 0 0 eth2
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth2
192.168.1.0 0.0.0.0 255.255.255.0 U 1 0 0 eth2
192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
Вариант по умолчанию: (я могу подключиться к удаленному серверу с помощью tun0, но весь трафик маршрутизируется через tun0)
0.0.0.0 10.187.1.9 0.0.0.0 UG 0 0 0 tun0
10.187.1.1 10.187.1.9 255.255.255.255 UGH 0 0 0 tun0
10.187.1.9 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth2
185.3.135.58 192.168.1.1 255.255.255.255 UGH 0 0 0 eth2
192.168.1.0 0.0.0.0 255.255.255.0 U 1 0 0 eth2
192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
Я не думаю -b
option делает то, что вы думаете.
Если вы сделаете tcpdump
вы увидите, что telnet
соединение будет выходить из шлюза по умолчанию, но будет иметь исходный IP-адрес 10.187.1.9. Проблема заключается в том, что даже если ваш исходный IP-адрес изменился - все ваши маршруты основаны на пункте назначения; в текущей конфигурации вы всегда будете использовать шлюз по умолчанию.
Итак, чтобы решить эту проблему, есть два решения.
Способ 1 прост - вы уже сделали это.
Метод 2, основной способ сделать это выглядит следующим образом:
ip rule add from <source>/<mask> table <name>
ip route add default via <VPN GW> dev tun0 table <name>
ИЛИ
ip route add default dev tun0 table <name>
куда <name>
будет что-то в /etc/iproute2/rt_tables
(вы можете создать имя) или вы можете использовать номер.
Источники:
http://www.saeedpazoki.com/how-to-implement-source-routing-with-linux/
OpenVPN использует подсеть Entre для размещения своих виртуальных интерфейсов на стороне сервера, а также подключающихся клиентов. В вашем случае эта подсеть настроена как 10.187.1.0/24. OpenVPN назначает 10.187.1.1 для серверной части и разделяет остальную подсеть на более мелкие подсети для каждого клиентского соединения. По умолчанию он будет использовать / 30 с двумя используемыми адресами, одним сетевым адресом и одним широковещательным адресом по соображениям совместимости и назначить первый из используемых адресов серверу, а второй - подключающемуся клиенту. В вашем примере это будет 10.187.1.9 (сервер) и предположительно 10.187.1.10 (клиент).
Итак, ваша первая проблема запущена telnet google.com 80 -b 10.187.1.9
- вы инструктируете telnet
для привязки к нелокальному адресу, что не сработает. Вторая проблема заключается в том, что Linux принимает решения о маршрутизации, оценивая только адрес назначения по умолчанию. Так как google.com
разрешает что-то не локальное в вашей сети и не охваченное каким-либо другим маршрутом, пакет ретранслируется через маршрут по умолчанию, который в вашем случае будет 192.168.1.1 и который, вероятно, ничего не знает о подсети 10.187.1.0/24, поэтому он эффективно отбрасывает пакет. Если вам нужен этот трафик для проезда через tun0
, вы должны явно указать Linux:
echo "200 vpn" >> /etc/iproute2/rt_tables
ip rule add from 10.187.1.0/24 table vpn
ip route add table vpn default dev tun0
Это создаст дополнительную регистрацию в таблице маршрутизации с именем vpn
добавьте правило для использования этой таблицы маршрутизации, если пакет исходит из подсети 10.187.1.0/24, и добавьте маршрут по умолчанию через tun0 (который является двухточечным интерфейсом, поэтому для спецификации маршрута не требуется адрес шлюза ) для всего трафика, проходящего через vpn
стол.