場景: 在家連接公司的內網服務器.
需求: 不用設置端口映射在家用putty登錄公司內網服務器.
條件: 有一台公網服務器做轉發,有開放端口的控制權.(公網服務器可以是阿里雲ECS, 騰訊雲主機這樣的公網服務器.也可以是你家的linux路由器,前提是路由器外網IP是固定的,或者看起來是"固定"的(搜索花生殼).)
探索: 早有耳聞ssh端口轉發的強大功力,一直未研究.今日有上述需求,所以摸索了一番,得此文,謹做備忘記錄.
公司的網絡管理員不可能給我開一個端口轉發,只能自己動手, 然后我就想起了這篇文章[實戰 SSH 端口轉發].
看完后我的理解是: 本地轉發 就是:ssh client開個端口轉發數據給ssh server. 遠程轉發 就是:ssh server開個端口轉發數據給ssh client.
公司機器在內網啊, 我的ECS服務器連不上,不可能做ssh server. 那就只能當做ssh client咯. 用遠程轉發讓ECS開個端口轉發數據給ssh client.
於是在公司機器上執行:
ssh -gfnNTR x.x.x.x:2333:localhost:22 root@x.x.x.x -o ServerAliveInterval=300
Note: x.x.x.x是我的ECS服務器公網IP localhost是指ssh client自己的127.0.0.1 . -o ServerAliveInterval=300
的意思是讓ssh client每300秒就給server發個心跳,以免鏈路被RST. -f Requests ssh to go to background just before command execution. 讓該命令后台運行 . -n Redirects stdin from /dev/null (actually, prevents reading from stdin).
-N Do not execute a remote command. 不執行遠程命令 . -T Disable pseudo-tty allocation. 不占用 shell . -g Allows remote hosts to connect to local forwarded ports. 允許非本機地址(任何公網IP)連接x.x.x.x的2333端口.{see man sshd_config(5)}. 這個選項非常重要, 要讓這個選項生效需要在x.x.x.x服務器(ssh server)上編輯/etc/ssh/sshd_config 添加一行GatewayPorts yes 然后保存退出並 service ssh restart.
整個命令這樣理解: 公司機器告訴ECS說 你給我監聽一下你的IP的2333端口,把這個2333端口的所有數據都發到我這的127.0.0.1的22端口.
然后我在家里用putty設置IP為ECS的x.x.x.x 端口為2333, 順利連上了公司的機器 ,並且ssh登錄成功.