Debian

使用 OpenVPN 為公共 IP 建立隧道

  • October 14, 2020

我在使用 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 ,當我在伺服器 2openvpn --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 2192.0.2.160以外的任何其他機器上ping 通(甚至無法在Server 1上執行此操作)。

我絕對相信我錯過了一些東西,但我似乎無法弄清楚。

我還要補充一點,我已經/etc/sysctl.confServer 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(可能允許例如server1server2的一側執行 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

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