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

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

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

Рассмотрим следующую схему:

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

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

решение1

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

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

Где host.com — это имя хоста или IP-адрес, к которому вы хотите получить доступ через интерфейс, а ppp0 — это идентификатор соединения для вашего VPN, отображаемый в команде ifconfig.

решение2

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

решение3

Отказ от ответственности: я на самом деле не проверял то, что собираюсь описать, и, действительно, это может быть совершенно неверно, но ваш вопрос настолько интригующий, что я не могу устоять перед искушением написать черновик ответа. :-) Кроме того, данная настройка зависит от некоторых 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 --to-destination localhost:L1 iptables -t nat -A ВЫХОД -p tcp -d X2 --dport P2 -j DNAT --to-destination localhost:L2

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

    ssh шлюз.сервер -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 и туннелировать весь ваш трафик через него.

решение4

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

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

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

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

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

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

Связанный контент