Ssh

透明 ssh 隧道

  • September 6, 2019

我在/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(via /etc/hosts,而後者又會被代理到127.0.0.1:8000(via 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>

引用自:https://serverfault.com/questions/982063