Openvpn

允許網路中的客戶端與通過 OpenVPN 連接的客戶端進行通信

  • April 11, 2020

網路拓撲是這樣的:

OpenVPN 伺服器:

Private IP (eth0): 10.0.4.23/16
Public IP (eth1): 77.20.30.40/24
Routes:
default via 77.20.30.1
10.0.0.0/16 (not routable, so no gateway)
10.8.0.0/16 via 10.0.0.65

在同一個私有子網上,我們為通過 OpenVPN 連接的客戶端提供了 10.0.13.0/24 網路範圍內的專用地址。因此客戶端將 OpenVPN 伺服器地址視為 10.0.13.1 作為網關。

客戶端機器:

Public IP: 217.40.50.60

目前,當客戶端連接到 VPN 伺服器時,它無法看到私有範圍內的子網。因此,我使用 OpenVPN 伺服器 tun0 IP (10.0.13.1) 添加了到這些網路的路由

ip r add 10.0.0.0/16 via 10.0.13.1
ip r add 10.8.0.0/16 via 10.0.13.1

它不起作用。所以我在 OpenVPN 伺服器上添加了 POSTROUTING iptables 規則

iptables -A POSTROUTING -s 10.0.13.0/24 -o eth0 -j MASQUERADE

那時它奏效了。但是,問題是,例如,當我連接到該私有子網中的伺服器時10.0.4.20,該伺服器會將原始 IP 地址視為 OpenVPN 私有地址10.0.4.23

目前我們已經建立了 Microsoft VPN,當我們使用它時,所有伺服器都可以看到 VPN 分配給的客戶端 IP 地址,因此可以完成(也許)但我不確定我哪裡弄錯了。

這是 OpenVPN Server 配置文件,為了方便讀者,去掉了註釋。

port 1194
proto udp
dev tun
user nobody
group nobody
persist-key
persist-tun
keepalive 10 120
topology subnet
server 10.0.13.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 10.0.0.1"
push "dhcp-option DNS 10.0.0.2"
push "route 10.0.0.0 255.255.0.0"
push "route 10.8.0.0 255.255.0.0"
dh none
ecdh-curve prime256v1
tls-crypt tls-crypt.key 0
crl-verify crl.pem
ca ca.crt
cert server_oy94rAaIiMtrnvAB.crt
key server_oy94rAaIiMtrnvAB.key
auth SHA256
cipher AES-128-GCM
ncp-ciphers AES-128-GCM
tls-server
tls-version-min 1.2
tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
status /var/log/openvpn/status.log
log /var/log/openvpn/openvpn.log
verb 3

plugin /opt/openvpn-ldap-auth/lib/openvpn-auth-ldap.so /etc/openvpn/auth/ldap.conf
client-cert-not-required

我嘗試設置server 10.0.13.0 255.255.255.0server 10.0.13.0 255.255.0.0應該是網路,但 OpenVPN 伺服器不喜歡該配置,並且如果子網中的第一個八位字節不是,則不想啟動0

所以為了簡單起見:我如何製作一些位於 10.0.0.0/16 網路上的伺服器,訪問位於 10.0.13.0/24 上的 VPN 客戶端。或者更好的是,我如何讓 OpenVPN 伺服器分配給 10.0.13.0/24 範圍內的客戶端 IP 地址,但實際上讓它們屬於 10.0.0.0/16?我可能需要在同一台伺服器上安裝單獨的 DHCP 伺服器嗎?

在Ethernet Bridging的幫助下,我設法解決了這個問題。

這些將是步驟:

  • 在 CentOS 上停止 OpenVPN 伺服器:systemctl stop openvpn@server
  • 在 CentOS 7 上安裝 bridge-utils 軟體包yum install bridge-utils
  • 創建 tap0 虛擬乙太網設備openvpn --mktun --dev tap0
  • 創建橋樑brctl addbr br0
  • 將 eth0 設備(具有私有 IP 的設備)添加到新網橋brctl addif br0 eth0
  • 將 tap0 設備添加到橋接brctl addif br0 tap0
  • 為 tap0 設備啟用混雜模式ifconfig tap0 0.0.0.0 promisc up
  • 為 eth0 設備啟用混雜模式ifconfig eth0 0.0.0.0 promisc up
  • 將之前設置為 eth0 的 IP 地址分配給 br0ifconfig br0 10.0.4.23 netmask 255.255.0.0 broadcast 10.0.255.255
  • 添加 iptables 規則,以便新介面可以接受流量
   iptables -A INPUT -i tap0 -j ACCEPT
   iptables -A INPUT -i br0 -j ACCEPT
   iptables -A FORWARD -i br0 -j ACCEPT
  • 打開 VPN Server 配置文件,例如/etc/openvpn/server/server.conf,註釋掉dev tun並在其下方或上方添加dev tap0右側。
  • 註釋掉以 開頭的整行server並添加最初在 eth0 和現在在 br0 上的 IP 地址,還添加 VPN 將分配給客戶端的地址的 DHCP 範圍,如下所示:
bridge 10.0.4.23 255.255.0.0 10.0.13.2 10.0.13.254

這將允許伺服器將地址從 10.0.13.2 - 10.0.13.254 租給客戶端。

  • 現在啟動 openvpn 伺服器並享受 :) systemctl start openvpn@servers

從您的描述中,我看到一個缺失的配置:您沒有告訴其他伺服器如何訪問 VPN 客戶端。

缺少該配置,任何具有10.0/16網路地址的主機將預設假定同一網路的任何其他地址,因此包括10.0.13/24子網路,是“on-link”,即無需干預路由器即可直接訪問。

作為一個範例測試,嘗試使用屬於網路ip r add 10.0.13.0/24 via 10.0.4.23的任何其他Linux 伺服器(不是 OpenVPN 伺服器)10.0/16:之後,流量應該在該特定 Linux 伺服器和 OpenVPN 客戶端之間定期流動。

當然,這同樣適用於您的10.0/16專用網路上的所有主機,無論是 Linux、Windows、Mac 還是 Cisco 等等。在實踐中,您應該將該路由放在您專用網路的所有主機上。

當然,如果您有很多主機,這可能是不可取的。一種更好的方法(網路方面)是讓您的 OpenVPN 伺服器為您的整個私有網路託管一種中央網關,可能實際上是所有這些主機的預設網關。

假設這是不可行的,如果您的私有網路中已經有這樣一個“中央網關”(可能是您的10.0.0.65主機?),那麼您可以嘗試使用上面的路由配置那個:其他主機(指的是那個網關)通常應該服從和遵守。然而,這種解決方案通常不是最理想的,因為它使這些主機經常被“中央網關”重新路由到 OpenVPN 伺服器網關。

其他替代方案包括在充當 OpenVPN 伺服器的 Linux 伺服器上設置特殊配置,以使其充當 OpenVPN 客戶端地址的一種“代理 arp”。可能,但複雜而先進。

橋接解決方案無疑是一種快速簡便的解決方案,但意味著所有廣播流量(在中等規模的 LAN 中可能是閒聊的)都會傳播到您的所有 OpenVPN 客戶端,從而佔用您的 OpenVPN 伺服器資源您的 Internet 連接到和來自您的客戶端,每個廣播幀乘以連接的客戶端數量。

引用自:https://unix.stackexchange.com/questions/531856