OpenVPN 連接時無法訪問網際網路
我正在嘗試在我們的伺服器上設置 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),但沒有在伺服器配置中指定。一旦我糾正了這個問題,我現在可以訪問網際網路和網路的其餘部分。