
主要想在公司環境增加一個 VPN 環境,讓在外的同仁可以先連到 VPN Server 在進行「主機」或「服務」的存取,這樣一來就不需要直接把公司內部的資訊曝露在外網,在安全性上也多了一份保險。
現在人手一機的年代,自行輸入 VPN 相關資訊,啟用連線就可以馬上連到你要的服務群中。
之前架了一台 PPTP VPN Server,但主要 iOS 10 之後就不在支援 PPTP 協定,所以這 PPTP VPN Server 就沒有用了,後來就開始找有問 L2TP (Layer 2 Tunneling Protocol )協定的 Server 安裝教學,找到了一個不錯用的 Docker image,快速架設好之後,iPhone 手機就能馬上用了,趕緊筆記一下。
一、環境架設
需要先準備以下服務
二、建立 docker-compose.yaml
vim docker-compose.yaml
[root@localhost ~]$ cd /home/
[root@localhost home]$ mkdir vpn-service
[root@localhost home]$ cd vpn-service
[root@localhost vpn-service]$ vim docker-compose.yaml
version: '2.3'
services:
vpn-service:
image: hwdsl2/ipsec-vpn-server:latest
container_name: vpn-service
privileged: true
restart: always
mem_limit: 64M
logging:
driver: "json-file"
options:
max-size: "1k"
max-file: "3"
ports:
- "500:500/udp"
- "4500:4500/udp"
networks:
- vpn-service
environment:
VPN_IPSEC_PSK: "********" #共享的金鑰
VPN_USER: "account" #使用者的帳號
VPN_PASSWORD: "password" #使用者的密碼
networks:
vpn-service:
name: vpn-service-network
driver: bridge
:wq #(存檔離開)
[root@localhost vpn-service]$
三、啟動 vpn-service 服務
- 啟用服務:
docker-compose up -d - 查看是否啟動:
docker ps -a
[root@localhost vpn-service]$ docker-compose up -d
Creating network "vpn-service-network" with driver "bridge"
Creating vpn ... done
[root@localhost vpn-service]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
xxxx hwdsl2/ipsec-vpn-server:latest "/opt/src/run.sh" 3 min ago Up 3 min 0.0.0.0:500->500/udp, vpn-service
:::500->500/udp,
0.0.0.0:4500->4500/udp,
:::4500->4500/udp
[root@localhost vpn-service]$
四、查看日誌確認服務
- 查看服務日誌檔:
docker logs -f vpn-service
[root@localhost vpn-service]$ docker logs -f vpn-service Server IP: xxx.xxx.xxx.xxx IPsec PSK: ********* Username: ********* Password: ********* Write these down. You'll need them to connect! Important notes: https://git.io/vpnnotes2 Setup VPN clients: https://git.io/vpnclients IKEv2 guide: https://git.io/ikev2docker ================================================ xl2tpd[1]: Not looking for kernel SAref support. xl2tpd[1]: Using l2tp kernel support. xl2tpd[1]: xl2tpd version xl2tpd-1.3.16 started on 73dc289b77d7 PID:1 xl2tpd[1]: Written by Mark Spencer, Copyright (C) 1998, Adtran, Inc. xl2tpd[1]: Forked by Scott Balmos and David Stipp, (C) 2001 xl2tpd[1]: Inherited by Jeff McAdams, (C) 2002 xl2tpd[1]: Forked again by Xelerance (www.xelerance.com) (C) 2006-2016 xl2tpd[1]: Listening on IP address 0.0.0.0, port 1701 driver: "json-file" [root@localhost vpn-service]$
看到以上資訊後,代表服務已啟用
五、Mac OS 建立 VPN 連線
- 系統偏好設定 > 網路 > 左下角「+」

- 介面:選擇「VPN」

- VPN類型:選擇「透過 IPSec 的 L2TP」

- 服務名稱:自行定議

- 建立完成後,進行 VPN 相關設定,輸入
伺服器位址:「你的 VPN IP 或 Domain」
帳號名稱:「使用者的帳號」

- 系統偏好設定 > 網路 > 左下角「+」
使用者認證:「使用者的密碼」
機器認證:「共享的密鑰」

- 進階設定:需勾選透過 VPN 傳送所有流量

- 選擇套用後,就可以進行「連線」

六、常見問題
- 如無法連線可先檢查 SELinux 設定,執行
setenforce 0關閉 SELinux
[root@localhost vpn-service]$ setenforce 0 setenforce: SELinux is disabled
- 預設 DHCP IP 範圍 (192.168.42.10~192.168.42.250),因網段需求,可自行調整 DHCP IP 範圍
[root@localhost vpn-service]$ docker exec -it vpn-service bash
bash-5.1$ vi /opt/src/run.sh
#可修改第 250~252 行 IP 即可
L2TP_NET=${VPN_L2TP_NET:-'192.168.42.0/24'}
L2TP_LOCAL=${VPN_L2TP_LOCAL:-'192.168.42.1'}
L2TP_POOL=${VPN_L2TP_POOL:-'192.168.42.10-192.168.42.250'}
:wq
bash-5.1$ exit
[root@localhost vpn-service]$ docker-compose restart
Restarting vpn ... done
[root@localhost vpn-service]$
七、筆記
配置文件
| 設定文件路徑 | 設定内容 |
|---|---|
| /etc/xl2tpd/xl2tpd.conf | ip池、内網IP |
| /etc/ppp/options.xl2tpd | mtu、dns |
| /etc/ipsec.conf | IPSec主設定文件 |
| /etc/ipsec.secrets | 共享的密鑰 |
| /etc/ipsec.d/l2tp_psk.conf | 服务器 IP |
| /etc/ppp/chap-secrets | 帳號密碼 |
| /etc/sysctl.conf | 開啟内部轉發 |
| /var/log/secure | 日誌 |
所需安裝的插件
| 软件 | 作用 |
|---|---|
| libreswan(ipsec) | 提供一个密鑰 |
| ppp | 撥號軟體,提供用户名和密碼 |
| xl2tpd | 提供L2TP服務 |
| sysctl | 提供服務器内部轉發 |
| iptables | 提供请求從服務器内部轉向外部,外部回響轉向服務器内部 |