目錄
Wireguard筆記(一) 節點安裝配置和參數說明
Wireguard筆記(二) 命令行操作
Wireguard筆記(三) lan-to-lan子網穿透和多網段並存
多 Wireguard 服務並存
可以在/etc/wireguard/下創建多個配置文件, 例如wg0.conf, wg1.conf配置多個服務
- 分別使用systemctl enable/start wg-quick@wg0, systemctl enable/start wg-quick@wg1 啟動
- 使用wg show能同時看到這些wiguard服務的連接情況
- 各配置使用不同的隧道網段, 會體現到route上
- 各配置當中, peer中的allowedIP會影響route規則, 如果相同會產生沖突
對於非服務端, 配置文件的例子為
[root@vm_ci01 ~]# more /etc/wireguard/wg0.conf
[Interface]
PrivateKey = [填入私鑰]
Address = 10.253.0.3/32
ListenPort = 50004
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -A FORWARD -o %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -D FORWARD -o %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = [填入服務端的公鑰]
AllowedIPs = 10.253.0.0/24,192.168.116.0/24
Endpoint = 1.123.45.67:50004(服務端的IP端口)
PersistentKeepalive = 25
用 Wireguard 實現 lan-to-lan
需求: 用阿里雲的彈性公網IP創建一個wireguard節點, 讓公司內網lan接入, 接入后阿里雲VPC中的機器可以與公司lan中的機器互相通信.
阿里雲服務器的配置
- 首先創建一個安全組, wireguard peer所在機器單獨放到這個安全組
- 給這個機器升級內核到5.6.x以上, 開啟wireguard, 安裝對應的工具wg-quick等
- 啟動服務, 從異地lan的節點建立連接, 讓節點間互通
配置示例
[g01 ~]# more /etc/wireguard/wg0.conf
[Interface]
PrivateKey = +123123Hw=
Address = 10.252.0.1/24
ListenPort = 50004
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -A FORWARD -o %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -D FORWARD -o %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# Server1: office - gw
[Peer]
PublicKey = +123123Hw=
AllowedIPs = 10.252.0.2/32,192.168.15.0/24 (兩部分, 一個是對方peer的隧道IP, 另一個是對方的內網IP段)
而后, 需要在阿里雲中配置
- VPC的路由表
- 在
自定義
部分, 增加目標網段(異地lan)的跳轉, 下一跳指向剛才創建的wireguard節點.
- 在
- wireguard節點所在的安全組
- 出方向默認是全放行, 不需要改
- 入方向分三部分, 一部分是授權所有來源, 僅開放提供服務的端口, 例如80, 443, 50004等, 這里要把wireguard的端口打開
- 入方向的第二部分是默認的允許所有來源, 所有端口, 協議類型ICMP, 這部分是允許ping
- 入方向的第三部分是為了lan to lan設置的: 允許來源阿里雲內網的IP段, 端口所有, 協議全部. 這一條不加, 就只能ping, 不能連.
公司內網服務器的配置
- 創建新虛機
- 升級內核至5.6+, 開啟wireguard, 安裝wg-quick
- 創建配置文件, 與阿里雲的wireguard節點互通
配置示例
[c01 ~]# more /etc/wireguard/wg1.conf
[Interface]
PrivateKey = +123123Hw=
Address = 10.252.0.2/32
ListenPort = 50003
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -A FORWARD -o %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -D FORWARD -o %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# Aliyun gw
[Peer]
PublicKey = +123123Hw=
AllowedIPs = 10.252.0.0/24,192.168.123.0/20 (兩部分, 一個是對方peer的IP, 因為對方是個接入點, 所以配了整個IP段; 另一個是對方的內網IP段)
Endpoint = 123.45.67.89:50004 (公網IP)
PersistentKeepalive = 25 (主動保持連接)
而后, 需要在本地路由器上配置
- 路由表: 將192.168.123.0/20這個網段的下一跳指向上面配置好的機器
問題排查
如果連接有問題, 按以下步驟排查
- 隧道是否通: 兩個節點用隧道IP互相ping是否有響應, 這步必須是通的, 否則后面都不需要試了肯定不行
- 隧道節點ping對方子網
- 子網ping對方子網
如果有問題, 用traceroute, tracepath, tracert這些命令看看包到哪里停住的, 如果最后一個包已經到了遠端的隧道節點, 說明本端配置是對的, 需要檢查隧道中間的節點或者對方節點.
lan-to-lan 的配置要點
配置部分需要注意: 兩個peer在配置上都需要給對方的allowedIPs加上對方的子網IP段, 這個很重要
- wireguard節點往本子網IP段的訪問, 使用的都是子網IP段, 不需要額外路由
- wireguard節點收到返回的包后, 需要將包發回原請求方時, 看的是allowedIPs, 如果原請求方是隧道節點, 則此隧道IP必須指向正確的返回路徑下一跳節點, 如果原請求方是隧道外的機器, 那么不僅它的入口隧道IP路徑需要正確, 原請求方的子網IP也必須指向正確的下一跳節點.
不同配置下的訪問情況
- 前提條件
- A和B都已經在sysctl中開啟了ip forward, 在wireguard配置PostUp中開啟了轉發
- A,B都不給對方的allowedIPs加子網IP段
- 只有A和B之間能通過隧道IP通信, A不能訪問B后面的子網, 反之亦然, 因為A和B只會轉發隧道IP段的包, 往子網IP段的包不會發入隧道
- A子網的機器不能訪問B子網的機器, 反之亦然.
- A給B的allowedIPs配了子網IP段, 但是B沒給A配
- A能訪問B后面的子網
- 任何連入隧道的節點, 如果將B的子網IP段配置到A上, 也能通過A訪問B的子網
- A的子網其他機器, 通過A不能訪問B后面的子網, 用tracert可以看到, 有過去的包但是沒有返回的包
- B不能訪問A后面的子網
- A和B都給對方的AllowedIPs配置了對方的子網IP段
- A和B都能訪問對方后面的子網
- A的子網其他機器, 通過A可以訪問B的子網機器, 反之亦然
綜上:
- 開啟了轉發的wireguard節點, 假設為A, 相當於對隧道中的所有節點開放了自己的子網
- 隧道中的節點B僅需要給A節點allowedIPs配置上A的子網IP段, 就能訪問A的子網
- 如果節點B也開啟了轉發, 那么給A節點allowedIPs配置上A的子網IP段后, A的子網機器也能訪問B節點的子網