Я пытаюсь настроить OpenVPN на нашем сервере. На сервере работает Centos 7. После установки и настройки OpenVPN я могу успешно подключиться с клиента Windows 10. Но после подключения я не могу получить доступ к Интернету. Я также не могу пинговать хост-сервер. Не связанный с OpenVPN, мой сервер также использует KVM, на котором работает несколько виртуальных машин в виртуальной сети. Я также не могу пинговать виртуальные машины при подключении.
Подключение к хосту: 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
Ifconfig:
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 (это также будет выполняться при загрузке или при выполнении systemctl start libvirtd):
vi / и т.д. / 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 повторяющиеся правила не будут вставлены)
vi / и т.д. / libvirt / крючки / демон и вставьте следующее:
#!/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), но не конфигурация сервера. Как только я исправил эту проблему, я теперь могу получить доступ к Интернету и остальной сети.