1. 程式人生 > >ssh tunnel與從家中訪問內網機器

ssh tunnel與從家中訪問內網機器

                                                                                      ssh tunnel與從家中訪問公司內網機器

作者:張華  發表於:2012-03-08
版權宣告:可以任意轉載,轉載時請務必以超連結形式標明文章原始出處和作者資訊及本版權宣告

( http://blog.csdn.net/quqi99 )

            假設有這樣一個需求,需要從家中訪問公司內網機器,可以用ssh遂道技術來作轉發,遂道分正向遂道和反向遂道兩種,如果資料流向與ssh的順序(從 ssh client -> ssh server )相同即為正向遂道(用-L標識),如果資料流向與  ssh的順序相反即為反向遂道。下面直接上兩張圖來說明:

上面第一張圖是正向遂道,資料流向與ssh的順序(指ssh client -> ssh server)相同,即從192.168.1.1:80處監聽到請求資料之後,通過ssh遂道,最後轉發給了ssh server端6300埠去處理。

6300:192.168.1.1:80 都是前部分是ssh server, 後端分是ssh client

上面第二張圖是反向遂道,資料流向與ssh的順序(指ssh client -> ssh server)相反,即從ssh server端的6300埠監聽到資料之後,通過ssh遂道,最後轉給了192.168.1.1:8080

仔細想想上面兩張圖吧,下面直接上程式碼,從家中訪問公司內網的機器,必須在公司有一臺可以從家中訪問得到的跳轉機(例IP:10.10.10.10),要訪問的內網機IP為192.168.1.1 。

1)如果用反向遂道實現的話,先修改ssh server的/etc/ssh/sshd_config中的GatewayPorts  yes, 重啟sshd,  /etc/init.d/sshd restart
ssh -R 8422:192.168.1.1:8422 -R 61616:192.168.1.1:61616  [email protected] -g -N -C -o TCPKeepAlive=yes

2) 如果用正向遂道的話,先修改ssh server的/etc/ssh/sshd_config中的AllowTcpForwarding true, 重啟sshd,  /etc/init.d/sshd restart
    接著要 ssh 登入到跳轉機上執行下列命令:


   ssh -L 8422:localhost:8422 -L 61616:localhost:61616  [email protected] -g -N -C -o TCPKeepAlive=yes

   如果報錯“open failed: administratively prohibited: open failed”,那是因為上面的localhost處應該是ssh client的IP

example:

https://9.123.100.152:8422/ibm/console/login.do?action=secure
/etc/ssh/sshd_config中修改GatewayPorts no為GatewayPorts yes  /etc/init.d/sshd restart
ssh -R 8422:9.125.13.30:8422 -R 61616:9.125.13.30:61616 -R 61617:9.125.13.30:61617 [email protected] -g -N -C -o TCPKeepAlive=yes -o GatewayPorts=yes -vvv

/etc/ssh/sshd_config, AllowTcpForwarding=true
open failed: administratively prohibited: open failed,如果出現這個錯誤是因為下面的沒有用localhost
ssh -L 8422:localhost:8422 -L 61616:localhost:61616 -L 61617:localhost:61617 [email protected] -g -N -C -o TCPKeepAlive=yes (需先登入到9.123.100.152這個跳轉機上執行)

上述的缺點就是,為每個埠都得開一個tunnel,所以可以通過ssh命令 -D 的引數( [地址:]埠 ),含義是在某個本地地址的某個埠上開SOCKS服務進行監聽,把這個埠的資料通訊以加密形式轉發到ssh的另一端。例如:我們翻牆的原理,要防牆必須國外有一臺ssh server

1) 首先,通過 ssh -lquqissh -N -D 7070 [email protected] , 如 s20.flyssh.net

2)在firefox中設定使用socket v5的埠代理,埠為7070 (選項選單裡的“高階”選項卡的“Network"子選項卡中設定Connection)

3)  如何仍然有問題,可在firefox的位址列輸入about:config 配置使用遠端DNS:network.proxy.socks_remote_dns=true

上面的翻牆有個缺點,就是你訪問國內的網站它也會用代理,這樣就慢啊,所以你也可用autoproxy外掛選擇僅在訪問某些站點的使用指定代理,哪些不用代理

原理如下:比如firefox現在要訪問www.163.com,firefox先將請求資料轉給socket代理埠7070, 然後通過ssh遂道,最後由國外的ssh server主機去根據遠端的DNS訪問www.163.com

但上述需要應用程式支援socket代理,但有的程式不支援怎麼辦,可以用透明tsocks, 它能讓普通程式也走sock代理,在yum install tsocks安裝後,修改配置檔案/etc/tsocks.conf,可以在樣本檔案tsocks.conf.sample的基礎上修改,通常只要配置server = 127.0.0.1即可,其他都可以預設。例如svn服務,再用ssh -D 1080 -f -N 使用者名稱@公司伺服器的公網地址 在本機的1080埠開啟SOCKS服務;然後按照你平時使用svn的習慣,只是在命令前加上tsocks,類似這樣: tsocks svn up 或者 tsocks svn ci -m 'aaaa' 等等即可。

如果是http代理,用squid,安裝後修改配置

sudo vim /etc/squid/squid.conf
http_access allow localnet
http_access allow all

# And finally deny all other access to this proxy
#http_access deny all

# Squid normally listens to port 3128
http_port 21


sudo service squid start

使用時,

1)在shell中,匯入http_proxy=http://<httpproxyIP>:21環境變數,然後wget www.g.cn
2)yum源中使用代理,vim /etc/yum.conf
     proxy=http://<httpproxyIP>:21
     然後 sudo yum install git

2014-08-05新增:

要實現ssh自動跳轉非常簡單,在 ~/.ssh/config

Host server-*
    User ubuntu
    IdentityFile ~/.stack/myssh.key
    ProxyCommand ssh [email protected]<forward-machine> nc -q0 %h.stack %p

SSHebang就是一個這樣自動分發如上配置的工具

2016-01-17

反向代理還有妙用,這周家裡的寬頻換成了聯通的寬頻,路由器那兒沒有了公用IP,取而代之的是運營商私網IP,這樣經過家中路由器的DNAT均會失效(因為運營商那兒有狀態防火牆)。但花生殼會有效,因為花生殼客戶端會建立一個從家裡到花生殼伺服器(有公網IP)的TCP連線,這樣運營商那兒便會做一個DNAT連線。我現在雖然家裡的路由器沒有了公網IP,但我在美國仍然有有公網IP的虛機。那麼可以這樣:

ssh -R 2222:192.168.99.124:22 -R 8080:192.168.99.122:8080 -i ~/zhhuabj_lcy01.pem [email protected]<public-ip>  -g -N -C -o TCPKeepAlive=yes -o GatewayPorts=yes -vvv
ssh -i ~/zhhuabj_lcy01.pem [email protected]<public-ip>  && ssh -p 2222 [email protected]

但上面只能通過locahost訪問,如果想不用localhost訪問,我們可以:

[email protected]:~$ cat /etc/ssh/sshd_config |grep GatewayPorts
GatewayPorts yes
[email protected]:~$ sudo restart ssh
ssh start/running, process 3072

然後使用:

ssh -R 0.0.0.0:2222:192.168.99.124:22 -R 0.0.0.0:8081:192.168.99.1:80 -R 0.0.0.0:8080:192.168.99.122:8080 -i ~/zhhuabj_lcy01.pem [email protected]<public-ip> -g -N -C -o TCPKeepAlive=yes  -vvv

別忘了將公網IP的相應埠的防火牆規則開啟。

一個autossh的指令碼如下:

[email protected]:~# cat /etc/init.d/iautossh 
#!/bin/sh
START=99
start() {
    autossh -M20000 -f -q -N -D 0.0.0.0:8082 [email protected]
    autossh -M20002 -R 0.0.0.0:2222:192.168.99.124:22 -R 0.0.0.0:8081:192.168.99.1:80 -R 0.0.0.0:8080:192.168.99.122:8080 [email protected] -g -N -C -o TCPKeepAlive=yes -f
}
stop() {
    killall autossh
}

相關推薦

ssh tunnel家中訪問機器

                                                                                      ssh tunnel與從家中訪問公司內網機器作者:張華  發表於:2012-03-08版權宣告:可以任意

基於SSH隧道+chrome外掛SwitchyOmega訪問機器

背景:客戶的服務線上下IDC,訪問伺服器通過VPN連線到IDC,但VPN連線後只放行了特性埠比如80,伺服器部署了grafana系統之後不想與現有的80共用一個埠。比如grafana應用監聽除80之外的3000埠,在不通過客戶郵件申請其他埠的情況下,是否有其他辦法呢?本文基於SH隧道+chrome外掛Swit

如何公網訪問MySQL資料庫

公網訪問內網MySQL資料庫 本地安裝了MySQL資料庫,只能在區域網內訪問,怎樣從公網也能訪問本地MySQL資料庫? 本文將介紹具體的實現步驟。 1. 準備工作 1.1 安裝並啟動MySQL資料庫 預設安裝的MySQL資料庫埠是3306。 2. 實現步驟 2.1

怎樣公網訪問SpringBoot

公網訪問內網SpringBoot 本地安裝了SpringBoot,只能在區域網內訪問,怎樣從公網也能訪問本地SpringBoot? 本文將介紹具體的實現步驟。 1. 準備工作 1.1 安裝Java 1.7及以上版本 執行命令java -version檢查Java安裝和配置

怎樣公網訪問Docker容器

公網訪問內網Docker容器 局域網裡的主機上安裝了Docker容器,只能在內網訪問,怎樣從公網也能訪問內網的Docker容器? 本文將介紹具體的實現步驟。 1. 準備工作 1.1 安裝並啟動Docker容器 Docker容器預設的sshd埠是22。 2. 實現步驟

SSH隧道埠轉發及穿透繫結本地埠

ssh是一種安全的傳輸協議,我一般使用就是在登陸伺服器或遠端執行命令,最近我意識到這是個強大的命令。 開講~ 本地ssh隧道 工作中由於防火牆導致訪問某些網站或某些ftp連線超時,有什麼解決辦法呢。ssh隧道就是一種解決方式。 首先你需要了解一些資訊: 你自己

如何公網訪問WebSphere

公網訪問內網WebSphere 本地安裝了WebSphere,只能在區域網內訪問,怎樣從公網也能訪問本地WebSphere? 本文將介紹具體的實現步驟。 1. 準備工作 1.1 安裝Java 1.7及以上版本 執行命令java -version檢查Java安裝和

利用反向SSH訪問伺服器

學院的伺服器在學院的內網,出了學院就不能訪問,在宿舍、家裡學習很不方便沒有伺服器的話。之前一直用TeamViewer,但是用著不舒服。最近新找到一個辦法,就是利用外網伺服器以及反向SSH搭一條通道,使

使用frp通過ssh訪問公司機器

.gz 客戶 oca git 安裝包 公網 serve AR 公司 https://github.com/fatedier/frp/ github地址(具有中文文檔)從Release頁面下載安裝包本次是使用frp_0.20.0_linux_amd64.tar.gz版本通過S

怎樣訪問Nginx?

本地安裝了一個Nginx,只能在區域網內訪問,怎樣從外網也能訪問到本地的Nginx呢?本文將介紹具體的實現步驟。 1. 準備工作 1.1 安裝並啟動Nginx 預設安裝的Nginx埠是80。 實現步驟 下載並解壓holer軟體包 Holer軟體包:holer-xxx.tar.gz Holer支援各

怎樣訪問php-fpm?

acc cal 選擇 dem org inter 127.0.0.1 code address 本地安裝了一個php-fpm,只能在局域網內訪問,怎樣從外網也能訪問到本地的php-fpm呢?本文將介紹具體的實現步驟。 準備工作 安裝並啟動php-fpm 默認安裝的php-f

怎樣訪問數據庫?

平臺 主機 tree 數據庫 步驟 命令 fff 客戶端 映射 本地安裝了一個數據庫,只能在局域網內訪問到,怎樣從外網也能訪問到本地的數據庫呢?本文將介紹具體的實現步驟。 1. 準備工作 1.1 安裝並啟動數據庫 默認安裝的數據庫端口是1024。 2. 實現步驟 2.1 下

怎樣訪問Jetty?

本地安裝了一個Jetty,只能在區域網內訪問,怎樣從外網也能訪問到本地的Jetty呢?本文將介紹具體的實現步驟。 準備工作 安裝並啟動Jetty 預設安裝的Jetty埠是8080。 實現步驟 下載並解壓holer軟體包 Holer軟體包:holer-xxx.tar.gz Holer支援各種OS系統

怎樣訪問Django?

本地安裝了一個Django,只能在區域網內訪問,怎樣從外網也能訪問到本地的Django呢?本文將介紹具體的實現步驟。 準備工作 安裝並啟動Django 預設安裝的Django埠是8000。 實現步驟 下載並解壓holer軟體包 Holer軟體包:holer-xxx.tar.gz Holer支援各種

怎樣訪問Jboss?

本地安裝了一個Jboss,只能在區域網內訪問,怎樣從外網也能訪問到本地的Jboss呢?本文將介紹具體的實現步驟。 準備工作 安裝並啟動Jboss 預設安裝的Jboss埠是8080。 實現步驟 下載並解壓holer軟體包 Holer軟體包:holer-xxx.tar.gz Holer支援各種OS系統

怎樣訪問Jupyter Notebook?

本地安裝了一個Jupyter Notebook,只能在區域網內訪問,怎樣從外網也能訪問到本地的Jupyter Notebook呢?本文將介紹具體的實現步驟。 準備工作 安裝並啟動Jupyter Notebook 預設安裝的Jupyter Notebook埠是8888。 實現步驟 下載並解壓holer

怎樣訪問RESTful API?

本地部署了RESTful API,只能在區域網內訪問,怎樣從外網也能訪問到本地的RESTful API呢?本文將介紹具體的實現步驟。 準備工作 部署並啟動RESTful API服務端 預設部署的RESTful API服務端埠是80。 實現步驟 下載並解壓holer軟體包 Holer軟體包:hole

怎樣訪問WebSphere?

本地安裝了一個WebSphere,只能在區域網內訪問,怎樣從外網也能訪問到本地的WebSphere呢?本文將介紹具體的實現步驟。 準備工作 安裝並啟動WebSphere 預設安裝的WebSphere埠是9080。 實現步驟 下載並解壓holer軟體包 Holer軟體包:holer-xxx.tar.

怎樣訪問SQLServer資料庫?

本地安裝了一個SQLServer資料庫,只能在區域網內訪問到,怎樣從外網也能訪問到本地的SQLServer資料庫呢?本文將介紹具體的實現步驟。 1. 準備工作 1.1 安裝並啟動SQLServer資料庫 預設安裝的SQLServer資料庫埠是1433。 2. 實現步驟 2.1 下載並解壓holer軟

怎樣訪問Web?

dem tag -a inter git 原因 服務端 映射 gmail 本地部署了一個Web服務端,只能在局域網內訪問,怎樣從外網也能訪問到本地的Web服務呢?本文將介紹具體的實現步驟。 準備工作 部署並啟動Web服務程序 默認部署的Web服務端口是8080。 實現步驟