我的問題本質上是路由問題,而且我對路由和 iptables 不夠熟悉,無法有效地排除故障並設定我的網路需求。
什麼在起作用
我已設定並執行 openVPN 網路;客戶端可以透過網際網路連接到區域網路。
我希望發生什麼
...當客戶端連接到給定子網路上的 VPN 時。
- 客戶端應該可以從 VPN 網路存取
如果規則可以執行以下一項或多項操作,則可獲得獎勵積分:
- 用戶端不應能夠啟動與 VPN 的連接
- 客戶端應該會出現在我們的 DNS 中
拓樸結構
我們的網路拓撲如下所示:
______ ____________________
/ \ / \
| internet |---| client (10.8.8.0/24) |
\________/ \____________________/
|
______
/ \
| gateway |
\________/
|
-----LAN------ (10.10.10.0/24)
| | | |
L_____VPN Server `VPN1` 10.10.10.2 (fictional name/subnet)
目前的設定
我們的網關定義了以下路由:
10.8.8.0 255.255.255.0 10.10.10.2 LAN & WLAN
上VPN1
,iptables有以下規則
# Flush the filter and nat tables
iptables -t filter -F
iptables -t nat -F
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT -d 10.8.8.0/24
iptables -A FORWARD -i eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.10.10.0/16 -d 10.8.8.0/24 -o tun+ -j MASQUERADE
目前正在發生什麼
執行指令mtr 10.8.8.1
(連線的用戶端在VPN上的IP)可以看到目前路由在VPN1和閘道之間來回跳動。
答案1
經過又一輪艱苦的 iptables 在線學習瘋狂後,我找到了解決方案。
然而,首先,關於 iptables 存在一個無效的假設。我最初的規則方法是,當收到資料包時,它將通過 INPUT 和 OUTPUT 鏈運行。並非如此;一旦規則與資料包匹配,它就會離開表。由於除非指定(例如“-t nat”),否則假定過濾器表,因此列出的大多數規則都在過濾器表上運行。
關於鏈條
- 輸入:在發送到伺服器的資料包上運行
- 輸出:對來自伺服器的資料包運行
- 向前:其他一切 - 如果規則在這裡匹配,並且“跳轉”(我喜歡認為如果-j當“job”;)被接受時,資料包將被適當地路由
規則細目
這是對規則的描述目前的設定多於
iptables -t filter -F
iptables -t nat -F
這些規則只是簡單地刷新篩選和納特表。請注意,有更多的表和更徹底的清除 iptables 規則的方法。
iptables -A INPUT -i tun+ -j ACCEPT
這條規則沒有任何作用,因為:
- 它在發送到 VPN1 的流量上運行,而不是在另一個網路上運行
- 沒有為傳入流量設定策略,因此預設允許
繼續...
iptables -A FORWARD -i tun+ -j ACCEPT
此規則允許路由來自 10.8.8.0/24 的流量。中的規則納特表在與此規則相符的資料包上運行。
iptables -A INPUT -i eth0 -j ACCEPT -d 10.8.8.0/24
此規則對所需路由也沒有影響,因為 10.8.8.0/24 流量不是發送到 VPN1 伺服器的。
iptables -A FORWARD -i eth0 -j ACCEPT
此規則允許路由來自 10.10.10.0/16 的流量。
iptables -t nat -A POSTROUTING -s 10.10.10.0/16 -d 10.8.8.0/24 -o tun+ -j MASQUERADE
此規則會導致從 10.10.10.0/16 發送到 VPN 的流量看起來像是來自 VPN1,從而實際上導致 VPN1 看起來像網關。
怎麼了?
規則應該是“OK”,因為可以將流量從一個網路傳輸到下一個網路。沒有任何真正的保護措施 - 例如預設的“DROP”策略等,但這不是問題的重點。
如果 iptables 設定為可以透過 VPN 路由流量,那麼什麼會導致流量透過 VPN 發回乙太網路0到網關?如果 VPN1 不知道 10.8.8.0/24。如果 VPN 伺服器不知道該網絡,它將被視為互聯網流量並發送回網關。
修復
解決方案是告訴 VPN 伺服器有關網路的資訊(這是一個 openvpn 伺服器)。有兩種方法可以做到這一點;如果伺服器僅服務於一個網絡,則這是一個簡單的配置設定:
server 10.8.8.0 255.255.255.0
就我而言,我設定了伺服器路由,我需要它來了解附加網路。配置看起來更像是這樣的:
server 10.5.5.0 255.255.255.0
route 10.8.8.0 255.255.255.0
就是這樣!一旦 VPN1 有了到網路的路由,FORWARD 鏈就能夠路由流量。
更好的 iptables 設定
刷新 iptables 後,更好的配置將如下所示:
# Forward established traffic so that (in the above case) VPN1 doesn't
# drop responses from the client, A.K.A. "the magic"
iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A FORWARD -s 10.10.10.0/16 -d 10.8.8.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.10.10.0/16 -d 10.8.8.0/24 -j MASQUERADE
# Drop everything else that wants to be forwarded
iptables -P FORWARD DROP
請注意,對於來自 10.8.8.0/24 的流量沒有明確的規則,這意味著預設流量不會到達 10.10.10.0/16 網路 - 回應從 10.10.10.0/16 發送的流量的流量除外。現在 iptables 已設定完畢,可以在 VPN 設定中為用戶端指派 IP,並將其新增至 DNS 以獲得完整的解決方案。