場景: 在家鏈接公司的內網服務器.linux
需求: 不用設置端口映射在家用putty登陸公司內網服務器.shell
條件: 有一臺公網服務器作轉發,有開放端口的控制權.(公網服務器能夠是阿里雲ECS, 騰訊雲主機這樣的公網服務器.也能夠是你家的linux路由器,前提是路由器外網IP是固定的,或者看起來是"固定"的(搜索花生殼).)服務器
探索: 早有耳聞ssh端口轉發的強大功力,一直未研究.今日有上述需求,因此摸索了一番,得此文,謹作備忘記錄.
網絡
公司的網絡管理員不可能給我開一個端口轉發,只能本身動手, 而後我就想起了這篇文章[實戰 SSH 端口轉發]. ssh
看完後個人理解是: 本地轉發 就是:ssh client開個端口轉發數據給ssh server. 遠程轉發 就是:ssh server開個端口轉發數據給ssh client.阿里雲
公司機器在內網啊, 個人ECS服務器連不上,不可能作ssh server. 那就只能當作ssh client咯. 用遠程轉發讓ECS開個端口轉發數據給ssh client.spa
因而在公司機器上執行: rest
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端口.code
而後我在家裏用putty設置IP爲ECS的x.x.x.x 端口爲2333, 順利連上了公司的機器 ,而且ssh登陸成功.server