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

浙公網(wǎng)安備 33010602011771號(hào)