Wireguard筆記(三) lan-to-lan子網穿透和多網段並存


目錄

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中的機器互相通信.

阿里雲服務器的配置

  1. 首先創建一個安全組, wireguard peer所在機器單獨放到這個安全組
  2. 給這個機器升級內核到5.6.x以上, 開啟wireguard, 安裝對應的工具wg-quick等
  3. 啟動服務, 從異地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, 不能連.

公司內網服務器的配置

  1. 創建新虛機
  2. 升級內核至5.6+, 開啟wireguard, 安裝wg-quick
  3. 創建配置文件, 與阿里雲的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這個網段的下一跳指向上面配置好的機器

問題排查

如果連接有問題, 按以下步驟排查

  1. 隧道是否通: 兩個節點用隧道IP互相ping是否有響應, 這步必須是通的, 否則后面都不需要試了肯定不行
  2. 隧道節點ping對方子網
  3. 子網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節點的子網


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM