如何使用 iptables 轉發創建 SSH 反向隧道?
我的家庭網路中有一台伺服器(無法轉發埠)和 WAN 上有一個 VPS。我需要某個埠上的請求,而不是從 VPS 轉發到我的家庭伺服器。如果我將請求發送到
localhost
VPS,我有一個 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 yes
了sshd_config
但是我仍然發現同樣的問題:ssh: connect to host server-b.com port 2223: Connection denied。
設置
GatewayPorts yes
並AllowTcpForwarding yes
在sshd_config
伺服器上b
。GatewayPorts 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
選項,那麼您需要將來自其他埠的流量轉發2223
到localhost:2222
.
- 這可以
iptables
在伺服器上完成b
:iptables -t nat -I PREROUTING -p tcp -m tcp --dport 2223 -j DNAT --to-destination 127.0.0.1:2222
*
REDIRECT
僅適用於同一界面echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/route_localnet
現在
ssh
從另一台機器到埠2223
:ssh root@server-b.com -p 2223
另一種選擇是設置一些最小的本地轉發伺服器,從埠
2223
到2222
使用諸如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"