# WirdGuard VPN搭建 # 1. 什麼是VPN VPN的全稱名為Virtual Private Network以中文訴說也就是虛擬私人網絡,非常直白,虛擬的個人網路。原理以白話解說就是搭建了一個邏輯上的私有網路,讓連進去的設備能過互相訪問,這樣即使所有設備都不再同一實體區域網下,也可以透過VPN達成連線,不須使用公有IP。 如圖示: ![未命名](https://hackmd.io/_uploads/BkArJqT8Wx.png) VPN還有許多功能,像是替代IP與加密數據等。 替代IP這個功能其實很好想,與我們普通內網一樣可以使用NAT轉換來達成,什麼是NAT轉換?就是讓一個公共網絡IP能夠供給數十數百數千個設備使用的技術,不但讓內網設備能夠訪問外網還提升了安全性,除非內網主動發出連線不然正常來說外網有害設備是無法連線到內網的這些設備的,這也用於解決IPv4不足的危急。 至於數據加密也是簡單,VPN客戶端在發送封包前會先加密然後送出到VPN節點解密,就這樣。 # 2. 實作 VPN五花八門,我在這眾多之中選擇了WireGuard這個VPN沒有其他原因就是比較好搭建。 系統採用Linux Debian13。 參考文獻: https://officeguide.cc/ubuntu-linux-set-up-wireguard-vpn-server-tutorial-examples/ ## 1 設置服務器 ### 安裝wireguard `sudo apt update` `sudo apt install wireguard` ### 生成服務器密鑰 `wg genkey | sudo tee /etc/wireguard/private.key` `sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key` 這裡為了方便所以假設了公鑰和私鑰 公鑰: 3PgkeBhGHTjXXcoZF25V9I/adNNITbVRYjWz5ca6xkc= 私鑰: 8CF4Tbk9/fzvFbW+Q7hevYF203Dnba7XIip4eN1wQnY= ### 創建服務器文件 在/etc/wireguard/內創建 vpn.conf 這是一個用於在啟用時供服務器查看的設定檔案,請注意.conf前面是可以寫入隨機內容的,但是請記得你寫的名子。 ``` [Interface] Address = 10.0.0.1/24 SaveConfig = true PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o 網路卡名稱 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o 網路卡名稱 -j MASQUERADE ListenPort = 51820 PrivateKey = 服務器私鑰(剛剛生成的) 8CF4Tbk9/fzvFbW+Q7hevYF203Dnba7XIip4eN1wQnY= [Peer] PublicKey = 客戶端的公鑰(等下會教) AllowedIPs = 10.0.0.2/32 [Peer] PublicKey = 客戶端的公鑰(等下會教) AllowedIPs = 10.0.0.3/32 ``` ## 2客戶端配置 ### 下載wireguard客戶端 https://www.wireguard.com/install/ 選擇自己的系統版本去下載 ### WireGuard ![image](https://hackmd.io/_uploads/SkewUBevbl.png) 等下我們會按"從檔案導入隧道"將我們的配置導入 ### 創建檔案 打開任意編輯器,演示使用的是VScode。 ![image](https://hackmd.io/_uploads/Bkg1wSlw-x.png) 打開點擊左上角的File ![image](https://hackmd.io/_uploads/ryaxvrlDZx.png) 會找到New File並按下 ![image](https://hackmd.io/_uploads/S1Ofwrxwbl.png) 這裡輸入 "你想要的名子".conf ![image](https://hackmd.io/_uploads/SkGBDSxDbe.png) 選擇處存位置 ![image](https://hackmd.io/_uploads/ByPIwHlDbe.png) 在這邊寫入正確配置後並儲存 ### 配置文件撰寫 ``` [Interface] PrivateKey = 客戶端的私鑰(建議填寫與服務器公鑰一樣) 3PgkeBhGHTjXXcoZF25V9I/adNNITbVRYjWz5ca6xkc= Address = 10.0.0.4/24 DNS = 1.1.1.1, 8.8.8.8 [Peer] PublicKey = 服務器公鑰(剛剛那個) 3PgkeBhGHTjXXcoZF25V9I/adNNITbVRYjWz5ca6xkc= AllowedIPs = 0.0.0.0/0 Endpoint = 你VPN節點的IP:51820 PersistentKeepalive = 25 ``` ### 導入並獲取客戶端公鑰 ![image](https://hackmd.io/_uploads/ryCDxUew-l.png) 點選"從檔案中匯入隧道" ![image](https://hackmd.io/_uploads/B1hdxLlPWl.png) 選取檔案 ![image](https://hackmd.io/_uploads/B1XYl8xw-x.png) 這邊就會顯示出客戶端的公鑰也就是 `nelLa/Fg7O8nPc95zFpoHUS1oS63dO4WYc/vFXgmvy4=` 接著便可將這個公鑰填寫入服務器vpn.conf中"客戶端的公鑰"的地方 ## 3 連線 ### 隧道指令(服務器) 啟用隧道 `wg-quick up vpn(這邊填入你放在/etc/wireguard/中.conf前面的編號不一定是vpn)` 這樣就可以進行連接了 關閉隧道 `wg-quick down vpn(這邊填入你放在/etc/wireguard/中.conf前面的編號不一定是vpn)` 查看隧道狀態 `sudo wg show` ### 連線VPN(客戶端) ![背景](https://hackmd.io/_uploads/rki-rUxvZg.png) 點擊連線(我已經將敏感信息屏蔽) ![2](https://hackmd.io/_uploads/HJ8bB8eDbl.png) 點擊確認流量是否浮動(如果是只有b沒有kb或mb的話我說單位就是連線失敗,可能是密鑰不符)