Linux

如何使用 iptables 轉發創建 SSH 反向隧道?

  • February 8, 2020

我的家庭網路中有一台伺服器(無法轉發埠)和 WAN 上有一個 VPS。我需要某個埠上的請求,不是從 VPS 轉發到我的家庭伺服器。如果我將請求發送到localhostVPS,我有一個 SSH 隧道可以正常工作。但是,我希望localhost從 Internet 轉發到 VPS 的請求通過隧道發送到我的家庭伺服器。它需要是雙向的。

我已經看到了這個問題,但是它對我不起作用。我很可能做錯了什麼。

我的確切程序:

a我的家庭伺服器 server 上,我執行此命令來設置隧道:

ssh -v -N -R 2222:localhost:22 root@server-b.com

b我在伺服器(VPS)上執行了以下命令:

iptables -t nat -A PREROUTING -p tcp --dport 2223 -j DNAT --to-destination 127.0.0.1:2222

並嘗試ssh從另一台機器:

ssh root@server-b.com -p 2223

我設置GatewayPorts yessshd_config但是我仍然發現同樣的問題:

ssh: connect to host server-b.com port 2223: Connection denied

設置GatewayPorts yesAllowTcpForwarding yessshd_config伺服器上bGatewayPorts clientspecified明確提及 IP0.0.0.0或在*伺服器a上創建反向隧道。所以伺服器上的 sshdb也接受來自公共的連接:

ssh -NTR *:2222:localhost:22 root@server-b.com

否則 sshd 僅在GatewayPorts no.

現在ssh 從另一台機器到埠2222

ssh root@server-b.com -p 2222

驗證後您將登錄到伺服器a

無需設置iptables轉發。順便說一句,root如果可能的話,避免使用者進行遠端登錄。


如果您不想設置GatewayPorts選項,那麼您需要將來自其他埠的流量轉發2223localhost:2222.

  • 這可以iptables在伺服器上完成b
iptables -t nat -I PREROUTING -p tcp -m tcp --dport 2223 -j DNAT --to-destination 127.0.0.1:2222

*REDIRECT僅適用於同一界面

但不允許路由到loopback介面,除非:

echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/route_localnet

現在ssh從另一台機器到埠2223

ssh root@server-b.com -p 2223

另一種選擇是設置一些最小的本地轉發伺服器,從埠22232222使用諸如ssh、、socat等工具netcat*inetd

  • 在伺服器上b,使用socat
socat TCP-LISTEN:2223,fork TCP:127.0.0.1:2222
  • 或與netcat
nc -l -p 2223 -c "nc 127.0.0.1 2222"
  • 或與ssh
ssh -4gfNTL 2223:localhost:2222 localhost

以上任何一項都可以與反向隧道相結合,在一個步驟中從伺服器進行雙重轉發:a

ssh -TR *:2222:localhost:22 root@server-b.com "ssh -4gfNTL 2223:localhost:2222 localhost"

引用自:https://unix.stackexchange.com/questions/504100