Vpn

MULTI:來自客戶端的錯誤源地址 - 任何一次性解決方案?

  • March 20, 2020

設置: 我有一個 openvpn 客戶端/伺服器設置(底部的配置文件),我MULTI: bad source address from client [192.168.x.x], packet dropped在伺服器上收到了臭名昭著的消息。伺服器有一個公共 IP 地址,而客戶端位於 NAT 後面。

先前提出的解決方案的缺點: 伺服器client-config-dir配置中定義的目前為空。以前的文章(在此處和在 openvpn 支持論壇中)建議在 中添加一個以DEFAULT適當規則命名的文件client-config-dir,或者添加一個具有這些規則的每個使用者文件來解決問題。

但是,這似乎不是一個長期的解決方案,因為這些規則是特定於客戶端位置的。所以,我可以添加一個規則來允許客戶端192.168.x.0連接。但是,如果他們從另一個用於 NAT 的網路連接,192.168.y.0則需要一個新規則。

問題:

  • 可以用通用/一次性的方式編寫所需的規則嗎?
  • 有人可以解釋為什麼首先會出現這個問題嗎?

伺服器配置:

port 1234
proto tcp
dev tun

ca ca.crt
cert openvpn.crt
key openvpn.key
dh dh2048.pem

server 10.78.96.0 255.255.255.0
keepalive 10 120
comp-lzo
cipher CAMELLIA-128-CBC

user nobody
group nogroup  
persist-key
persist-tun
client-cert-not-required
plugin /usr/lib/openvpn/openvpn-auth-pam.so login

status openvpn-status.log

push "redirect-gateway def1"
push "remote-gateway 1.2.3.4"
push "dhcp-option DNS 8.8.8.8"

client-config-dir ccd
verb 4

客戶端配置:

ca ca.crt
client
dev tun
proto tcp
remote 1.2.3.4 1234

auth-user-pass
script-security 2
keepalive 5 60
topology subnet
resolv-retry infinite
nobind
persist-key
persist-tun
ns-cert-type server
cipher CAMELLIA-128-CBC
comp-lzo
verb 4

你問:“有人能解釋一下為什麼會出現這個問題嗎?

根據官方 OpenVPN FAQ 中的報告,我敢打賭這是由 OpenVPN 引擎中的路由問題引起的。

為了更好地闡明場景,讓我參考下圖:

在這裡你可以看到:

  • 連接到 HEADQUARTER 內部網路 (10.0.1.0/24) 的 OpenVPN“伺服器”
  • 在遠端站點上執行的 OpenVPN“客戶端”,並連接到遠端 192.168.1.0/24 網路

  • 我們假設 OpenVPN 隧道已建立,並且:

    • OpenVPN“伺服器”可通過其自己的tun介面訪問,地址為 10.10.0.1。另外tun介面使用的P2P地址是10.10.0.2這個對於後面的討論很重要,所以要強調一下
    • OpenVPN“客戶端”有一個IP 為 10.10.0.2的tun介面

現在,讓我們假設:

  • OpenVPN“客戶端”重新定義了它的預設網關,以便在隧道內重定向所有傳出的 IP 流量;
  • OpenVPN“客戶端”啟用了 IP_FORWARDING,因此可以路由來自其內部 LAN (192.168.1.0/24) 的數據包我強調這一點,因為這對我們的討論至關重要)。

有了這樣的場景,讓我們詳細檢查當 R_PC1 (192.168.1.2) 向 L_PC1 (10.0.1.2) 發送數據包(如回應要求)時會發生什麼:

  1. 離開 R_PC1 網卡後,數據包到達 OpenVPN 客戶端;
  2. OpenVPN 客戶端(配置為普通路由器),根據其路由表進行路由。因為它的預設網關是隧道,所以它將數據包發送到隧道;
  3. 數據包到達 OpenVPN 伺服器的 tun 介面。OpenVPN 將“看到”它,並且因為它(OpenVPN 伺服器)知道 10.0.1.2 是屬於其 LAN 子網的地址,所以它會將數據包從 TUN“轉發”到 LAN;
  4. 數據包到達 L_PC1。

所以一切都很好…

現在讓我們檢查一下 L_PC1 回复 R_PC1 的 echo-r​​eply 會發生什麼。

  1. echo-r​​eply 離開 L_PC1 NIC 並到達 OpenVPN 伺服器 LAN 介面 (10.0.1.1);

現在,如果我們希望 OpenVPN Server 能夠訪問遠端站點,我們需要使用“靜態路由”定義路由。就像是:

route add -net 192.168.1.0 netmask 255.255.255.0 gw 10.10.0.2

請注意用作網關的 P2P 地址

此類靜態路由將在作業系統級別執行。換句話說,作業系統需要正確地路由數據包。它的意思是這樣的:“請,所有發往 192.168.1.0/24 子網的流量都需要轉發到 OpenVPN 引擎,作業系統可以通過 P2P 地址與之通信”。多虧了這樣的靜態路由,現在…

  1. 數據包離開作業系統路由上下文並到達 OpenVPN。在 OpenVPN 伺服器上執行的 OpenVPN 實例。因此,此時,作業系統無事可做,所有路由(在 VPN 內)都留給 OpenVPN 伺服器軟體。

所以,現在的問題是:openvpn 伺服器軟體如何能夠決定數據包的路由,SRC_IP 為 10.0.1.2 和 DST_IP 為 192.168.1.2

請注意,基於 OpenVPN 伺服器的配置,它對192.168.1.0/24 網路和 192.168.1.2 主機一無所知。不是連接的客戶端。它不是本地客戶。所以?OpenVPN 也知道它不是“OS-Router”,因此它並不真正想要(並且可以….)將數據包發送回本地網關。因此,這裡唯一的選擇是引發錯誤。正是您遇到的錯誤

用常見問題解答的語言來說:“ ……它不知道如何將數據包路由到這台機器,所以它丟棄了數據包…… ”。

我們怎樣才能解決這個問題?

正如您從官方文件中看到的那樣,選項iroute完全適用於我們的範圍:

--iroute network [netmask]
Generate an internal route to a specific client. The netmask 
parameter, if omitted, defaults to 255.255.255.255.
This directive can be used to route a fixed subnet from the server 
to a particular client, regardless of where the client is 
connecting from. Remember that you must also add the route to the 
system routing table as well (such as by using the --route 
directive). The reason why two routes are needed is that the 
--route directive routes the packet from the kernel to OpenVPN. 
Once in OpenVPN, the --iroute directive routes to the specific 
client.

所以你需要一個:

--iroute 192.168.1.0 255.255.255.0

當您的 OpenVPN 客戶端連接時應用(到伺服器),例如通過伺服器上定義的臨時配置文件(client-config-dir 等)。

如果您想知道為什麼上述步驟 2)沒有發生此問題,我的理解是 OpenVPN 客戶端知道如何路由它,因為它知道 VPN 隧道是預設網關。

在 OpenVPN 伺服器上不能這樣做,因為那裡的預設網關通常不會被覆蓋。另外,考慮到您可以有一個帶有大量 OpenVPN 客戶端的 OpenVPN 伺服器:每個客戶端都知道如何訪問伺服器,但是……伺服器如何決定哪個客戶端充當未知子網的網關?


至於您的第一個問題(可以用通用/一次性的方式編寫所需的規則嗎?),很抱歉,但我沒有遇到您的問題。你能改寫提供更多細節嗎?


引用自:https://serverfault.com/questions/646130