我在 NAT 路由器後面有一些主機,我想透過wireguard VPN 存取它們。我可以成功配置專用網絡,但仍有一些問題令我困惑。
我希望每個同行:
172.9.9.*
透過 VPN互相存取 ( ) (viawg0
)- 存取 VPN 之外的所有其他主機(透過
eth0
)。
這是網路和目前配置的架構:
┌─────┐ ┌──────────┐ ┌─────┐
│ S ├────┤ Internet ├────┤ A │
└─────┘ └───┬──────┘ └─────┘
│
│
┌────┴─────┐
│ NAT DHCP │
┌──┤ Router ├──┐
│ └──────────┘ │
│ │
┌──┴──┐ ┌──┴──┐
│ X │ │ B │
└─────┘ └─────┘
S
是 VPN 伺服器,可透過靜態 IP 在網際網路上存取;X
是一個“計算伺服器”,它可以訪問互聯網,但位於 NAT 之後,並且它的 IP 是動態的且無法提前獲知;A
是一個想要連線到的「遠端客戶端」X
;B
是一個想要連接的“本地客戶端”,X
並且它位於同一本地網路中。
我想要這樣A
並且可以透過B
進行連接,但是所有這些主機都應該僅在相互聯繫時使用 VPN,而不是在訪問互聯網時使用 VPN。X
S
例如,A
可以直接 ping google.com,但會X
透過ping S
。
在搜尋和閱讀文件之後,我仍然不清楚是否可以在不使用wireguard配置的情況下執行此操作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
。
答案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 存取172.9.9.101
B,透過 A 或 B 存取172.9.9.10
X。
但是,如果您也希望能夠透過綁定到分支實體 NIC 的 IP 位址(例如eth0
)來存取每個分支,則需要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 上,當您從 X 運行時curl 198.51.100.65
,發生的情況是X 將發送到A(以及其他所有內容)的資料包透過其WireGuard 隧道路由到S,然後S 將這些未加密的封包路由到透過 Internet 存取 A(使用 S 自己的公共 IP 位址進行偽裝);作為回應,A 透過互聯網向 S 發送未加密的資料包,S 透過其 WireGuard 隧道將其路由到 X。
如果你想確定 S從來沒有透過 WireGuard 網路將封包路由到 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
答案2
我遇到了 DNS 問題:使用AllowedIPs = 172.9.9.0/24
允許我 ping 8.8.8.8
,但不允許google.com
。
我解決了將介面 DNS 包含在允許的 IP 中,因此我透過 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 伺服器。