使用SSH實現內網穿透

參考

前言

這兩天又要作微信公衆號開發,以前爲了方便測試,用了內網穿透工具Ngrok,前一段調研加密代理時瞭解到SSH也能夠作內網穿透,所以特地研究了一下具體流程,這裏記錄一下。java

服務器配置

是的,雖然是內網穿透,但你須要一臺有公網IP的服務器用來作轉發,臨時用的話,能夠考慮用阿里的搶佔式實例,具體請看上面的參考3git

  • 首先須要確保服務器的映射端口是能夠訪問的。確保本機的防火牆裏打開了該端口。若是是阿里雲,那就要修改ECS實例的安全組添加規則。
  • 服務端的sshd後臺服務默認是不容許遠程主機鏈接本地的轉發端口的,所以須要修改sshd配置文件:
    編輯/etc/ssh/sshd_config,找到GatewayPorts配置項,默認是註釋起來的,取消註釋,並把後面的值改爲clientspecified
  • 重啓sshd:systemctl restart sshd

客戶端配置

  • 客戶端須要有SSH。Windows 10裏面已經自帶了OpenSSH,能夠直接使用,能夠在命令行窗口裏運行ssh驗證一下
  • 若是客戶端沒有,能夠用Cygwin安裝,或者Windows版的Git等工具裏也自帶
  • 打開命令行窗口執行以下命令:
    ssh -fCNR 0.0.0.0:<遠程映射端口>:localhost:<本地監聽端口> root@<遠程主機>github

    1. 執行此命令後須要手動輸入遠程服務器上root用戶的密碼
    2. 注意這裏的0.0.0.0不能省略,不然服務端的映射端口只容許本機訪問
    3. <本地監聽端口>就是內網主機的本地服務所監聽的端口,好比80,用這個命令能夠把公網服務器的<遠程映射端口>監聽到的請求轉發到本地服務上
  • 如何斷開內網映射:segmentfault

    1. 簡單點直接執行taskkill /im ssh.exe /f便可殺掉全部ssh進程
    2. 若是怕誤殺,能夠用wmic process where "name='ssh.exe'" get commandline,processid來查詢全部的ssh.exe進程,根據啓動命令行找到對應的進程號,而後用taskkill /pid <進程ID> /f來點殺進程
  • 一般殺掉內網機器上的ssh進程,也會自動結束服務器上對應的sshd進程,若是沒有,則須要在服務器上手動清理安全

    1. 在服務器上執行netstat -antp | grep <遠程映射端口>便可找到對應的sshd進程,而後用kill -9 <PID>點殺之

保持鏈接

用SSH實現的內網穿透長時間沒有數據傳輸會斷掉,須要進行一些配置,讓客戶端和服務端保持鏈接。幾個方案:服務器

  • 安裝autossh,這個軟件可以自動重連
  • 讓SSH客戶端定時發送消息保持鏈接微信

    1. 永久方案:修改SSH客戶端配置文件。在Windows上,這個文件位於<用戶目錄>\.ssh\config,默認是沒有這個配置文件的,須要手動建立一個。內容以下:
    Host *
      ServerAliveInterval 240
    1. 一次性方案:啓動SSH客戶端時添加參數:-o ServerAliveInterval=240
  • 讓SSH服務端定時發送消息保持鏈接
    修改/etc/ssh/sshd_config,添加下面兩行:網絡

    ServerAliveInterval 30
    ServerAliveCountMax 60

SSH免登陸

請參見文首的參考4ssh

相關文章
相關標籤/搜索