Openvpn

OpenVPN 連接時無法訪問網際網路

  • December 5, 2018

我正在嘗試在我們的伺服器上設置 OpenVPN。伺服器正在執行 Centos 7。安裝和配置 OpenVPN 後,我可以從 Windows 10 客戶端成功連接。但是一旦連接我就無法訪問網際網路。我也無法 ping 主機伺服器。與 OpenVPN 無關,我的伺服器還使用在虛擬網路上執行多個 VM 的 KVM。連接時我也無法ping通虛擬機。

主機連接:192.168.1.10

VPN 網路:10.8.0.0

虛擬網路:10.8.8.0

我確認啟用了 IP 轉發。我還更新了 Iptables:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

我在下面列出了 OpenVPN server.conf 和 Ifconfig 資訊。

我已經為此苦苦掙扎了一個星期。在這一點上,我被卡住了,不知道接下來要看什麼。有任何想法嗎?

OpenVPN server.conf:

port 1194
proto udp
dev tun

ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh2048.pem

ifconfig-pool-persist ipp.txt

server 10.8.0.0 255.255.255.0
push "route 192.168.1.10 255.255.255.255"
push "route 10.8.8.0 255.255.255.0"

push "redirect-gateway def1"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

keepalive 10 120
user nobody
group nobody

persist-key
persist-tun

status openvpn-status.log
verb 3
client-to-client

explicit-exit-notify 1

如果配置:

eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 192.168.1.10  netmask 255.255.255.0  broadcast 192.168.1.255
       inet6 fe80::3bcd:ddd4:4650:6087  prefixlen 64  scopeid 0x20<link>
       ether ac:1f:6b:05:cc:96  txqueuelen 1000  (Ethernet)
       RX packets 454678  bytes 136137391 (129.8 MiB)
       RX errors 36  dropped 37074  overruns 0  frame 36
       TX packets 213347  bytes 80743075 (77.0 MiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
       inet 127.0.0.1  netmask 255.0.0.0
       inet6 ::1  prefixlen 128  scopeid 0x10<host>
       loop  txqueuelen 1  (Local Loopback)
       RX packets 91899  bytes 50703642 (48.3 MiB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 91899  bytes 50703642 (48.3 MiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
       inet 10.8.0.1  netmask 255.255.255.255  destination 10.8.0.2
       unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 100  (UNSPEC)
       RX packets 0  bytes 0 (0.0 B)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 0  bytes 0 (0.0 B)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 10.8.8.1  netmask 255.255.255.0  broadcast 10.8.8.255
       ether 52:54:00:34:2a:4d  txqueuelen 1000  (Ethernet)
       RX packets 2663  bytes 193301 (188.7 KiB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 2582  bytes 226983 (221.6 KiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet6 fe80::fc54:ff:fe6e:e2f  prefixlen 64  scopeid 0x20<link>
       ether fe:54:00:6e:0e:2f  txqueuelen 1000  (Ethernet)
       RX packets 2663  bytes 230583 (225.1 KiB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 141674  bytes 7459999 (7.1 MiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

有關從 VPN 連接訪問 VM 的更新:

當 libvirtd 虛擬網橋啟動時,需要修改 iptables 以將 VPN 流量路由到 VM。執行以下兩個 firewall-cmd 命令將手動插入所需的規則。如果執行 firewall-cmd –reload 或任何其他恢復 firewalld 規則的命令,則需要執行此操作。

假設:

  • 為 KVM 創建的虛擬網路設備名為 virbr0,子網為 10.10.0.0/20(如果虛擬網路是在不同的設備名稱下創建的,請根據需要在此處和下方進行調整)。
  • OpenVPN 設備名為 tun0,子網為 10.8.0.0/24
firewall-cmd --direct --passthrough ipv4 -I FORWARD 3 -d 10.10.0.0/20 -i tun0 -o virbr0 -j ACCEPT
firewall-cmd --direct --passthrough ipv4 -I FORWARD 4 -s 10.10.0.0/20 -i virbr0 -o tun0 -j ACCEPT

通過執行 iptables -t filter -S 驗證條目,您應該在列出的所有規則中看到以下內容:

-A FORWARD -d 10.10.0.0/20 -i bridge0 -o virbr0 -j ACCEPT
-A FORWARD -s 10.10.0.0/20 -i virbr0 -o bridge0 -j ACCEPT
-A FORWARD -d 10.10.0.0/20 -i tun0 -o virbr0 -j ACCEPT
-A FORWARD -s 10.10.0.0/20 -i virbr0 -o tun0 -j ACCEPT

注意:之前執行的兩個 firewall-cmd 命令添加了所示的第 3 行和第 4 行。

如果需要,執行以下兩個 firewall-cmd 命令將手動刪除插入的規則。

   firewall-cmd --direct --passthrough ipv4 -D FORWARD -d 10.10.0.0/20 -i tun0 -o virbr0 -j ACCEPT
   firewall-cmd --direct --passthrough ipv4 -D FORWARD -s 10.10.0.0/20 -i virbr0 -o tun0 -j ACCEPT

通過執行 iptables -t filter -S 驗證條目,您應該在列出的所有規則中看到以下內容:

-A FORWARD -d 10.10.0.0/20 -i bridge0 -o virbr0 -j ACCEPT
-A FORWARD -s 10.10.0.0/20 -i virbr0 -o bridge0 -j ACCEPT

注意:之前執行的兩個 firewall-cmd 命令刪除了上面顯示的第 3 行和第 4 行。

問題:libvirtd 服務將在引導或重新啟動時覆蓋上面添加的規則。要解決此問題,請添加以下兩個 libvirt 腳本。

腳本 #1:在啟動或重新連接與 virbr0 關聯的任何 VM 時(這也將在啟動時執行或通過執行 systemctl start libvirtd 執行):

vi /etc/libvirt/hooks/qemu並插入以下內容:

   #!/bin/bash

   # Only execute this script if the opennebula-controller VM is started or reconnected
   if [ "${1}" = "opennebula-controller=" ] ; then

       # Check if vpn input routing rule exists. If not add it.
       iptables -C FORWARD -d 10.10.0.0/20 -i tun0 -o virbr0 -j ACCEPT > /dev/null 2>&1
       if [ $? = 1 ] ; then
           if [ "${2}" = "started" ] || [ "${2}" = "reconnect" ]; then
               firewall-cmd --direct --passthrough ipv4 -I FORWARD 3 -d 10.10.0.0/20 -i tun0 -o virbr0 -j ACCEPT
           fi
       fi

       # Check if vpn output routing rule exists. If not add it.
       iptables -C FORWARD -s 10.10.0.0/20 -i virbr0 -o tun0 -j ACCEPT > /dev/null 2>&1
       if [ $? = 1 ] ; then
           if [ "${2}" = "started" ] || [ "${2}" = "reconnect"  ]; then
               firewall-cmd --direct --passthrough ipv4 -I FORWARD 4 -s 10.10.0.0/20 -i virbr0 -o tun0 -j ACCEPT
           fi
       fi

   fi

寫入並關閉

腳本 #2:在 libvirtd 守護程序停止時(這會刪除規則,以便在重新啟動或執行 systemctl stop libvirtd 時,不會插入重複的規則)

vi /etc/libvirt/hooks/daemon並插入以下內容:

   #!/bin/bash

   # Check if vpn input routing rule exists. If it does, remove it.
   iptables -C FORWARD -d 10.10.0.0/20 -i tun0 -o virbr0 -j ACCEPT > /dev/null 2>&1
       if [ $? = 0 ] ; then
           if [ "${2}" = "shutdown" ]; then
               firewall-cmd --direct --passthrough ipv4 -D FORWARD -d 10.10.0.0/20 -i tun0 -o virbr0 -j ACCEPT
           fi
       fi

   # Check if vpn output routing rule exists. If it does, remove it.
   iptables -C FORWARD -s 10.10.0.0/20 -i virbr0 -o tun0 -j ACCEPT > /dev/null 2>&1
       if [ $? = 0 ] ; then
           if [ "${2}" = "shutdown" ]; then
               firewall-cmd --direct --passthrough ipv4 -D FORWARD -s 10.10.0.0/20 -i virbr0 -o tun0 -j ACCEPT
           fi
       fi

寫入並關閉

我在客戶端配置中指定了 LZO 壓縮 (comp-lzo),但沒有在伺服器配置中指定。一旦我糾正了這個問題,我現在可以訪問網際網路和網路的其餘部分。

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