開發人員如何舒爽的在家工作——VPN over SSH


引言

新冠疫情已經持續了那麼久,企業復工時間從2.3推遲到2.10,最新發文又要推遲到2.24號。

相信很多企業已經迫不及待的要求開發人員遠程辦公了。

很多開發人員頭疼的是就是如何在外網訪問公司內網的基礎設施了,比如開發環境、GitLab、Jenkins等,以及多人開發中怎麼聯合調試。

常規做法是搭建VPN服務器,本文介紹的是另一種VPN over SSH方式,不需要配置證書,不需要安裝客戶端,只要會用SSH就能簡單組網。


前置條件

  1. 需要有SSH服務器root權限
  2. 本地機器需是MacOS/Linux系統,並且有 sudo 權限
  3. 本文假設您已掌握瞭如何配置SSH免密登錄


基本原理

  1. ssh命令在root權限下可以在本地與遠程服務器上創建tun虛擬網卡並建立P2P對等網絡鏈接
  2. ssh命令的LocalCommand參數,可以定義SSH鏈接建立後在本地執行的腳本
  3. 在本地增加靜態路由,可以實現通過tun虛擬網卡訪問對端網絡


服務端配置過程

1. 編輯 /etc/ssh/sshd_config 文件,增加以下配置,並重啟 sshd 服務

<code>#允許在服務端創建TUN虛擬網卡PermitTunnel yes/<code>

2. 執行以下命令開啟服務端轉發能力,需要開機啟動的可以寫入 /etc/rc.local

<code>sysctl -w net.ipv4.ip_forward=1iptables -t nat -A POSTROUTING -j MASQUERADE/<code>


客戶端配置過程

1. 給本機root賬戶配置SSH免密登錄,假設可以通過 ssh GW 連接到以上配置的sshd服務

2. VPN通道開啟腳本:

<code>#!/bin/bashSCRIPT_DIR=$(dirname $0)#加載 env.sh 配置文件source $SCRIPT_DIR/env.sh#ifconfig/route命令兼容Darwin和Linuxif [[ "$(uname)" == "Darwin" ]]; then    LOCAL_KW_P2P=    LOCAL_KW_GW=else    LOCAL_KW_P2P=pointopoint    LOCAL_KW_GW=gwfiif [[ "$(ssh $TUNNEL_VIA_SSH uname)" == "Darwin" ]]; then    REMOTE_KW_P2P=    REMOTE_KW_GW=else    REMOTE_KW_P2P=pointopoint    REMOTE_KW_GW=gwfi#以下命令需要root權限sudo bash <<sudo> /dev/null            done        ' -- '#RemoteCommand            #配置遠程虛擬網卡            ifconfig tun$REMOTE_TUN $REMOTE_PEER $REMOTE_KW_P2P $LOCAL_PEER netmask $NETMASK        ' &    #寫SSH進程pid文件, 用於關閉VPN通道    echo \\$! > /var/run/$TUNNEL_VIA_SSH-tun.pidSUDO/<sudo>/<code>

3. VPN通道關閉腳本:

<code>#!/bin/bashSCRIPT_DIR=$(dirname $0)source $SCRIPT_DIR/env.shif [[ ! -f /var/run/$TUNNEL_VIA_SSH-tun.pid ]]; then    exitfisudo kill $(cat /var/run/$TUNNEL_VIA_SSH-tun.pid)sudo rm -f /var/run/$TUNNEL_VIA_SSH-tun.pid/<code>

4. 兩個腳本共用的配置文件

<code>#通過哪個SSH做隧道TUNNEL_VIA_SSH=GW#本地TUN設備IDLOCAL_TUN=0#遠程TUN設備ID, 多人同時連,需要設置成不同的IDREMOTE_TUN=1#對等網本地地址LOCAL_PEER=192.168.244.2#對等網遠端地址REMOTE_PEER=192.168.244.1#對等網網絡掩碼NETMASK=255.255.255.252#遠端子網列表(即SSH服務器上可以正常訪問的網段, 第一個用於客戶端之間的網絡互通)REMOTE_SUBNETS='192.168.244.0/24 192.168.28.0/22'/<code>


以上腳本和MacOS驅動已上傳到百度網盤,需要的話可自行下載:

<code>https://pan.baidu.com/s/16lspN4LFhUwNHyGhLPYK9g提取碼: 7zk1/<code>


常見問題

1. NETMASK為啥是 255.255.255.252

因為P2P對等網絡需要在本端和對端各設置一個IP,加上網絡號和廣播號,一組P2P鏈接需要佔用4個IP地址,掩碼 255.255.255.252 提供的IP數量剛好為4; 實例配置中被佔用的IP分別是:

<code>192.168.244.0  網絡號(不用)192.168.244.1  對端IP地址192.168.244.2  本端IP地址192.168.244.3  廣播地址(不用)/<code>

如果另外一個客戶端要連接VPN,手動分配的IP地址和是:

<code>192.168.244.5 對端 192.168.244.6 本端 /<code>


2. SSH連上了,本地靜態路由也加上了,但是ping不通對端網絡

可能您的服務端 iptables 配置了別的防火牆規則,禁止了網卡間的路由轉發,如果您知道在做什麼可以嘗試執行以下命令,清空防火牆規則

<code># !!!注意以下命令可能會影響某些基於iptables的服務,如 docker 等; 執行之後可能需要重啟這些服務# !!!iptables默認策略為REJECT的情況下將導致服務端網絡中斷,請慎重操作iptables -Fiptables -t nat -Fiptables -t filter -F# 然後重新加入iptables -t nat -A POSTROUTING -j MASQUERADE/<code>

3. 我和同事都連接上了,我們之間的網絡能否互通

可以,相互ping 雙方的本端IP地址即可,如上例中 192.168.244.2 192.168.244.6 是本端IP


開發人員如何舒爽的在家工作——VPN over SSH


分享到:


相關文章: