【SSH Tunnel】不需設定路由,打通NAT對外

只有要連上網路的電腦,透過打洞(SSH tunnel),可以讓直接穿透NAT讓讓此電腦某個Port暴露在網路上

場景

  • 無法設定對外的LEN端-電腦A
  • 有對外IP的-電腦B (VPS)

目標

建立反向ssh tunnel直接電腦B:某port對應到電腦A連的到的server:某port

示意圖

反向ssh tunnel

需要先安裝ssh這邊就不多贅述

電腦B設定GatewayPorts

不打開GatewayPorts的話做tunnel的話只有電腦B連的到該port,無法對外開放

1
2
3
4
# 打開ssh設定文件
vi /etc/ssh/sshd_config
# 找到GatewayPorts移除註解並設為yes
sudo service sshd restart

電腦A建立反向tunnel

1
ssh -NfR 5555:localhost:5000 {電腦B_user@電腦B_IP} {-p 電腦B_ssh_port}
參數說明
-N不執行遠端指令,僅做封包重新導向
-f連線認證後,在背景執行
-R port:host:hostport設定本機的 port, 連到 host (主機)的 host port

建立連線後,從外部連到 B的5555 實際會連到 A的5000

Internet → B的5555 → A的5000

成功讓處於封閉網路的A透過B達成對外暴露在網路上


延伸用法:透過A打穿到同LEN端的電腦C

假設電腦C開80且只有同LEN端的電腦A連的到

1
ssh -NfR 8888:{電腦C_LEN_IP}:80 {電腦B_user@電腦B_IP} {-p 電腦B_ssh_port}

B的8888 <-ssh-> A <-http-> C的80

但由於B是入口、A是中繼、C是server,所以ABC這三台都不能關機


指令說明

關閉 ssh tunnel

由於ssh tunnel會於背景執行,需要透過 netstat 或是 ps 找出pid關閉

B透過Listen port

1
sudo netstat -ntpl |grep ssh

找到PID用kill {pid}

A透過process

1
ps -ef | head -1; ps -ef |grep "ssh -"

找到PID用kill {pid}