轉載請註明文章出處:ssh端口轉發的三種方式web
ssh是我使用最頻繁的兩個命令行工具之一(另外一個則必須是vim)。有了ssh,我能夠遠程處理各類可能出現的問題而無需肉身到現場。vim
這幾天teamviewer被黑的事情影響挺大,因而由遠程控制想到了內網穿透,天然而然的想到了ssh的端口轉發也能實現內網穿透。再細想一下,發現ssh隧道、或者說端口轉發,居然實現了正向代理、反向代理和內網穿透三種經常使用的網絡功能,更佩服其功能的強大和使用中的便利。centos
ssh有三種端口轉發模式,本文一一對其作簡要介紹。安全
本地端口轉發(Local Port Forwarding),是將本地主機某個端口流量轉發到遠程主機的指定端口。其命令行語法是:-L [bind_address]:localport:remote_host:remote_port
。"-L"即「local」的首字母,相似的遠程轉發的"-R"是「remote」的首字母,動態轉發的「-D」是「dynamic」的首字母,很好記。服務器
舉一個例子說明本地轉發的使用場景。網絡
CentOS 7安裝GUI界面及遠程鏈接一文中介紹了安裝vnc服務並開啓端口訪問。在實際中,暴露出來的59xx端口天天都會源源不斷的受到自動化腳本的爆破攻擊。若是你的vnc和登陸用戶使用弱密碼或字典密碼,主機安全將受到極大威脅。這種情形下該如何防禦?ssh
一種簡單安全的防禦方法是:使用iptables/firewalld關閉端口的外網訪問,有鏈接需求時用ssh隧道轉發端口:工具
ssh -L5901:localhost:5901 username[@host](https://my.oschina.net/u/116016)
該命令中將本地的5901端口經過ssh隧道轉發到遠程主機的5901端口,遠程鏈接時輸入localhost或者127.0.0.1和5901端口便連到了遠程主機的5901端口。經過iptables和ssh的本地轉發,實現了他人沒法鏈接,只有本身才能訪問的目的。ui
須要注意的是「-L」選項中的「遠程主機」並不特指鏈接過去的機器(默認是鏈接上的機器),能夠是任何一主機。例如能夠將本機的8080端口流量轉發到facebook.com的80端口:加密
ssh -L8080:facebook.com:80 username[@host](https://my.oschina.net/u/116016)
遠程端口轉發(Remote Port Forwarding),是將遠程主機某個端口轉發到遠程主機的指定端口。其命令行語法是:-R [bind_address]:port:[local_host]:local_port
。
遠程轉發最經常使用的功能是內網穿透。有一個公網ip的主機,即可以藉助ssh隧道的遠程轉發實現內網滲透,達到外網訪問內網資源的目的。須要注意的是ssh遠程轉發默認只能綁定遠程主機的本地地址,即127.0.0.1。若是想要監聽來自其餘主機的鏈接,須要修改遠程主機ssh的配置,將"GatewayPorts"改爲「yes」,重啓ssh後生效。
一個將遠程的8080端口流量轉發到本地80web端口的示例:
ssh -R0.0.0.0:8080:80 username[@host](https://my.oschina.net/u/116016)
經過遠程轉發,訪問公網ip主機的8080端口即是訪問內網web主機的80端口,這樣就實現了內網穿透。
不管本地轉發仍是遠程轉發,都須要指定本地和遠程主機的端口。動態轉發(Dynamic Port Forwarding)則擺脫這種限制,只綁定本地端口,遠程主機和端口由發起的請求決定。動態轉發的語法是:"-D bind_address:port",一個轉發示例:
ssh -D 8080 username[@host](https://my.oschina.net/u/116016)
該命令讓ssh監聽本地8080端口,通過8080端口的流量都經過ssh隧道由遠程服務器代爲請求,從而達到獲取被屏蔽資源、隱藏真實身份的目的。
動態轉發實際上實現了正向代理功能,所以能夠用來kexue-上網。本地轉發也能夠作正向代理,但要對每個請求的主機和端口作轉發,比較繁瑣,實踐中不會這麼用。
kill
命令;