Try   HackMD

如何建立自己的免費遊戲VPN

hackmd-github-sync-badge

我們將會:

  1. 利用Oracle Cloud建立免費的VPS伺服器
  2. 在VPS上建立WireGuard VPN伺服器
  3. 在Windows上利用WireSock連結VPN伺服器並達到分割通道的功能

利用Oracle Cloud建立免費的VPS伺服器

註冊帳號

  1. 進入網頁 https://www.oracle.com/tw/cloud/free/ 點選「開始免費試用」。依照指示完成註冊帳號。
  • 依照遊戲需求,選擇主區域。若沒有特別需求就選日本東京。
  • 你會需要一張信用卡
  • 如果有困難,可以參考 https://izo.tw/oracle-cloud-vps-apply/
  • 如果即使填了真實資料還是怎麼樣都註冊不過,可以找朋友幫忙註冊(認真)

建立VPS伺服器

  1. 註冊完進入 https://cloud.oracle.com/ 登入並準備建立自己的VPS伺服器。
  2. 點選「建立VM執行處理」
  3. 在這裡,我們將映像檔變更為Ubuntu(因筆者比較熟Ubuntu) A. 點選圖片中的編輯 B. 選擇變更映像檔 C. 選擇Canonical Ubuntu並按選取映像檔
  4. 點選「儲存私密金鑰」下載SSH金鑰(請務必下載!)
  5. 按「建立」。這樣我們就建好VPS了!
  6. 在建立完成的頁面可以看到「公用 IP 位址: xxx.xxx.xxx.xx」。請記下這個ip位置。

在VPS上建立WireGuard VPN伺服器

我們首先要利用SSH連上伺服器終端,請先閱讀{利用SSH和私密金鑰連結伺服器}。再來我們可以在伺服器本機配置WireGuard或是利用Docker配置WireGuard。如果怕麻煩就使用Docker,詳見{使用Docker建立WireGuard伺服器}。如果想要自己動手操作,就參照{建立WireGuard VPN伺服器}。接著不論你使用Docker或是本機配置,都要開啟Oracle伺服器對外port

