使用 CentOS 7 架設 VPN Server (L2TP & IPSec)

Layer 2 Tunneling Protocol

主要想在公司環境增加一個 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 連線

  1. 系統偏好設定 > 網路 > 左下角「+」
  1. 介面:選擇「VPN」
  1. VPN類型:選擇「透過 IPSec 的 L2TP」
  1. 服務名稱:自行定議
  1. 建立完成後,進行 VPN 相關設定,輸入
    伺服器位址:「你的 VPN IP 或 Domain」
    帳號名稱:「使用者的帳號」
  1. 系統偏好設定 > 網路 > 左下角「+」
    使用者認證:「使用者的密碼」
    機器認證:「共享的密鑰」
  1. 進階設定:需勾選透過 VPN 傳送所有流量
  1. 選擇套用後,就可以進行「連線」

六、常見問題

  1. 如無法連線可先檢查 SELinux 設定,執行 setenforce 0 關閉 SELinux
[root@localhost vpn-service]$ setenforce 0
setenforce: SELinux is disabled
  1. 預設 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.confip池、内網IP
/etc/ppp/options.xl2tpdmtu、dns
/etc/ipsec.confIPSec主設定文件
/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提供请求從服務器内部轉向外部,外部回響轉向服務器内部