架設自己 VPN,只要十分鐘!有了 docker 我們就可以自己在家快速的建立 IPsec VPN,隨時換回家裡的 ip,甚至可以設定 AdGuard DNS 防堵廣告!這邊分享一下我實作的過程。

首先列出我使用的裝置:

  1. SBC 一片
    主要是省電,如果要使用家裡的電腦取代也可以。
  1. linux 系統
    無論是  ubuntu, debian, armbian, raspberry OS 都可以!Windows 不在這次的討論範圍內。
  1. 固定 IP
    因為需要在 client 端設定 VPN 連線伺服器位置。如果家裡使用的 Wifi 分享器有提供免費的 DDNS 也行( tplink deco x60 有提供這個設定,好用推薦!),這樣動態 ip 也能用 domain name 的方式連線。假如家裡是中華電信光世代,都有免費提供一組固定 ip 哦!

啟動 VPN container

開始前,請先安裝好 Linux 系統,Docker ,docker-compose,以及網路等設定。

接著使用這份 yaml 檔起 docker 即可,其中幾個參數 VPN_IPSEC_PSK、VPN_USER、VPN_PASSWORD 需要自己給定:

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: <your_key>
      VPN_USER: <your_user_name>
      VPN_PASSWORD: <your_password>
      VPN_DNS_SRV1: 94.140.14.14
      VPN_DNS_SRV2: 94.140.14.15

networks:
  vpn-service:
    name: vpn-service-network
    driver: bridge

另外解釋幾個重要參數:

privileged: true
給此 container 有真正的 root 權限。一般是不建議使用此參數,但 hwdsl2/ipsec-vpn-server 的文件上有特別註明,推測應該是需要去動用到系統的網路相關硬體,所以才需要開此參數。

restart: always
container 當掉或系統重開機,就會自動重新啟動,不怕他死掉。

ports:
– “500:500/udp”
– “4500:4500/udp”

後面一定要接 /udp,不然 client 無法成功連線 VPN server。

VPN_IPSEC_PSK
設定金鑰,可使用這個網站來產生亂碼 https://passwordsgenerator.net/

VPN_USER
VPN 使用者帳號名稱

VPN_PASSWORD
VPN 使用者密碼

VPN_DNS_SRV1: 94.140.14.14
VPN_DNS_SRV2: 94.140.14.15

VPN 使用的 DNS,我這邊是給定 AdGuard DNS,如果沒有特定需求可以略過這個參數不給定。

接下來只需使用

docker-compose up -d

完成!可以檢查一下 log

docker logs -f vpn-service

如果有看到以下文字就是啟動成功!

IPsec PSK: xxxxxx
Username: xxxxxx
Password: xxxxxx

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

================================================

Redirecting to: /etc/init.d/ipsec start
Starting pluto IKE daemon for IPsec: .
xl2tpd[1]: Not looking for kernel SAref support.
xl2tpd[1]: Using l2tp kernel support.
xl2tpd[1]: xl2tpd version xl2tpd-1.3.12 started on 519ced3cfa09 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

設定防火牆

假如你的系統裡有之安裝防火牆,要記得開放 500 和 4500 port。
以 ufw 為例,可以使用以下指令:

sudo ufw 500 allow
sudo ufw 4500 allow

設定路由器

如果跑 VPN 的主機在路由器後面,共用同一組 Public IP 的話,記得到路由器裡面設定 port forwarding,把 500 和 4500 轉到 VPN 主機。

到這邊 VPN server 就已經架設完成,很快吧!趕快自己動手試試看!

參考資料

ipsec vpn server docker image:
https://hub.docker.com/r/hwdsl2/ipsec-vpn-server
https://github.com/hwdsl2/docker-ipsec-vpn-server

封面照片備註

攝影師:Stefan Coders,連結:Pexels

J
Written by J
雖然大學唸的是生物,但持著興趣與熱情自學,畢業後轉戰硬體工程師,與宅宅工程師們一起過著沒日沒夜的生活,做著台灣最薄的 intel 筆電,要與 macbook air 比拼。離開後,憑著一股傻勁與朋友創業,再度轉戰軟體工程師,一手扛起前後端、雙平台 app 開發,過程中雖跌跌撞撞,卻也累計不少經驗。可惜不是那 1% 的成功人士,於是加入其他成功人士的新創公司,專職開發後端。沒想到卻在採前人坑的過程中,拓寬了眼界,得到了深層的領悟。