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