iptables:透過 VPN 伺服器從 LAN 存取連接的 openvpn 用戶端

iptables:透過 VPN 伺服器從 LAN 存取連接的 openvpn 用戶端

我的問題本質上是路由問題,而且我對路由和 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 以獲得完整的解決方案。

相關內容