Wireguard VPN을 통해 액세스하려는 NAT 라우터 뒤에 몇 개의 호스트가 있습니다. 개인 네트워크를 성공적으로 구성할 수 있었지만 여전히 당황스러운 부분이 있습니다.
나는 각 동료가 다음을 수행하기를 바랍니다.
172.9.9.*
VPN을 통해 (을 통해) 서로 ( )wg0
에 액세스- VPN 외부의 다른 모든 호스트에 액세스합니다(를 통해
eth0
).
네트워크 및 현재 구성의 스키마는 다음과 같습니다.
┌─────┐ ┌──────────┐ ┌─────┐
│ S ├────┤ Internet ├────┤ A │
└─────┘ └───┬──────┘ └─────┘
│
│
┌────┴─────┐
│ NAT DHCP │
┌──┤ Router ├──┐
│ └──────────┘ │
│ │
┌──┴──┐ ┌──┴──┐
│ X │ │ B │
└─────┘ └─────┘
S
VPN 서버이며 고정 IP를 통해 인터넷에 액세스할 수 있습니다.X
"컴퓨팅 서버"이며, 인터넷에 액세스할 수 있지만 NAT 뒤에 있으며 IP가 동적이며 사전에 알려지지 않습니다.A
에 연결하려는 "원격 클라이언트"입니다X
.B
연결을 원하는 "로컬 클라이언트"이며X
동일한 로컬 네트워크에 있습니다.
나는 그것을 원 A
하고 를 통해 B
연결할 수 있지만 이러한 호스트는 모두 인터넷에 액세스할 때가 아니라 서로 연락할 때만 VPN을 사용해야 합니다.X
S
예를 들어 A
google.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
하지만 IP 172.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
172.9.9.*
이 구성은 작동하며 모든 호스트는 VPN을 통해 서로 액세스할 수 있지만 호스트로 전달되는 트래픽만 이 VPN을 통과하기를 원합니다 . 다른 트래픽은 기본 게이트웨이에 의해 라우팅됩니다.
A
저를 당황하게 만드는 것은 구성을 변경하면
AllowedIPs = 172.9.9.0/24
그런 다음 의 경우 A
패키지는 의도한 대로 라우팅되지만(예: 의 공개 IP를 얻을 수 curl 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)에서 AllowedIPs
WireGuard 네트워크( )의 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 주소를 통해 각 스포크에 액세스할 수 있으려면 허브와 스포크 모두에서 해당 IP 주소를 포함하도록 eth0
조정해야 합니다 .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
AllowedIPs = 172.9.9.0/24, 198.51.100.65/32, 192.168.0.66/32, 192.168.0.88/32
( 원하는 경우 한 줄에 모든 블록을 지정할 수도 있습니다 .)
X에 있는 현재 구성을 사용하여 X에서 AllowedIPs = 0.0.0.0/0
실행할 때 curl 198.51.100.65
X는 WireGuard 터널을 통해 A(및 기타 모든 것)로 향하는 패킷을 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/24
ping이 허용되었지만 ping 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
이것은 내가 가졌던 두 번째 질문 X
, 즉 . 다른 대답은 그것을 이해하는 데 도움이 됩니다.B
S
편집하다
필드 를 삭제해도 작동하는 것 같으 DNS
므로 두 인터페이스 모두에 동일한 DNS 서버를 사용해야 합니다.