僅在wireguard VPN 中路由專用網絡

僅在wireguard VPN 中路由專用網絡

我在 NAT 路由器後面有一些主機,我想透過wireguard VPN 存取它們。我可以成功配置專用網絡,但仍有一些問題令我困惑。

我希望每個同行:

  • 172.9.9.*透過 VPN互相存取 ( ) (via wg0)
  • 存取 VPN 之外的所有其他主機(透過eth0)。

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

┌─────┐    ┌──────────┐    ┌─────┐
│  S  ├────┤ Internet ├────┤  A  │
└─────┘    └───┬──────┘    └─────┘
          ┌────┴─────┐
          │ NAT DHCP │
       ┌──┤  Router  ├──┐
       │  └──────────┘  │
       │                │
    ┌──┴──┐          ┌──┴──┐
    │  X  │          │  B  │
    └─────┘          └─────┘
  • S是 VPN 伺服器,可透過靜態 IP 在網際網路上存取;
  • X是一個“計算伺服器”,它可以訪問互聯網,但位於 NAT 之後,並且它的 IP 是動態的且無法提前獲知;
  • A是一個想要連線到的「遠端客戶端」X
  • B是一個想要連接的“本地客戶端”,X並且它位於同一本地網路中。

我想要這樣A並且可以透過B進行連接,但是所有這些主機都應該僅在相互聯繫時使用 VPN,而不是在訪問互聯網時使用 VPN。XS

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

在搜尋和閱讀文件之後,我仍然不清楚是否可以在不使用wireguard配置的情況下執行此操作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

答案1

設定AllowedIPs為你想要的IP位址路由到/通過對等點

在正常的中心輻射型配置中,在集線器 (S) 上,您可以AllowedIPs像以前一樣為每個對等點進行配置,僅當資料包使用對等點的WireGuard IP 位址作為目標位址時,才將數據包路由到每個對等點;在輻條(A、B 和 X)上,您可以設定AllowedIPsWireGuard 網路的 CIDR ( 172.9.9.0/24),僅當封包使用另一個對等方的 WireGuard IP 位址作為目標位址時,才會將封包路由到集線器。

因此,在正常配置下,您可以透過 A 的 WireGuard IP 位址從 B 或 X 存取 A 172.9.9.100,透過 A 或 X 存取172.9.9.101B,透過 A 或 B 存取172.9.9.10X。

但是,如果您也希望能夠透過綁定到分支實體 NIC 的 IP 位址(例如eth0)來存取每個分支,則需要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/0X 上,當您從 X 運行時curl 198.51.100.65,發生的情況是X 將發送到A(以及其他所有內容)的資料包透過其WireGuard 隧道路由到S,然後S 將這些未加密的封包路由到透過 Internet 存取 A(使用 S 自己的公共 IP 位址進行偽裝);作為回應,A 透過互聯網向 S 發送未加密的資料包,S 透過其 WireGuard 隧道將其路由到 X。

如果你想確定 S從來沒有透過 WireGuard 網路將封包路由到 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

答案2

我遇到了 DNS 問題:使用AllowedIPs = 172.9.9.0/24允許我 ping 8.8.8.8,但不允許google.com

我解決了將介面 DNS 包含在允許的 IP 中,因此我透過 VPN 獲得 DNS 解析,但流量不在 VPN 中:

[Interface]
...
DNS = 1.1.1.1

[Peer]
...
AllowedIPs = 172.9.9.0/24, 1.1.1.1/32

這並沒有回答我的第二個問題:是否可以直接進行製作XB通信而無需通過S.另一個答案有助於理解這一點。

編輯

看起來它也可以透過刪除該DNS欄位來運作,因此它應該為兩個介面使用相同的 DNS 伺服器。

相關內容