Назад | Перейти на главную страницу

С разделенной сетью openvpn невозможно подключиться к удаленному серверу через vpn

Я запускаю 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. Используйте свою VPN для всех подключений, то есть сделайте VPN своим шлюзом по умолчанию.
  2. Реализуйте маршрутизацию от источника или маршрут политики. Это создаст маршрут на основе исходного 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/

https://superuser.com/a/377039/161569

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 стол.