Ich habe ein paar Hosts hinter einem NAT-Router, auf die ich über ein Wireguard-VPN zugreifen möchte. Ich konnte das private Netzwerk erfolgreich konfigurieren, aber es gibt immer noch etwas, das mich verwirrt.
Ich möchte, dass jeder Peer:
172.9.9.*
über das VPN (viawg0
) aufeinander zugreifen ( )- Zugriff auf jeden anderen Host außerhalb des VPN (über
eth0
).
Hier ist ein Schema des Netzwerks und der aktuellen Konfiguration:
┌─────┐ ┌──────────┐ ┌─────┐
│ S ├────┤ Internet ├────┤ A │
└─────┘ └───┬──────┘ └─────┘
│
│
┌────┴─────┐
│ NAT DHCP │
┌──┤ Router ├──┐
│ └──────────┘ │
│ │
┌──┴──┐ ┌──┴──┐
│ X │ │ B │
└─────┘ └─────┘
S
ist der VPN-Server und er ist über das Internet über eine statische IP erreichbar;X
ist ein „Rechnerserver“, er kann auf das Internet zugreifen, befindet sich aber hinter einem NAT und seine IP ist dynamisch und nicht im Voraus bekannt;A
ist ein „Remote-Client“, der eine Verbindung herstellen möchte mitX
;B
ist ein „lokaler Client“, der eine Verbindung herstellen möchteX
und sich im selben lokalen Netzwerk befindet.
Ich möchte dies A
und B
kann X
über eine Verbindung herstellen S
, aber alle diese Hosts sollten das VPN nur für die gegenseitige Kontaktaufnahme und nicht für den Internetzugriff verwenden.
So können Sie beispielsweise A
google.com direkt anpingen, der Ping erfolgt jedoch X
über S
.
Nach dem Suchen und Lesen der Dokumentationen ist mir immer noch unklar, ob dies ohne die Verwendung möglich ist iptables
und ob es nur mit der Wireguard-Konfiguration möglich ist.
Die aktuelle Konfiguration ist wie folgt:
## 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
Die Konfiguration von ist ähnlich zu A
, jedoch mit IP 172.9.9.101
und anderem privaten Schlüssel.
# 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
Diese Konfiguration funktioniert und alle Hosts können über das VPN aufeinander zugreifen, aber ich möchte, dass NUR der an die Hosts gerichtete Datenverkehr 172.9.9.*
über dieses VPN läuft. Der übrige Datenverkehr soll über das Standard-Gateway geleitet werden.
Was mich verwirrt ist, dass, wenn ich die Konfiguration ändere, A
so dass
AllowedIPs = 172.9.9.0/24
dann A
werden die Pakete für wie vorgesehen weitergeleitet (z. B. kann ich curl ifconfig.me
und erhalte A
die öffentliche IP von), aber wenn ich dasselbe auf mache X
, funktioniert es nicht und Pakete, die nicht an gehen, 172.9.9.0/24
können nicht zugestellt werden.
BEARBEITEN#1
Ich habe vergessen zu erwähnen, dass ich es auch toll fände, wenn X
die lokalen Clients beim Verbinden mit B
keine Pakete außerhalb des lokalen Netzwerks senden würden, also B -> Router -> X
und nicht B -> Router -> S -> Router -> X
.
Antwort1
Stellen Sie AllowedIPs
die gewünschten IP-Adressen einRoute zum/durch den Peer.
In einer normalen Hub-and-Spoke-Konfiguration würden Sie auf Ihrem Hub (S) AllowedIPs
für jeden Peer die folgende Konfiguration vornehmen: Routing von Paketen an jeden Peer nur dann, wenn diese die WireGuard-IP-Adresse des Peers als Zieladresse verwenden. Auf Ihren Spokes (A, B und X) würden Sie AllowedIPs
die CIDR Ihres WireGuard-Netzwerks ( 172.9.9.0/24
) konfigurieren: Routing von Paketen an den Hub nur dann, wenn diese die WireGuard-IP-Adressen eines anderen Peers als Zieladresse verwenden.
Bei einer normalen Konfiguration würden Sie also von B oder X aus mit der WireGuard-IP-Adresse von A auf A zugreifen 172.9.9.100
, von A oder X aus mit und von A oder B aus mit auf 172.9.9.101
X.172.9.9.10
Wenn Sie jedoch auch auf jeden Spoke über die an die physische Netzwerkkarte des Spokes gebundene IP-Adresse zugreifen möchten (z. B. eth0
), müssen Sie AllowedIPs
sowohl auf dem Hub als auch auf den Spokes die entsprechenden IP-Adressen anpassen.
Wenn beispielsweise eth0
die Adresse von A lautet 198.51.100.65
, die von B 192.168.0.66
und die von X 192.168.0.88
, würden Sie die Peers in der WireGuard-Konfiguration des Hubs wie folgt anpassen:
## 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
Und stellen Sie AllowedIPs
in der Konfiguration jeder Speiche Folgendes ein:
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
(Beachten Sie, dass Sie bei Bedarf auch alle Blöcke in einer Zeile angeben können .)
Wenn Sie bei Ihrer aktuellen Konfiguration AllowedIPs = 0.0.0.0/0
auf X arbeiten curl 198.51.100.65
und X ausführen, passiert Folgendes: X leitet die für A bestimmten Pakete (und alles andere) durch seinen WireGuard-Tunnel an S weiter, und dann leitet S diese Pakete unverschlüsselt über das Internet an A weiter (maskiert mit der öffentlichen IP-Adresse von S). Als Antwort darauf sendet A unverschlüsselte Pakete über das Internet an S, die S durch seinen WireGuard-Tunnel an X weiterleitet.
Wenn Sie sichergehen wollen, dass SnieUm Pakete, die durch Ihr WireGuard-Netzwerk getunnelt wurden, an das Internet weiterzuleiten, können Sie Ihre iptables-Regeln anpassen, um dies zu verhindern. So etwas wie das Folgende würde wahrscheinlich funktionieren:
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
Antwort2
Ich hatte ein Problem mit DNS: Mit AllowedIPs = 172.9.9.0/24
konnte ich anpingen 8.8.8.8
, aber nicht an google.com
.
Ich habe es gelöst, indem ich die Schnittstelle DNS in die erlaubten IPs aufgenommen habe, sodass ich eine DNS-Auflösung über VPN bekomme, der Datenverkehr aber nicht im VPN ist:
[Interface]
...
DNS = 1.1.1.1
[Peer]
...
AllowedIPs = 172.9.9.0/24, 1.1.1.1/32
Dies beantwortet nicht meine zweite Frage: ob es möglich ist, direkt zu kommunizieren, ohne den Umweg über zu machen X
. Die andere Antwort hilft dabei, das zu verstehen.B
S
BEARBEITEN
Es scheint, dass es auch durch Löschen des Felds funktioniert DNS
, daher sollte für beide Schnittstellen derselbe DNS-Server verwendet werden.