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

Прозрачное ssh-туннелирование

У меня есть туннель SSH, определенный в /etc/ssh/ssh_config. Это содержит:

LocalForward 0.0.0.0:8000 some-service:80
LocalForward 0.0.0.0:8001 some-other-service:80

Я все еще хотел бы иметь доступ к туннелям через их оригинальные DNS-имена (например, curl some-service должен по-прежнему работать, вместо того, чтобы использовать curl 0.0.0.0:8000)

Пытаясь сделать это, я добавил в свой /etc/hosts файл:

127.0.0.2 some-service
127.0.0.3 some-other-service

Теперь, я думаю, мне нужно немного iptables команды, которые будут делать следующее:

When I see a request to 127.0.0.2:80 I should proxy it to 127.0.0.1:8000
When I see a request to 127.0.0.3:80 I should proxy it to 127.0.0.0:8001

Такой, что curl some-service решит 127.0.0.2 (через /etc/hosts, который, в свою очередь, будет проксирован на 127.0.0.1:8000 (через iptables), которые, в свою очередь, попали some-service:80 (через туннель ssh)


Вопрос: Мне кажется, должен быть более простой способ добиться этого? Если нет, то что бы iptables как выглядят команды?

В iptables команда, которую вы бы использовали в этом случае:

iptables -t nat -A OUTPUT -p tcp -d 127.0.0.2 --dport 80 -j DNAT --to-destination 127.0.0.1:8000

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

LocalForward 8000 some-service:80

iptables обрабатывает перенаправление на адрес обратной связи по умолчанию 127.0.0.1.


Я тестировал это, используя ipify.org. Они предоставляют простой API для возврата запросов IP-адресов, отправленных с (которые я удалил из вывода).

Все эти команды выполняются на клиентском компьютере SSH с активным подключением к серверу SSH, инициированным следующей командой:

$ ssh -L 8000:api.ipify.org:80 <remote host>

Вот iptables правило:

$ sudo iptables -n -t nat -L OUTPUT
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  0.0.0.0/0            127.0.0.2            tcp dpt:80 to:127.0.0.1:8000

С hosts запись на месте, используется туннель SSH:

$ cat /etc/hosts | grep ipify
127.0.0.2       api.ipify.org
$ echo $(curl -s api.ipify.org)
<remote host IP address>

С hosts запись закомментирована, туннель SSH не используется:

$ cat /etc/hosts | grep ipify
#127.0.0.2      api.ipify.org
$ echo $(curl -s api.ipify.org)
<client machine IP address>