OpenVPN 连接时无法访问互联网

OpenVPN 连接时无法访问互联网

我正在尝试在我们的服务器上设置 OpenVPN。该服务器运行的是 Centos 7。安装和配置 OpenVPN 后,我可以从 Windows 10 客户端成功连接。但连接后我无法访问互联网。我也无法 ping 主机服务器。与 OpenVPN 无关,我的服务器还使用 KVM 在虚拟网络上运行多个 VM。连接后我也无法 ping VM。

主机连接: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 服务器.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 连接访问虚拟机的更新:

当 libvirtd 虚拟网桥启动时,需要修改 iptables 以将 VPN 流量路由到虚拟机。执行以下两个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 执行):

/etc/libvirt/钩子/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 时不会插入重复的规则)

/etc/libvirt/hooks/守护进程并插入以下内容:

    #!/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

撰写并关闭

答案1

我在客户端配置中指定了 LZO 压缩 (comp-lzo),但在服务器配置中没有指定。修复该问题后,我现在可以访问互联网和网络的其余部分。

相关内容