使用 OpenVPN 為公共 IP 建立隧道
我在使用 OpenVPN 將公共 IP 隧道連接到遠端 VPS 時遇到了一些困難。我有一台 Linux 伺服器,其中包含 32 個 Public IP Addresses 塊
192.0.2.160/27
,名為Server 1eth0
,以及綁定到同一台伺服器上的另一個 Public IP Address :203.0.113.43
。我在其他地方的 NAT 後面有另一台 Linux 機器Server 2 。我希望能夠在Server 1上設置 OpenVPN 伺服器,以便客戶端Server 2可以使用
192.0.2.160/27
子網中的 IP 地址。我已按照以下有關 ServerFault 的指南進行操作,並且正在嘗試使用 TAP 將乙太網橋接與 OpenVPN 一起使用。
在伺服器 1 上,網路配置如下所示(出於文件目的,我已替換 IP - 請參閱 RFC5737):
伺服器 1 /etc/network/interfaces
auto eth0 auto br0 iface br0 inet static address 203.0.113.43 netmask 255.255.255.0 gateway 203.0.113.1 pre-up openvpn --mktun --dev tap0 bridge_ports eth0 tap0 bridge_fd 3
然後我在伺服器 1上執行 openvpn ,當我在伺服器 2
openvpn --dev tap0
上輸入以下內容時:openvpn --remote 203.0.113.43 --dev tap0 --route-gateway 203.0.113.1 \ --redirect-gateway def1 --ifconfig 192.0.2.160 255.255.255.224
建立了連接,但我無法在除Server 2
192.0.2.160
以外的任何其他機器上ping 通(甚至無法在Server 1上執行此操作)。我絕對相信我錯過了一些東西,但我似乎無法弄清楚。
我還要補充一點,我已經
/etc/sysctl.conf
在Server 1上啟用了 IPv4 數據包轉發。如果有人可以完成此配置或建議實現此配置的替代方法,那將不勝感激。
$$ EDIT 1 - Thanks A.B. $$ 託管服務提供商是 Heficed,他們在這裡解釋瞭如何添加額外的公共 IP(無論如何在 CentOS 上):https ://kb.heficed.com/en/articles/2854555-adding-ip-to-your-network-interface
根據這篇Heficed 的知識庫文章:
當您購買了具有主 IP 並分配了附加 IP 的伺服器時,附加 IP 在您的主 IP 上靜態路由,因此在您的 NIC 上配置 IP 時不需要網關或廣播地址。
server1 的主 IP 地址用於訪問其他 IP 地址,因此可以想像 server1 的路由器(如果也是 Linux)可能有類似這樣的設置:
ip route add 192.0.2.160/27 via 203.0.113.43
沒有必要橋接eth0,橋接它會給目標帶來額外的困難。最終必須使用不常見的路由(仍然使用不屬於 IP LAN 的網關)所需的複雜性是不值得的。
所以server1的網路配置可以簡化為:
auto eth0 iface eth0 inet static address 203.0.113.43 netmask 255.255.255.0 gateway 203.0.113.1
更改配置時請注意連接失去,您應該有一個遠端/虛擬控制台訪問作為備份。
以下是沒有橋接主機主介面的解決方案,使用路由,使用 TAP(可能允許例如server1為server2的一側執行 DHCP 伺服器)或使用 TUN。
為了保持 32 個 IP 地址可用,使用了一些不尋常的路由設置,OpenVPN 有一些問題。因此使用腳本來覆蓋該
--ifconfig
選項。如果選擇從 /32 池中犧牲 3 個 IP 地址:一個分配給server1以及 192.0.2.160 和 192.0.2.191 用作網路和廣播網路地址,那麼一切都變得簡單,不需要額外的腳本。筆記:
- 要將server1
/etc/sysctl.conf
配置為 IPv4 路由器,這是下面描述的任何方法所必需的,例如,可以在或中取消註釋/添加此條目/etc/sysctl.d/<somefile>
:net.ipv4.ip_forward=1
並在配置更改後以 root 身份執行它:
sysctl -w net.ipv4.ip_forward=1
- 命令演變:
openvpn --mktun --dev {tap,tun}0
可以替換為以下之一:
ip tuntap add dev tap0 mode tap ip tuntap add dev tun0 mode tun
ip tuntap
2009 年“只”出現。輕敲
簡單的方法
為了保持簡單,不使用永久的 TAP 介面(隨意更改此配置)。
它將消耗池中的 192.0.2.160、192.0.2.161(分配給server1)和 192.0.2.191。
- 伺服器1:
openvpn --dev tap --ifconfig 192.0.2.161 255.255.255.224
- 伺服器2:
openvpn --remote 203.0.113.43 --dev tap --ifconfig 192.0.2.162 255.255.255.224 --route-gateway 192.0.2.161 --redirect-gateway def1
您還可以將 192.0.2.163 和 192.0.2.190 之間剩餘的 28 個 IP 地址中的任何一個添加到server2的任何介面上(例如:在tap0上分配它或在lo上分配它,這樣它甚至不會在之前消失):
ip address add 192.0.2.163/32 dev lo
保持所有 32 個地址可用的方法
- 伺服器1:
添加一個 TAP 介面
/etc/network/interfaces
以簡化server1的 OpenVPN 配置:auto tap0 iface tap0 inet static pre-up ip tuntap add dev tap0 mode tap || : address 10.10.10.10/32 up ip route add 192.0.2.160/27 dev tap0 down ip link delete dev tap0
ifup tap0
如果剛剛完成並執行,請執行:openvpn --dev tap0
- 伺服器2:
有一個名為的執行檔
up-cmd-server2.sh
(內部使用的變數將繼承自 OpenVPN):#!/bin/sh ip address add "$ifconfig_local"/32 dev "$dev" ip link set dev "$dev" up ip route add "$route_vpn_gateway"/32 dev "$dev"
並執行:
openvpn --remote 203.0.113.43 --dev tap --ifconfig-noexec --ifconfig 192.0.2.160 255.255.255.255 --route-gateway 10.10.10.10 --redirect-gateway def1 --script-security 2 --up up-cmd-server2.sh
IP 地址 10.10.10.10 永遠不會在 VPN 之外看到,甚至只有在出現錯誤時才能看到內部,例如在traceroute命令的結果中,或者當然,如果它用於從 VPN 訪問server1而不是從網際網路。從外部執行的traceroute將顯示來自 203.0.113.43 的錯誤。
在server1上有容器或虛擬機怎麼樣?
如果一些流量應該通過 VPN 路由並且一些流量是本地的,那麼上面的tap0可以再次被奴役到網橋。此網橋仍將用於路由 LAN:它不會橋接eth0並且應為其分配 10.10.10.10/32 而不是tap0。除此之外,上述設置和解釋仍然適用。容器可以使用veth連結和虛擬機額外的 TAP 連結,所有這些都受制於網橋。
屯
如果需要與通過隧道使用乙太網相關的屬性,例如讓server1為**server2執行 DHCP 伺服器或實際通過 VPN 共享 LAN 流量, TAP 很有用(TUN 也可以用於混合使用,還有一些路由調整和代理 ARP,但它可能不值得配置複雜性)。Else TUN 可以使用較少的成本(例如:IP 數據包小於乙太網幀並且沒有 ARP)。由於這兩種情況都是路由,所以設置幾乎和上面一樣。
簡單的方法
- 伺服器1:
openvpn --dev tun --topology subnet --ifconfig 192.0.2.161 255.255.255.224
- 伺服器2:
openvpn --remote 203.0.113.43 --dev tun --topology subnet --ifconfig 192.0.2.162 255.255.255.224 --route-gateway 192.0.2.161 --redirect-gateway def1
保持所有 32 個地址可用的方法
- 伺服器1:
添加一個 TUN 介面
/etc/network/interfaces
以簡化server1的 OpenVPN 配置:auto tun0 iface tun0 inet static pre-up ip tuntap add dev tun0 mode tun || : address 10.10.10.10/32 up ip route add 192.0.2.160/27 dev tun0 down ip link delete dev tun0
ifup tun0
如果剛剛完成並執行,請執行:openvpn --dev tun0
- 伺服器2:
up-cmd-server2.sh
在 TAP 版本中使用與上面相同的內容並執行:openvpn --remote 203.0.113.43 --dev tun --topology subnet --ifconfig-noexec --ifconfig 192.0.2.160 255.255.255.255 --route-gateway 10.10.10.10 --redirect-gateway def1 --script-security 2 --up up-cmd-server2.sh