利用SSH和私密金鑰連結伺服器

  1. 我們將使用Windows系統和MobaXterm說明如何連線。(當然,你可以使用別的軟體,參閱 https://izo.tw/ssh-putty/
  2. 將MobaXterm更新到最新版本
  3. 在MobaXterm介面左上點選Session並選擇SSH
  4. 在Remote host輸入剛剛記下的ip位置。打勾Specify username並輸入ubuntu。
  5. 點選Advanced SSH settings,打勾Use private key並點選右側按鈕選擇剛剛下載的私密金鑰檔案。
  6. 點選OK
  7. 這時候如果你沒輸入錯誤應該會看到成功進入終端介面。

建立WireGuard VPN伺服器

  1. (本節部分取自 https://www.cyberciti.biz/faq/ubuntu-20-04-set-up-wireguard-vpn-server/
  2. 安裝WireGuard。在終端輸入:
sudo apt update
sudo apt install wireguard -y
  1. 生成WireGuard用戶端用的privatekey和publickey。在終端輸入:
wg genkey | tee privatekey | wg pubkey > publickey
cat privatekey
cat publickey

  • 記下這兩組key!
  1. 生成WireGuard伺服器用的privatekey和publickey。在終端輸入:
sudo -i
cd /etc/wireguard/
umask 077; wg genkey | tee privatekey | wg pubkey > publickey
cat privatekey
cat publickey

  • 記下這兩組key!
  1. 記下網路裝置的名字:
ip link show

  • 圖中紅色底線為網路裝置的名字,如果你的系統版本跟我一樣,那應該是寫ens3
  1. 輸入nano /etc/wireguard/wg0.conf編輯伺服器設定檔如下。請注意將「伺服器privatekey」和「用戶端publickey」換成剛剛分別在3.和2.記下的內容。
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = 伺服器privatekey
SaveConfig = false
PostUp = /etc/wireguard/helper/add-nat-routing.sh
PostDown = /etc/wireguard/helper/remove-nat-routing.sh

[Peer]
PublicKey = 用戶端publickey
AllowedIPs = 10.8.0.2/32
  1. 編輯完成後依序按Ctrl+xyEnter儲存並離開編輯器。
  2. 建立用來處理防火牆規則的script。建立資料夾,並利用nano編輯檔案。
mkdir -v /etc/wireguard/helper/
nano /etc/wireguard/helper/add-nat-routing.sh
  1. 複製貼上以下內容並如第六步儲存離開。(如果你的網路裝置名字不一樣,把ens3換成它的名字)
#!/bin/bash
IPT="/sbin/iptables"
IPT6="/sbin/ip6tables"

IN_FACE="ens3"                   # NIC connected to the internet
WG_FACE="wg0"                    # WG NIC
SUB_NET="10.8.0.0/24"            # WG IPv4 sub/net aka CIDR
WG_PORT="51820"                  # WG udp port
SUB_NET_6="fd42:42:42:42::/112"  # WG IPv6 sub/net

## IPv4 ##
$IPT -t nat -I POSTROUTING 1 -s $SUB_NET -o $IN_FACE -j MASQUERADE
$IPT -I INPUT 1 -i $WG_FACE -j ACCEPT
$IPT -I FORWARD 1 -i $IN_FACE -o $WG_FACE -j ACCEPT
$IPT -I FORWARD 1 -i $WG_FACE -o $IN_FACE -j ACCEPT
$IPT -I INPUT 1 -i $IN_FACE -p udp --dport $WG_PORT -j ACCEPT
  1. 建立另一個檔案remove-nat-routing.sh,在檔案裡貼上以下內容並儲存離開。
  • 終端輸入:
nano /etc/wireguard/helper/remove-nat-routing.sh
  • remove-nat-routing.sh內容:
#!/bin/bash
IPT="/sbin/iptables"
IPT6="/sbin/ip6tables"

IN_FACE="ens3"                   # NIC connected to the internet
WG_FACE="wg0"                    # WG NIC
SUB_NET="10.8.0.0/24"            # WG IPv4 sub/net aka CIDR
WG_PORT="51820"                  # WG udp port
SUB_NET_6="fd42:42:42:42::/112"  # WG IPv6 sub/net

# IPv4 rules #
$IPT -t nat -D POSTROUTING -s $SUB_NET -o $IN_FACE -j MASQUERADE
$IPT -D INPUT -i $WG_FACE -j ACCEPT
$IPT -D FORWARD -i $IN_FACE -o $WG_FACE -j ACCEPT
$IPT -D FORWARD -i $WG_FACE -o $IN_FACE -j ACCEPT
$IPT -D INPUT -i $IN_FACE -p udp --dport $WG_PORT -j ACCEPT
  1. 建立系統ip forward規則。輸入nano /etc/sysctl.d/10-wireguard.conf並編輯如下:
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
  1. 輸入以下終端指令開始wiregaurd服務。
sysctl -p /etc/sysctl.d/10-wireguard.conf
chmod -v +x /etc/wireguard/helper/*.sh
systemctl enable wg-quick@wg0.service
systemctl start wg-quick@wg0.service
  1. (終於)完成!這時候可以斷開和伺服器的連結!

使用Docker建立WireGuard伺服器

  1. 安裝Docker: (參照 https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository
sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
  1. 檢查Docker是否正常執行:
service docker status

  • 看到Active: active (running)表示沒問題,按下Ctrl+C跳出
  1. 將自己使用者帳號加入docker群組:
sudo usermod -aG docker ubuntu
newgrp docker
  1. 收集必要資訊:
id ubuntu

  • 記下uid以及gid
  1. 利用Docker部署WireGuard伺服器:
docker run -d \
  --name=wireguard \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_MODULE \
  -e PUID=1001 \
  -e PGID=1001 \
  -e TZ=Asia/Taipei \
  -e SERVERURL=伺服器ip位置 \
  -e PEERS=1 \
  -e PEERDNS=8.8.8.8,8.8.4.4 \
  -e INTERNAL_SUBNET=10.8.0.0/24 \
  -e ALLOWEDIPS=0.0.0.0/0 \
  -e LOG_CONFS=true \
  -p 51820:51820/udp \
  -v /home/ubuntu/wireguard/config:/config \
  --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
  --restart unless-stopped \
  lscr.io/linuxserver/wireguard:latest
  • PUID為上一步中的uidPGID為上一步中的gid
  • 伺服器ip位置換成剛剛記下的ip
  1. 將客戶端所需資訊提出:
cat /home/ubuntu/wireguard/config/peer1/peer1.conf

7. 在客戶端(自己的電腦)新增一個檔案wg0.conf,將上一步回傳的內容複製進去,保存。

開啟Oracle伺服器對外port

  1. https://cloud.oracle.com/networking/vcns ,點選vcn-xxxxx--> subnet-xxx-x-> Default security...
  2. 點選新增傳入規則,並如圖片輸入:
  3. 點選新增傳入規則儲存規則

在Windows上利用WireSock連結VPN伺服器並達到分割通道的功能

本節介紹如何使用WireSock或是它的一個GUI版本:TunnlTo來連線WireGuard伺服器。相較於一般的WireGuard用戶端,透過WireSock能夠以程序名稱來實現分割通道,這樣就可以很簡單的應用在遊戲上。

利用WireSock連線VPN

  1. 我們將以Firefox為例,實現只將Firefox通過VPN。
  2. 新增一個檔案wg0.conf,並編輯為以下內容(請將用戶端privatekey伺服器publickey伺服器ip位置變更為剛剛記下的內容):
[Interface]
PrivateKey = 用戶端privatekey
Address = 10.8.0.2/24
DNS = 8.8.8.8, 8.8.4.4

[Peer]
PublicKey = 伺服器publickey
AllowedIPs = 0.0.0.0/0
Endpoint = 伺服器ip位置:51820
PersistentKeepalive = 15

AllowedApps = firefox.exe
  • 如果使用Docker建立WireGuard伺服器則可以直接編輯先前保存好的檔案
  1. 下載並安裝WireSock
  2. 打開powershell或命令提示字元,執行WireSock。注意必須把YOUR_PATH換成剛剛建立的wg0.conf的路徑!
wiresock-client.exe run -config "C:\YOUR_PATH\wg0.conf" -log-level info
  1. 可以打開Firefox和Edge驗證ip是否改變:
  • (成功了!太好了!)

利用TunnlTo連線VPN

如果不喜歡指令介面,可以考慮使用TunnlTo的圖形介面。(這個軟體還在開發中,可能會遇到一些bug,本文撰寫時為v0.1.4版)

  1. https://github.com/TunnlTo/desktop-app/releases/latest/ 下載並安裝最新的TunnlTo版本。
  2. 打開TunnlTo並按Add Tunnel,填入需要的內容,並按Save儲存:
  • 請將用戶端privatekey伺服器publickey伺服器ip位置變更為剛剛記下的內容!
  • 可以將Allowed Apps寫入想要連線vpn的軟體,在這裡我們以firefox為例
  1. 點選Enable並打開Firefox測試看看是否連線成功!

其他WireSock使用方法

使用範例:只將遊戲Final Fantasy XIV的連線通過VPN

  • 修改AllowedApps指定為Final Fantasy XIV的程序 AllowedApps = ffxivlauncher.exe, ffxiv_dx11.exe

其他WireSock功能

WireSock 有一些一般的Wireguard VPN client沒有的功能。可以編輯.conf檔或是在TunnlTo裡面輸入來設定。以下翻譯 https://www.wiresock.net/ 的內容:

  • AllowedApps - 指定用逗號分隔的應用程式名稱(或部分名稱)清單,透過 VPN 隧道傳送。這個參數縮小了 AllowedIPs,所以要隧道化的流量應該同時符合 AllowedIPs 和 AllowedApps。例如,'AllowedApps = chrome' 和 'AllowedIPs = 0.0.0.0/0' 會將 Chrome 瀏覽器傳送到 VPN 連接,其他所有東西都會繞過隧道。
  • DisallowedApps - 指定用逗號分隔的應用程式名稱(或部分名稱)清單,排除在隧道外。這個參數是 AllowedApps 的相反。請注意,AllowedApps 優先,如果指定了兩者,則會先使用 AllowedApps。
  • DisallowedIPs - 指定用逗號分隔的 IP 子網清單,排除在隧道外。例如,AllowedIps = 0.0.0.0/0 和 DisallowedIPs = 192.168.0.1/24 會排除在隧道中的 192.168.0.1/24。
  • WireGuard 透過 SOCKS5 代理連線的參數:
    • Socks5Proxy - 指定 SOCKS5 代理端點,例如 Socks5Proxy = socks5.sshvpn.me:1080 或 Socks5Proxy = 13.134.12.31:1080
    • Socks5ProxyUsername - 指定 SOCKS5 用戶名(可選)
    • Socks5ProxyPassword - 指定 SOCKS5 密碼(可選)

FAQ

我無法用SSH連線到VPS?

請確認你的MobaXterm是最新版本。某些舊版本的OpenSSH加密有些問題。

我的Oracle VPS 無法成功sudo apt update

請確認你的Oracle雲端傳出規則(到 https://cloud.oracle.com/networking/vcns ,點選vcn-xxxxx--> subnet-xxx-x-> Default security...->傳出規則)有設定規則,如圖中設定。

我連上VPN後但沒有網路?

這可能有很多原因。如:DNS設定錯誤、金鑰輸入錯誤、伺服器位置錯誤等等。請確認每個步驟的檔案都有編輯正確。使用TunnlTo也許會遇到不可預期的問題,如果遇到困難建議使用WireSock指令界面。


雜記

  • 2022.12.21 初版編寫完成。
  • 2022.12.22 @jacky50403 新增了使用Docker配置的方法。
  • 感謝WireSock的作者製作強大的軟體
  • 感謝TunnlTo的作者幫忙解決繁體中文的bug