僅路由wireguard VPN中的專用網路
我在 NAT 路由器後面有幾台主機,我想通過wireguard VPN 訪問它們。我可以成功配置專用網路,但仍有一些讓我感到困惑的事情。
我希望每個同伴:
172.9.9.*
通過VPN(通過wg0
)相互訪問()- 訪問 VPN 之外的所有其他主機(通過
eth0
)。這是網路和目前配置的架構:
┌─────┐ ┌──────────┐ ┌─────┐ │ S ├────┤ Internet ├────┤ A │ └─────┘ └───┬──────┘ └─────┘ │ │ ┌────┴─────┐ │ NAT DHCP │ ┌──┤ Router ├──┐ │ └──────────┘ │ │ │ ┌──┴──┐ ┌──┴──┐ │ X │ │ B │ └─────┘ └─────┘
S
是 VPN 伺服器,可通過靜態 IP 在 Internet 上訪問;X
是一個“計算伺服器”,它可以訪問網際網路,但在 NAT 之後,它的 IP 是動態的,事先不知道;A
是一個想要連接的“遠端客戶端”X
;B
是一個想要連接的“本地客戶端”,X
它在同一個本地網路中。我想要那個
A
並且B
可以X
通過連接S
,但是所有這些主機都應該只在相互聯繫時使用 VPN,而不是在訪問網際網路時。因此,例如,
A
可以直接 ping google.com,但會X
通過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
,包按預期路由(例如,我可以curl ifconfig.me
並獲取A
的公共 IP),但如果我在 上執行相同操作X
,它將無法工作,並且不會發送的包172.9.9.0/24
將無法傳遞。編輯#1
忘了提,如果連接到 時,我也很喜歡
X
本地客戶端,例如B
不會在本地網路之外發送包,所以B -> Router -> X
和不B -> Router -> S -> Router -> X
。
設置
AllowedIPs
為要路由到/通過 peer的 IP 地址。在普通的中心輻射型配置中,在您的集線器 (S) 上,您將
AllowedIPs
像您一樣為每個對等點進行配置,僅當每個對等點使用對等點的 WireGuard IP 地址作為其目標地址時才將數據包路由到每個對等點;在您的輻條(A、B 和 X)上,您將配置AllowedIPs
到 WireGuard 網路的 CIDR172.9.9.0/24
(因此,通過正常配置,您可以使用 A 的 WireGuard IP 地址從 B 或 X 訪問 A,從 A 或 X 訪問 B
172.9.9.100
,使用172.9.9.101
,從 A 或 B訪問172.9.9.10
X。但是,如果您還希望能夠通過綁定到輻條的物理 NIC(例如
eth0
)的 IP 地址訪問每個輻條,則需要調整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/0
在 X 上的位置,當您curl 198.51.100.65
從 X 執行時,發生的情況是 X 正在通過其 WireGuard 隧道將發往 A(以及其他所有內容)的數據包路由到 S,然後 S 將這些數據包路由到未加密的到 A 的 Internet(偽裝成 S 自己的公共 IP 地址);作為響應,A 通過 Internet 向 S 發送未加密的數據包,S 通過其 WireGuard 隧道將其路由到 X。如果您想確保 S不會將通過您的 WireGuard 網路隧道傳輸到 Internet 的數據包路由到 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