У меня есть туннель 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>