ssh命令:隧道代理+本地端口轉發+遠程端口轉發


 
 

0、前言

nc是一個在網絡連接兩端的好工具,同時也是也個臨時的端口轉發的好工具。(永久的端口轉發用什么?用iptables)

ssh也是這方面的好工具,好處是加密可靠可復用在一端操作即可,代價是要有登錄帳號。

我們知道,SSH 會自動加密和解密所有 SSH 客戶端與服務端之間的網絡數據。但是,SSH 還同時提供了一個非常有用的功能,這就是端口轉發。它能夠將其他 TCP 端口的網絡數據通過 SSH 鏈接來轉發,並且自動提供了相應的加密及解密服務。

 

1、隧道帶理

典型應用:翻越中國高牆

需要條件:一個國外vps,一個不需要登錄(安全)的帳號,一個命令。

 

vps新建帳號:useradd -g nobody -s /sbin/nologin  gfw && echo gfw_Passw0rd | passwd --stdin gfw

本地ssh連接:ssh -NfD 6666 gfw@vps -p 2222

可選轉換:使用privoxy把socks5代理變成http代理供svn,pip,gem,curl等工具使用。

 

2、本地端口轉發

 

我們可以將遠程機器(LdapClientHost)上的應用直接配置到本機的 7001 端口上(而不是 LDAP 服務器的 389 端口上)。在 LdapClientHost 上執行如下命令即可建立一個 SSH 的本地端口轉發,例如:

$ ssh -L 7001:localhost:389 LdapServerHost

 之后的數據流將會是下面這個樣子:

  • 我們在 LdapClientHost 上的應用將數據發送到本機的 7001 端口上,
  • 而本機的 SSH Client 會將 7001 端口收到的數據加密並轉發到 LdapServertHost 的 SSH Server 上。
  • SSH Server 會解密收到的數據並將之轉發到監聽的 LDAP 389 端口上,
  • 最后再將從 LDAP 返回的數據原路返回以完成整個流程。

3、遠程端口轉發

 我們在 LdapClientHost 上的應用將數據發送到本機的 7001 端口上,而本機的 SSH Server 會將 7001 端口收到的數據加密並轉發到 LdapServertHost 的 SSH Client 上。

 

在 LDAP 服務器(LdapServertHost)端執行如下命令:

$ ssh -R 7001:localhost:389 LdapClientHost

 

區別:

SSH 端口轉發自然需要 SSH 連接,而 SSH 連接是有方向的,從 SSH Client 到 SSH Server 。而我們的應用也是有方向的,比如需要連接 LDAP Server 時,LDAP Server 自然就是 Server 端,我們應用連接的方向也是從應用的 Client 端連接到應用的 Server 端。如果這兩個連接的方向一致,那我們就說它是本地轉發。而如果兩個方向不一致,我們就說它是遠程轉發。

 

4、使用autossh防網絡抖動+supervisior進程守護。

 

autossh解決的問題:遠程端口轉發一旦端口,很難再次建立。

 

autossh -M 1932 -NR  1922:localhost:1122 user@vps -p 1122

ps可以看到實質是這樣的:

ssh -L 1932:127.0.0.1:1932 -R 1932:127.0.0.1:1933 -NR 1922:localhost:1122 -p 1122 user@vps

 

分析:使用回路,將本地1933端口,(遠程轉發)映射到遠端1932,(本地轉發)到本機的1932。形成回路。

 

supervisior解決的問題:autossh的進程守護

 因此,使用supervisior守護autossh,autossh守護ssh。達到自動啟動和守護端口轉發的目的。

 

 

5、綜合使用

 

案例一、如何2222端口被封,如果繞過封死2222端口的防火牆直接ssh到內網機器。(就是說限某幾個端口是有局限的)

1、登錄最重要的機器把2222端口映射到12222端口:

  ssh -gfNL 12222:0.0.0.0:2222 localhost -p2222

2、使用該機器做隧道代理訪問其他內網機器:

  ssh -NfD 10000 user@host -p12222

3、ssh繞道訪問其他內網機器:

  ssh -o "ProxyCommand=nc -x localhost:10000 %h %p" user@host -p2222

 

巧妙結合的ssh和nc,都是linux自帶工具,沒有依賴。

 

案例二、借助遠程vps讓兩台不能直接相通的機器相互能訪問。

有主機vps和主機A、B。A、B無法直連,通過“中介”搭橋相連。(兩台機器都能主動ssh到vps就能完成。)

A要ssh到B(B要ssh到A是同理):

1、主機B用ssh遠程轉發自己的2222端口到vps的127.0.0.1:12222

  ssh -NfR 12222:127.0.0.1:2222 user@vps -p2222

2、主機A用ssh本地轉發vps的127.0.0.1:12222到本地的127.0.0.1:12222

  ssh -NfL 12222:127.0.0.1:12222 user@vps -p2222

3、主機A登錄主機B

  ssh user@localhost -p12222

 

 

參考:

實戰 SSH 端口轉發

https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/

使用supervisor托管shadowsocks

https://blog.phpgao.com/supervisor_shadowsocks.html

SSH反向連接及Autossh

http://www.cnblogs.com/eshizhan/archive/2012/07/16/2592902.html

 

 

 

 

 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM