2020年1月31日 星期五

什麼是SSH Tunnel連線

  據說這是上班族必會的技能,但因為我待的公司不會擋youtube或是FB,所以沒有使用這個的需求,第一次看到SSH Tunnel應用是在end-to-end測試的case中,利用tunnel直連到server端的DB中下指令,覺得滿酷的,一直記著哪天要研究一下。


  簡而言之,SSH Tunnel的功用就是能做到Port Forwarding。

  好...那什麼是Port Forwarding呢?
  就是你打東西給A port相當於打給B port,而且A、B port可以在不同的電腦上。

  來做個實驗吧!


實驗準備:
  1. virtual box 裝了一台 linux,上面裝有openssh-server
  2. linux機器的網路設定記得選橋接介面卡
  3. 確認能ssh進這台linux



我先讓虛擬機linux跑下面這個簡單的flask server
from flask import Flask
app = Flask(__name__)

@app.route('/')
def welcome():
    return "hello"

if __name__ == '__main__':
    app.run()

預設應該會是跑在port 5000上

接著回到自己的電腦,跑下面這個python script來建立SSH Tunnel

import sshtunnel

server = sshtunnel.SSHTunnelForwarder(
    ('remote_host', 22),
    ssh_username="root",
    ssh_password="password",
    remote_bind_address=('127.0.0.1', 5000)
)
server.start()

print("port: ", server.local_bind_port)

remote host要輸入的是linux虛擬機器的IP,而remote_bind_address則是127.0.0.1,這是相對於remote host所知的IP。

示意圖,不過我們的web service是在port 5000
圖來源:sshtunnel document

  從console上我們可以看到local端是bind的port,我看到的是port 5421,現在這個port就相當於是我們的虛擬機linux的port 5000。

  試著用瀏覽器連到 localhost:54241
  看到了hello
  成功建立SSH tunnel了!

  不過,上面的script缺點有點多,local bind port不能自己決定,應該是有方法可以給定,但有點懶得找,另外要停掉這個python script用ctrl + c不太行,我最後都是開工作管理員來刪。



沒有留言:

張貼留言