允許網路中的客戶端與通過 OpenVPN 連接的客戶端進行通信
網路拓撲是這樣的:
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.0
為server 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 地址分配給 br0
ifconfig 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 連接到和來自您的客戶端,每個廣播幀乘以連接的客戶端數量。