У меня есть туннель 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
)[12105estiveВ попытке сделать это я добавил следующее в свой / 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
С хостами
, туннель 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>