Linux

僅路由wireguard VPN中的專用網路

  • September 13, 2021

我在 NAT 路由器後面有幾台主機,我想通過wireguard VPN 訪問它們。我可以成功配置專用網路,但仍有一些讓我感到困惑的事情。

我希望每個同伴:

  • 172.9.9.*通過VPN(通過wg0)相互訪問()
  • 訪問 VPN 之外的所有其他主機(通過eth0)。

這是網路和目前配置的架構:

┌─────┐    ┌──────────┐    ┌─────┐
│  S  ├────┤ Internet ├────┤  A  │
└─────┘    └───┬──────┘    └─────┘
              │
              │
         ┌────┴─────┐
         │ NAT DHCP │
      ┌──┤  Router  ├──┐
      │  └──────────┘  │
      │                │
   ┌──┴──┐          ┌──┴──┐
   │  X  │          │  B  │
   └─────┘          └─────┘
  • S是 VPN 伺服器,可通過靜態 IP 在 Internet 上訪問;
  • X是一個“計算伺服器”,它可以訪問網際網路,但在 NAT 之後,它的 IP 是動態的,事先不知道;
  • A是一個想要連接的“遠端客戶端” X
  • B是一個想要連接的“本地客戶端”,X它在同一個本地網路中。

我想要那個A並且B可以X通過連接S,但是所有這些主機都應該只在相互聯繫時使用 VPN,而不是在訪問網際網路時。

因此,例如,A可以直接 ping google.com,但會X通過S.

在搜尋和閱讀文件之後,我仍然不清楚是否可以在不使用的情況下執行此操作iptables,以及是否可以僅使用wireguard 配置來執行此操作。

目前配置如下:

## S wg0.conf

[Interface]
PrivateKey = S-private-key
Address = 172.9.9.1/24
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820

[Peer]
# A
PublicKey = A-public-key
AllowedIPs = 172.9.9.100/32

[Peer]
# B
PublicKey = B-public-key
AllowedIPs = 172.9.9.101/32

[Peer]
# X
PublicKey = X-public-key
AllowedIPs = 172.9.9.10/32
# A wg0.conf

[Interface]
Address = 172.9.9.100/24
PrivateKey = A-private-key
DNS = 1.1.1.1

[Peer]
PublicKey = S-public-key
Endpoint = S-ip-address:51820
AllowedIPs = 0.0.0.0/0, ::/0

B的配置與 類似A,但使用 IP172.9.9.101和不同的私鑰。

# X wg0.conf

[Interface]
Address = 172.9.9.10/24
PrivateKey = X-private-key
DNS = 1.1.1.1

[Peer]
PublicKey = S-public-key
Endpoint = S-ip-address:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25  # To keep the server reachable

此配置有效,所有主機都可以通過 VPN 相互訪問,但我希望只有定向到主機的流量172.9.9.*通過此 VPN。其他流量應由預設網關路由。

A令我困惑的是,如果我更改配置

AllowedIPs = 172.9.9.0/24

然後,對於A,包按預期路由(例如,我可以curl ifconfig.me並獲取A的公共 IP),但如果我在 上執行相同操作X,它將無法工作,並且不會發送的包172.9.9.0/24將無法傳遞。

編輯#1

忘了提,如果連接到 時,我也很喜歡X本地客戶端,例如B不會在本地網路之外發送包,所以B -> Router -> X和不B -> Router -> S -> Router -> X

設置AllowedIPs為要路由到/通過 peer的 IP 地址。

在普通的中心輻射型配置中,在您的集線器 (S) 上,您將AllowedIPs像您一樣為每個對等點進行配置,僅當每個對等點使用對等點的 WireGuard IP 地址作為其目標地址時才將數據包路由到每個對等點;在您的輻條(A、B 和 X)上,您將配置AllowedIPs到 WireGuard 網路的 CIDR 172.9.9.0/24

因此,通過正常配置,您可以使用 A 的 WireGuard IP 地址從 B 或 X 訪問 A,從 A 或 X 訪問 B 172.9.9.100,使用172.9.9.101,從 A 或 B訪問172.9.9.10X。

但是,如果您還希望能夠通過綁定到輻條的物理 NIC(例如eth0)的 IP 地址訪問每個輻條,則需要調整AllowedIPs集線器和輻條上的 以包含這些 IP 地址。

例如,如果 A 的eth0地址是198.51.100.65,B 的地址是192.168.0.66,而 X 的地址是192.168.0.88,您可以將集線器的 WireGuard 配置中的對等點調整為:

## S wg0.conf
...

[Peer]
# A
PublicKey = A-public-key
AllowedIPs = 172.9.9.100/32
AllowedIPs = 198.51.100.65/32

[Peer]
# B
PublicKey = B-public-key
AllowedIPs = 172.9.9.101/32
AllowedIPs = 192.168.0.66/32

[Peer]
# X
PublicKey = X-public-key
AllowedIPs = 172.9.9.10/32
AllowedIPs = 192.168.0.88/32

並將AllowedIPs每個輻條的配置設置為:

AllowedIPs = 172.9.9.0/24
AllowedIPs = 198.51.100.65/32
AllowedIPs = 192.168.0.66/32
AllowedIPs = 192.168.0.88/32

(請注意,如果您願意,也可以在一行中指定所有塊AllowedIPs = 172.9.9.0/24, 198.51.100.65/32, 192.168.0.66/32, 192.168.0.88/32。)


使用您目前的配置,您AllowedIPs = 0.0.0.0/0在 X 上的位置,當您curl 198.51.100.65從 X 執行時,發生的情況是 X 正在通過其 WireGuard 隧道將發往 A(以及其他所有內容)的數據包路由到 S,然後 S 將這些數據包路由到未加密的到 A 的 Internet(偽裝成 S 自己的公共 IP 地址);作為響應,A 通過 Internet 向 S 發送未加密的數據包,S 通過其 WireGuard 隧道將其路由到 X。

如果您想確保 S不會將通過您的 WireGuard 網路隧道傳輸到 Internet 的數據包路由到 Internet,您可以調整您的 iptables 規則以防止這種情況發生;像下面這樣的東西可能會奏效:

PostUp = iptables -A FORWARD -i wg0 -o wg0 -j ACCEPT; iptables -A FORWARD -i wg0 -o eth0 -j DROP; iptables -A FORWARD -i eth0 -o wg0 -j DROP

引用自:https://serverfault.com/questions/1076995