Как маршрутизировать конкретные адреса через туннель?


14

Существуют определенные веб-сайты / службы, к которым я могу получить доступ только из подсети, в которой находится мой сервер (вспомните типичный сценарий интрасети). Есть ли способ прозрачной маршрутизации трафика, который идет на эти адреса через туннель SSH?

Рассмотрим следующую настройку:

Мой ноутбук подключен к домашней сети. Он не может получить доступ к сервисам на ips X и Y напрямую. У меня есть туннель SSH к серверу, который находится в подсети, которая на самом деле может получить доступ к этим службам.

Могу ли я каким-то образом автоматически инкапсулировать весь трафик в подсети X и Y для прохождения через этот туннель без необходимости запуска всего решения VPN, которое будет отправлять весь мой трафик через сервер? Другими словами: весь трафик, который идет в любую другую подсеть, должен по-прежнему идти напрямую с ноутбука, не проходя через сервер (используя туннель).

Ответы:


6

Вы можете указать интерфейс для маршрутизации трафика в таблице маршрутизации:

sudo route add <host.com> -interface <ppp0>

Где host.com - это имя хоста или ip, к которому вы хотите получить доступ через интерфейс, а ppp0 - идентификатор ссылки на ваш vpn, показанный с помощью ifconfigкоманды.


2
Примечание: по крайней мере в Ubuntu -interfaceэто не вариант, routeпоэтому приведенное выше предложение дает ошибку использования. Кроме того, как это приведет к маршрутизации через туннель ssh, как запрашивает OP?
Ариэльф

3

Последние версии OpenSSH поддерживают настройку сетевых устройств для настройки VPN. См. Https://help.ubuntu.com/community/SSH_VPN для некоторой базовой документации (очевидно, предназначенной для Ubuntu, но основной принцип применяется в другом месте.)


Обратите внимание, что для этого требуются права суперпользователя как на ноутбуке, так и на хосте шлюза.
Риккардо Мурри

1

Отказ от ответственности: я на самом деле не проверял то, что собираюсь описать, и действительно, это может быть совершенно неправильно, но ваш вопрос настолько интригует, что я не могу удержаться от соблазна составить ответ. :-) Кроме того, настройка здесь зависит от некоторых iptablesфункций, которые могут существовать только в Linux.

Предполагая, что вы хотите подключиться со своего ноутбука к определенному порту P1 на сервере X1, к порту P2 на сервере X2 и т. Д. - я собираюсь описать, как маршрутизировать трафик TCP на эти конкретные пары сервер + порт через туннель SSH. Примечание. IP-адреса X1, X2 и т. Д. Являются IP-адресами сервера, которые видны с хоста шлюза (с которым вы работаете по SSH).

  1. Выберите некоторые неиспользуемые локальные порты L1 (например, 10000), L2 (например, 10001) и т. Д. Порты L1, L2, ... должны быть все различны, и их количество должно быть равно количеству отдельных (Xn, Pn) серверов + портовые пары.

  2. Используется iptablesдля перенаправления пакетов, направленных на Xn: Pn, на localhost: Ln

    iptables -t nat -A ВЫХОД -p tcp -d X1 --dport P1 -j DNAT - к локальному узлу назначения: L1 iptables -t nat -A OUTPUT -p tcp -d X2 - порт P2 -j DNAT - локальный пункт назначения: L2

  3. Теперь SSH к шлюзу, используя -Lопцию для туннелирования трафика от localhost: Ln до (Xn, Pn):

    ssh gateway.server -L локальный хост: L1: X1: P1 -L локальный хост: L2: X2: P2 ...

Пример:

# access webserver.intranet (port 80) through localhost:10080
iptables -t nat -A OUTPUT -p tcp -d webserver.intranet --dport 80 -j DNAT --to-destination localhost:10080
ssh gateway.server -L locahost:10080:webserver.intranet:80

Предостережения:

  • он работает только для TCP, если он вообще работает ...

  • если вы хотите получить доступ к более чем одному серверу, возможно, потребуется меньше усилий для настройки VPN

  • все еще может быть проще использовать -Dопцию SSH для симуляции прокси-сервера SOCKS и туннелирования всего вашего трафика через него.


Это на самом деле работает! (К сожалению, это не подходит для моей конкретной ситуации, когда я хочу направлять трафик, исходящий от виртуальной машины, а не от localhost.)
pvgoran

1

подсети X и Y, чтобы пройти через этот туннель, без необходимости запуска всего решения VPN, которое будет отправлять весь мой трафик через сервер?

То, что вы хотите, это определение VPN.

VPN не должен

отправить весь [ваш] трафик через сервер?

Если это так, он не настроен должным образом.

Предполагается, что любая машина, к которой вы пытаетесь получить доступ через туннель или VPN, по определению недоступна через Интернет. Таким образом, только необходимый, не маршрутизируемый через Интернет адрес должен маршрутизироваться по VPN.

Если у вас более сложная ситуация, например, машина X и Y и ничего больше. Ваш ИТ-персонал может поместить их в подсеть для вас. Затем на вашем клиентском компьютере только маршрутизируйте эту подсеть вниз по VPN.


0

Могу ли я каким-то образом автоматически инкапсулировать весь трафик в подсети X и Y для прохождения через этот туннель без необходимости запуска всего решения VPN, которое будет отправлять весь мой трафик через сервер?

На первый взгляд это немного странно, потому что именно это VPN сделает для вас. SSH имеет тенденцию быть делом точка-точка, идея состоит в том, что вы подключаете один порт на вашем локальном компьютере к порту удаленного компьютера в другом месте; это действительно не было разработано для того типа трафика, который вы себе представляете.

Другими словами: весь трафик, который идет в любую другую подсеть, должен по-прежнему идти напрямую с ноутбука, не проходя через сервер (используя туннель).

Опять же, VPN позаботится об этом.

Если вас беспокоит «тяжеловесное» решение для получения защищенного VPN-трафика (т.е. вы не хотите с ним мириться, потому что это будет слишком сложно), вам стоит обратить внимание на OpenVPN. , который будет делать именно то, что вы описываете. Он не только инкапсулирует весь трафик, но и может быть выполнен таким образом, что только трафик, предназначенный для этих подсетей, будет проходить через канал VPN. Я предупрежу вас, что вам все еще нужно будет отредактировать текстовый файл на локальном и удаленном компьютере (ах), но его довольно легко запустить.

Для ваших целей, поскольку вы не хотите, чтобы сторона в середине (сервер) видела ваш трафик, вы должны настроить VPN для прямого подключения вашего компьютера к удаленному компьютеру. Любые маршрутизируемые пакеты будут зашифрованы перед тем, как покинуть ваш ноутбук, поэтому у вас будет 100% сквозное покрытие.


0

Как уже говорили другие, если вы должны «инкапсулировать весь трафик в подсети», то вы, вероятно, захотите использовать VPN.

Однако, чтобы получить доступ только к нескольким службам, вы можете использовать функцию переадресации локальных портов SSH, которая действительно проста. Например, если вы введете (с вашего ноутбука):

ssh -N -L 3333:localhost:2222 jump_box

затем подключение к localhost:2222, будет похоже на подключение к localhost:2222от jump_box. Вы можете использовать несколько опций -L одновременно, и вы можете подключиться к сервисам на других хостах, если ssd_config включенjump_box позволяет это.

Вы можете использовать autosshс systemdили как, чтобы поддерживать туннели в рабочем состоянии.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.