Wireguard VPNでプライベートネットワークのみをルーティングする

Wireguard VPNでプライベートネットワークのみをルーティングする

NAT ルーターの背後に、Wireguard VPN 経由でアクセスしたいホストがいくつかあります。プライベート ネットワークを正常に構成できましたが、まだ困惑していることがあります。

各ピアに次のことを望んでいます:

  • 172.9.9.*VPN経由で相互にアクセスする(wg0
  • VPN 外の他のすべてのホストにアクセスします (経由eth0)。

ネットワークのスキーマと現在の構成は次のとおりです。

┌─────┐    ┌──────────┐    ┌─────┐
│  S  ├────┤ Internet ├────┤  A  │
└─────┘    └───┬──────┘    └─────┘
          ┌────┴─────┐
          │ NAT DHCP │
       ┌──┤  Router  ├──┐
       │  └──────────┘  │
       │                │
    ┌──┴──┐          ┌──┴──┐
    │  X  │          │  B  │
    └─────┘          └─────┘
  • SVPN サーバーであり、静的 IP 経由でインターネットからアクセスできます。
  • X「コンピューティング サーバー」であるため、インターネットにアクセスできますが、NAT の背後にあり、IP は動的で事前にわかりません。
  • Aは、接続を希望する「リモート クライアント」ですX
  • B接続しようとしている「ローカル クライアント」でありX、同じローカル ネットワーク内にあります。

私はそれを望みA、を介してBに接続できますが、これらのホストはすべて、インターネットにアクセスするときではなく、互いに通信するときにのみ VPN を使用する必要があります。XS

たとえば、Agoogle.com に直接 ping できますが、X経由でping します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パッケージは意図したとおりにルーティングされます (たとえば、を実行して のパブリック IPcurl ifconfig.meを取得できますA)。しかし、 で同じことを行った場合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 から B にアクセスし172.9.9.101、 を使って A または B から X にアクセスします172.9.9.10

ただし、スポークの物理 NIC にバインドされた IP アドレス (例 ) 経由で各スポークにアクセスできるようにするにはeth0、ハブとスポークの両方で を調整して、それらの IP アドレスを含める必要がありますAllowedIPs

たとえば、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

(必要に応じて、すべてのブロックを 1 行に指定することもできます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 上で実行する場合curl 198.51.100.65、X は A (およびその他すべて) 宛てのパケットを WireGuard トンネル経由で S にルーティングし、次に S はそれらのパケットを暗号化せずにインターネット経由で A にルーティングします (S 自身のパブリック IP アドレスでマスカレードされます)。それに応じて、A は暗号化されていないパケットをインターネット経由で S に送信し、S はそれを WireGuard トンネル経由で X にルーティングします。

Sを確認したい場合は決してWireGuard ネットワークを経由してトンネルされたパケットがインターネットに送信されるのを防ぐには、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/24ping は実行できました8.8.8.8が、 は実行できませんでしたgoogle.com

許可された IP にインターフェイス DNS を含めることで問題を解決したので、VPN 経由で DNS 解決が行われますが、トラフィックは VPN 内にありません。

[Interface]
...
DNS = 1.1.1.1

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

これは、私が持っていた 2 番目の質問、つまり を経由せずに直接作成しXて通信することが可能かどうかという質問には答えていません。他の回答は、それを理解するのに役立ちます。BS

編集

フィールドを削除することによっても機能するようですDNS。そのため、両方のインターフェースに同じ DNS サーバーを使用する必要があります。

関連情報