iptables 및 Wireguard VPN 터널을 사용하는 두 사이트의 인터넷 게이트웨이로 사용되는 Linux VPS가 있습니다. VPS를 통한 인터넷 접속은 두 사이트 모두에 문제가 없지만 사이트 B에서 사이트 A에 접속할 수 없으며 그 반대의 경우도 마찬가지입니다. 현재 구성은 다음과 같습니다.
VPS:
wg0 - 10.10.0.0/31 (----> Site A wg0 10.10.0.1/31)
wg1 - 10.20.0.0/31 (----> Site B wg0 10.20.0.1/31)
eth0 - Internet (public IP)
Site A Router:
wg0 - 10.10.0.1/31 (----> VPS wg0 10.10.0.0/31)
eth0 - 172.16.10.0/24 (local lan)
eth1 - Internet (carrier grade NAT)
Site B Router:
wg0 - 10.20.0.1/31 (---- > VPS wg1 10.20.0.0/31)
eth0 - 172.16.20.0/24 (local lan)
eth1 - Internet (carrier grade NAT)
VPS wg0.conf:
[Interface]
Address = 10.10.0.0/31
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ListenPort = 60174
PostUp = iptables -A FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# BEGIN_PEER SITE A
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PresharedKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 10.10.0.0/31, 172.16.10.0/24
# END_PEER SITE A
VPS wg1.conf:
[Interface]
Address = 10.20.0.0/31
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ListenPort = 60175
PostUp = iptables -A FORWARD -i eth0 -o wg1 -j ACCEPT; iptables -A FORWARD -i wg1 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i eth0 -o wg1 -j ACCEPT; iptables -D FORWARD -i wg1 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# BEGIN_PEER SITE B
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PresharedKey = Exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 10.20.0.0/31, 172.16.20.0/24
# END_PEER SITE B
VPS iptables 구성:
# Generated by iptables-save v1.8.7
*filter
:INPUT DROP [215:23625]
:FORWARD DROP [21:1140]
:OUTPUT ACCEPT [20568:6762867]
-A INPUT -p udp -m udp --dport 60174 -j ACCEPT
-A INPUT -p udp -m udp --dport 60175 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o wg1 -j ACCEPT
-A FORWARD -i eth0 -o wg0 -j ACCEPT
-A FORWARD -i wg1 -j ACCEPT
-A FORWARD -i wg0 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on
# Generated by iptables-save v1.8.7
*nat
:PREROUTING ACCEPT [2094:151039]
:INPUT ACCEPT [7:501]
:OUTPUT ACCEPT [12:841]
:POSTROUTING ACCEPT [870:73441]
-A POSTROUTING -o eth0 -j MASQUERADE
사이트A wg0.conf:
[Interface]
Address = 10.10.0.1/31
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# BEGIN_PEER VPS
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PresharedKey = Exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 0.0.0.0/0
사이트 B wg0.conf:
[Interface]
Address = 10.20.0.1/31
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# BEGIN_PEER VPS
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PresharedKey = Exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 0.0.0.0/0
VPS에서 IP 전달을 활성화합니다.
VPS(10.20.0.0)의 사이트 A에서 wg1로 ping을 수행할 수 있지만 사이트 B(10.20.0.1) 또는 사이트 B의 LAN에 있는 다른 터널 끝에서는 ping을 수행할 수 없습니다. 그 반대: VPS의 사이트 B에서 wg0(10.10.0.0)으로 ping할 수 있지만 사이트 A 터널(10.10.0.1)의 다른 쪽 끝이나 사이트 A LAN의 다른 항목으로는 ping할 수 없습니다. 현재 wg 인터페이스에서 테스트하기 위해 방화벽이 완전히 열려 있으므로 방화벽이 차단되지 않고 라우팅 문제라는 것을 알고 있습니다. VPS 자체에서 터널의 반대쪽 끝과 두 사이트의 LAN 모두에 대해 ping을 실행할 수 있습니다. 문제는 VPS wg 인터페이스 간의 라우팅에만 있는 것 같습니다.
VPS에서 허용되는 IP에 대한 wg0.conf에는 172.16.10.0/24 및 10.10.0.1/31이 포함되어 있으므로 wg1.conf에서 허용하도록 설정할 수 없으며 그 반대도 마찬가지입니다.
내가 본 다른 모든 가이드는 다른 네트워크의 라우터로서의 피어가 아니라 단일 호스트로서의 Wireguard 피어에 대한 것입니다.
문제를 일으키는 것은 허용된 IP인 것 같지만 확실하지 않습니다. 이 문제를 해결하는 방법은 VPS의 wg 인터페이스 간 NAT, 어떻게든 FwMark 태그 사용, 다른 라우팅 테이블 사용, wg 인터페이스를 다른 네트워크 네임스페이스에 배치하는 것과 같은 간단한 것으로 추측되지만 잘 모르겠습니다. 내려가는 가장 좋은 방법은 무엇입니까?
답변1
PersistentKeepalive
사이트 A 및 B 라우터의 WireGuard 구성에 설정을 추가하기만 하면 됩니다.
[Interface]
Address = 10.10.0.1/31
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# BEGIN_PEER VPS
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PresharedKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 0.0.0.0/0
Endpoint = vps.example.com:60174
PersistentKeepalive = 25
이렇게 하면 WireGuard가 25초마다 라우터에서 VPS로 연결 유지 패킷을 보내 라우터와 VPS 간에 CGNAT를 통해 열린 연결을 유지하여 VPS가 트래픽을 보낼 수 있도록 합니다.
답변2
내가 일을 지나치게 생각하고 필요 이상으로 일을 더 복잡하게 만들고 있었던 것으로 밝혀졌습니다.
VPS에는 2개의 wg 인터페이스가 필요하지 않습니다. 이를 1로 줄이고 두 사이트를 모두 피어로 구성하고 관련 허용 네트워크를 각 피어에 추가했습니다.