OpenVPN

回覆文章
yehlu
Site Admin
文章: 3245
註冊時間: 2004-04-15 17:20:21
來自: CodeCharge Support Engineer

OpenVPN

文章 yehlu »

https://mino.tw/openvpn-docker-composede-jian-yi/

OpenVPN docker的簡單實踐
本文將主要分為以下幾個部分:

起因
How it works?
VPS quick start
OpenVPN with docker-compose
OpenVPN 客戶端取得/使用
結語
起因
之前在巴哈發過一篇利用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/relea ... ose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
對於VPS的架設上一篇教學有完整的教學
這次簡單介紹一下

基本步驟如下
建立VPS
VPS設定
建立VPS
在VPS提供商(linode, Conoha, DigitalOcean 建立VPS
如果使用GCP(google cloud platform) 則需要額外設定防火牆
因為線路問題 個人目前已經從Conoha轉移到Linode了
如果你要使用Linode架設的話不妨使用以下連結註冊
https://www.linode.com/?r=e5f89dd493773 ... e3beb274fc
當使用3個月以上我可收到20$USD 如果你不介意的話_(:3 」∠ )_ 先說聲謝謝

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/Sean ... install.sh)
原始碼如下
echo "Add new username passwd and change port"
read -p "user(default ubuntu):" user
if [ -z "$user" ]; then
user=ubuntu
fi

while [ 1 ]; do
stty -echo
read -p "Enter new UNIX password:" password && echo
read -p "Retype new UNIX password:" confirmPassword && echo
stty echo
if [ "$password" = "$confirmPassword" ]; then
if [ -z "$password" ]; then
echo "No password supplied"
else
break
fi
else
echo "Sorry, passwords do not match"
fi
done
echo "Port recommended range is 10000 ~ 65535"
read -p "port(default 22):" port
if [ -z "$port" ] || [ "$port" -gt 65535 -o "$port" -lt 1 ]; then
port=22
fi
read -p "Ready to start?(Y/N)" confirm
run(){
# install something
apt-get update && apt-get install -y git curl fail2ban make fish pssh
# useradd
useradd -ms /usr/bin/fish $user && echo "$user:$password" | chpasswd && adduser $user sudo
#-----------------sshd config-----------------------
# change ssh port
sed -i "s/^#\?\(Port\).*/\1 $port/g" /etc/ssh/sshd_config
# disable root login
sed -i "s/^\(PermitRootLogin\).*/\1 no/g" /etc/ssh/sshd_config
# enable PasswordAuth
sed -i "s/^#\?\(PasswordAuthentication\).*/\1 yes/g" /etc/ssh/sshd_config
# restart ssh
service ssh restart
#-----------------sshd end--------------------------
#-----------------fail2ban config-------------------
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sed -i "s/\(port *=.*\)ssh/\1$port/g" /etc/fail2ban/jail.local
fail2ban-client reload
#-----------------fail2ban end----------------------
#-----------------docker install--------------------
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh
sudo usermod -aG docker $user
sudo mkdir -p /usr/local/bin
curl -L https://github.com/docker/compose/relea ... ose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
#-----------------docker end------------------------
rm -f get-docker.sh wget-log
echo "Installation complete!"
}

if [ "$confirm" = "Y" -o "$confirm" = "y" ]; then
run
else
exit 0
fi
view rawinstall.sh hosted with ❤ by GitHub
依序需要輸入的有

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

等待安裝完成後

請中斷連線然後使用上述的port與username進行登入

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/Sean ... ompose.yml
檔案原始碼
version: '2'
services:
openvpn:
cap_add:
- NET_ADMIN
image: kylemanna/openvpn
container_name: openvpn
ports:
- "1194:1194/udp"
restart: always
volumes:
- ./openvpn-data/conf:/etc/openvpn
view rawdocker-compose.yml hosted with ❤ by GitHub
初始化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了 想必應該都會吧
安裝客戶端
Windows
Android
IOS
使用方式
將$CLIENTNAME.ovpn匯入客戶端即可
結語
能完成這份教學,你對Docker有了相當程度的認識
對於沒有專業背景的人只要指令會下
就能利用他人寫好的Dockerfile, docker-compose.yml等等
完成架設許多服務
所以假設你有甚麼想架設的服務
不妨嘗試搜尋XXXX docker

以上的操作
有任何問題歡迎提問
回覆文章

回到「Docker」