OpenVPN docker的簡單實踐

本文將主要分為以下幾個部分: 起因 How it works? VPS quick start OpenVPN with docker-compose OpenVPN 客戶端取得/使用 結語 ...

OpenVPN docker的簡單實踐

本文將主要分為以下幾個部分:


起因

之前在巴哈發過一篇利用Docker架設OpenVPN-AS教學
但因為OpenVPN-AS免費版有人數限制(2人)
前幾天有人私信問我, 有沒有辦法解除人數限制
我就回他說可以架設原生的OpenVPN
既然如此那就花點時間來寫個教學吧

不過注意本文將會有許多需要下指令的地方
幾乎沒有圖片只有文字原始碼
對於未接觸過linux的人, 有一定的挑戰性
所以不在乎人數限制的話 建議觀看之前的 教學 操作


How it works?

利用別人寫好的Dockerfile免除OpenVPN繁雜的設定
本教學利用kylemanna/docker-openvpn架設OpenVPN


VPS quick start

如果你已經有linux的VPS
並已安裝docker and docker-compose
請直接跳到OpenVPM with docker-compose

  • 確認自己有否有安裝

下列兩個指令都要有版本顯示

docker -v
docker-compose -v
  • 沒有安裝的話照下面指令安裝即可

  • docker install

curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh
# $user 為你的使用者名稱
sudo usermod -aG docker $user
  • docker-compose install
sudo mkdir -p /usr/local/bin 
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 
sudo chmod +x /usr/local/bin/docker-compose

對於VPS的架設上一篇教學有完整的教學
這次簡單介紹一下

建立VPS

  • 在VPS提供商(linode, Conoha, DigitalOcean 建立VPS
    • 如果使用GCP(google cloud platform) 則需要額外設定防火牆

如果你要使用Linode架設的話不妨使用我的Referral Code
https://www.linode.com/?r=e5f89dd4937737c10551f01bd9193de3beb274fc
當使用3個月以上我可收到20 USD 如果你不介意的話_(:3 」∠ )_ 先說聲謝謝
Promotion Code則是可以免費獲得額度
可以在下列網站找到 應該是可用的 不能的話儘量多找找 白嫖才是正義
2020/2/14 測試 "talkshow2020"是可用的 免費20USD
https://www.newcoupons.info/linode-coupon-promo-code/
https://www.retailmenot.ca/coupons/linode.com

  • linux image請選擇ubuntu 16.04(LTS) or ubuntu 18.04(LTS)

  • 進行ssh連線(windows請使用PieTTY之類的工具)

  • 進入後確定自己是root即可進行VPS設定

VPS設定

  • 利用shell script進行linux基本設定與docker的安裝
sh <(wget -qO - https://gist.githubusercontent.com/Sean2525/b09661f1da168c15ac97d3e349066969/raw/cb750e6abd03775da9dd0b5c7d1b59293890af97/install.sh)
  • 原始碼如下
  • 依序需要輸入的有

    1. username
    2. password
    3. confirm password
    4. port
  • 以上強調的資訊請記好, 然後輸入Y/y 進行安裝

  • 等待安裝完成後

  • 中斷連線然後使用上述的portusername進行登入

ssh -p port username@ip_address

GCP需要用網頁設定防火牆
你設定的ssh port記得要允許 如無更改則不需要
但OpenVPN所需要的1194記得要打開tcp/udp
其他廠商的VPS不需此動作


OpenVPN with docker-compose

  • 用新的使用者登入後在當前目錄(home)創建一個新目錄openvpn然後cd進去
mkdir openvpn ; cd openvpn

注意
不用&&的原因是因為上面VPS安裝的shell script
幫使用者將shell換成fish了
如果你是用bash
那就使用mkdir openvpn && cd openvpn

  • 增加一個新檔案 docker-compose.yml
    • 對於不知道如何使用編輯器(vim, nano)的人
    • 可以用以下指令來下載docker-compose.yml
wget https://gist.githubusercontent.com/Sean2525/2bc64e2436bfbff417e6768532e4bb70/raw/4b727fc1fda2e528e1a5ebbc6ad9eaf6853a3bff/docker-compose.yml
  • 檔案原始碼
  • 初始化config
docker-compose run --rm openvpn ovpn_genconfig -u udp://VPN.SERVERNAME.COM

VPN.SERVERNAME.COM請替換成你的IP地址

  • 初始化憑證
docker-compose run --rm openvpn ovpn_initpki

初始化過程中會要求你輸入PEM pass phrase
就請輸入你自己記得的密碼
將來跟OpenVPN有關的操作要輸入密碼都是用這個
Commom Name直接Enter即可

  • 啟動 OpenVPN server 服務
docker-compose up -d
  • 生成一個客戶端憑證
export CLIENTNAME="your_client_name"
# 有密碼 (recommended)
docker-compose run --rm openvpn easyrsa build-client-full $CLIENTNAME
# 無密碼 (not recommended)
docker-compose run --rm openvpn easyrsa build-client-full $CLIENTNAME nopass

your_client_name為你想要的客戶端名稱
之後本文有提到的 $CLIENTNAME 都會等於 your_client_name
$CLIENTNAME等於變數, 讓你下指令時比較方便
重新連線記得要export CLIENTNAME="your_client_name"
不然就把$CLIENTNAME都改成你自己所想要的名稱下指令就好

  • 使用嵌入式證書取得客戶的config
docker-compose run --rm openvpn ovpn_getclient $CLIENTNAME > $CLIENTNAME.ovpn

這個 $CLIENTNAME.ovpn 就是你的VPN設定檔
至於整麼使用/下載之後會提到

  • 撤銷客戶端證書 (如果你想刪除這個用戶就下此指令)
# 保留相應的crt,key和req文件。
docker-compose run --rm openvpn ovpn_revokeclient $CLIENTNAME
# 刪除相應的crt,key和req文件。
docker-compose run --rm openvpn ovpn_revokeclient $CLIENTNAME remove
  • 增加OpenVPN設定
    • (-e) 後面的字串就是要加入的設定
 docker-compose run --rm openvpn ovpn_genconfig -e 'duplicate-cn'

duplicate-cn可以讓同一個certificate/key給多位使用者同時使用
不設定的話就是一個客戶端憑證只能同時一位在線

  • 設定完成重啟openvpn
docker-compose restart

這樣子openvpn就安裝設定完成了

  • 之後許多操作完成後記得都要重啟

    • 新增使用者
    • 移除使用者
    • 更動OpenVPN Config設定
  • 還有要記得 cd 進入 openvpn 目錄才能執行指令

  • 最終完整的目錄

home
└── openvpn    <<< 指令必須得在這一層下才能下
    ├── docker-compose.yml
    ├── $CLIENTNAME.ovpn
    └── openvpn-data
        └── conf 
            ├── openvpn.conf
            ├── ...


OpenVPN 客戶端取得/使用

取得$CLIENTNAME.ovpn

  • 使用SFTP協定
    • Windows利用工具WINSCP
      • 利用圖形化介面找到$CLIENTNAME.ovpn並下載
    • Linux or Mac 使用指令sftp -P port username@IP
      • 都使用UNIX LIKE system了 想必應該都會吧

安裝客戶端

使用方式

  • 將$CLIENTNAME.ovpn匯入客戶端即可

結語

能完成這份教學,你對Docker有了相當程度的認識
對於沒有專業背景的人只要指令會下
就能利用他人寫好的Dockerfile, docker-compose.yml等等
完成架設許多服務
所以假設你有甚麼想架設的服務
不妨嘗試搜尋XXXX docker

以上的操作
有任何問題歡迎提問