Я хочу создать туннель OpenVPN между сетями 192.168.1.0/24 и 192.168.2.0/24. Однако почему-то пакеты, входящие в туннель с одной стороны, не выходят с другой стороны ...
Участвуют следующие хосты:
R1=192.168.1.1 Router in LAN 1
R2=192.168.2.1 Router in LAN 2
S1=192.168.1.10 OpenVPN Server in LAN 1, no ip tables, net.ipv4.ip_forward=1
C2=192.168.2.10 OpenVPN Client in LAN 2, no ip tables, net.ipv4.ip_forward=1
H1=192.168.1.20 Some host in LAN 1 with default gateway R1
H2=192.168.2.20 Some host in LAN 2 with default gateway R2
Я настроил OpenVPN и установил маршруты в маршрутизаторы, конфигурация см. Ниже. Подключение работает, давайте пингуем.
C2> ping 10.8.0.1 # OK
C2> ping S1=192.168.1.10 # OK
C2> ping R1=192.168.1.1 # OK
S1> ping 10.8.0.6 # OK
S1> ping C2=192.168.2.10 # NO
H1> ping C2=192.168.2.10 # NO
H2> ping S1=192.168.1.10 # NO
Я проверил S1 и C2 с помощью tcpdump и заметил, что все запросы ICMP приходят на один конец туннеля, но не выходят на другой конец, например пингование сначала S1 от H2, что не сработало, затем пинг C2 с S1
C2> tcpdump -s0 -i tun0
17:05:53.070047 IP C2 > 10.8.0.1: ICMP echo request, id 10190, seq 1, length 64
17:05:53.099990 IP 10.8.0.1 > C2: ICMP echo reply, id 10190, seq 1, length 64
17:06:04.115396 IP C2 > S1: ICMP echo request, id 10194, seq 1, length 64
17:06:04.148898 IP S1 > C2: ICMP echo reply, id 10194, seq 1, length 64
17:06:16.160644 IP 10.8.0.1 > C2: ICMP echo request, id 4479, seq 1, length 64
17:06:16.160720 IP C2 > 10.8.0.1: ICMP echo reply, id 4479, seq 1, length 64
17:06:11.532787 IP C2 > R1: ICMP echo request, id 10221, seq 1, length 64
17:06:11.563275 IP R1 > C2: ICMP echo reply, id 10221, seq 1, length 64
17:07:05.149219 IP H2 > S1: ICMP echo request, id 57470, seq 0, length 64
S1> tcpdump -s0 -i tun0
17:05:53.083547 IP 10.8.0.6 > S1: ICMP echo request, id 10190, seq 1, length 64
17:05:53.083624 IP S1 > 10.8.0.6: ICMP echo reply, id 10190, seq 1, length 64
17:06:04.130861 IP 10.8.0.6 > S1: ICMP echo request, id 10194, seq 1, length 64
17:06:04.130941 IP S1 > 10.8.0.6: ICMP echo reply, id 10194, seq 1, length 64
17:06:11.546125 IP 10.8.0.6 > R1: ICMP echo request, id 10221, seq 1, length 64
17:06:11.546766 IP R1 > 10.8.0.6: ICMP echo reply, id 10221, seq 1, length 64
17:06:16.144123 IP S1 > 10.8.0.6: ICMP echo request, id 4479, seq 1, length 64
17:06:16.172989 IP 10.8.0.6 > S1: ICMP echo reply, id 4479, seq 1, length 64
17:06:43.928054 IP S1 > C2: ICMP echo request, id 4484, seq 1, length 64
17:06:54.095618 IP H1 > C2: ICMP echo request, id 1091, seq 1, length 64
Таким образом, это не похоже ни на проблему маршрутизации, ни на какую-либо проблему, связанную с брандмауэром, поскольку iptables пусты как на S1, так и на C2. Есть идеи, в чем может быть проблема? Почему пакеты не приходят в конец туннеля? Похоже, что в OpenVPN включена фильтрация пакетов.
Маршруты R1:
192.168.2.0/24 via 192.168.1.10 dev lan
10.8.0.0/24 via 192.168.1.10 dev lan
Маршруты R2:
192.168.1.0/24 via 192.168.2.10 dev lan
10.8.0.0/24 via 192.168.2.10 dev lan
Маршруты S1:
default via 192.168.1.1 dev eth0 proto static metric 1024
10.8.0.0/24 via 10.8.0.2 dev tun0 proto static metric 20
10.8.0.2 dev tun0 proto kernel scope link src 10.8.0.1
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10
192.168.1.1 dev eth0 proto dhcp scope link src 192.168.1.10 metric 1024
192.168.2.0/24 via 10.8.0.2 dev tun0 proto static metric 20
Маршруты C2:
default via 192.168.2.1 dev wlp2s0 proto static metric 1024
10.8.0.1 via 10.8.0.5 dev tun0 proto static metric 20
10.8.0.5 dev tun0 proto kernel scope link src 10.8.0.6
192.168.1.0/24 via 10.8.0.5 dev tun0 proto static metric 20
192.168.2.0/24 dev wlp2s0 proto kernel scope link src 192.168.2.10
server.conf
dev tun
port 1195
proto tcp
server 10.8.0.0 255.255.255.0
route 192.168.2.0 255.255.255.0
push "route 192.168.1.0 255.255.255.0"
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
tls-auth ta.key 0
comp-lzo
keepalive 10 60
persist-key
persist-tun
user nobody
group nobody
client.conf
client
dev tun
port 1195
proto tcp-client
tls-client
remote mylan.de 1195
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1
verify-x509-name server name
comp-lzo
keepalive 10 60
persist-key
persist-tun
user nobody
group nobody
Решение нашел сам, возникли две проблемы: Прочитав мануал по openvpn слово iroute
попался мне на глаза, что было первой и основной частью решения. Для подробностей я рекомендую прочитать этот учебник https://community.openvpn.net/openvpn/wiki/RoutedLans.
После этого почти все работало, кроме подключения к серверу openvpn и клиентскому хосту S1 и C2. Вторая проблема заключалась в функции ядра, о которой я не знал: несколько таблиц маршрутизации и RPDB. Была вторая таблица маршрутизации с другим установленным шлюзом по умолчанию:
S1> ip route list table 1
default via 192.168.1.1 dev eth0
192.168.1.0/24 via 192.168.1.10 dev eth0
S1> ip rule
0: from all lookup local
500: from 192.168.1.10 lookup 1
32766: from all lookup main
32767: from all lookup default
Решением был специальный сценарий маршрутизации, который вводил правильные маршруты в эту таблицу маршрутизации.
server.conf
dev tun
port 1195
server 10.8.0.0 255.255.255.0
# allow script execution
script-security 2
# routing information
route 192.168.2.0 255.255.255.0
route-up /etc/openvpn/vpn-route-up.sh
push "route 192.168.1.0 255.255.255.0"
push "route 192.168.2.0 255.255.255.0"
client-to-client
# setup client specific iroutes
client-config-dir /etc/openvpn/ccd/
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
tls-auth ta.key 0
comp-lzo
keepalive 10 60
persist-key
persist-tun
user nobody
group nobody
ccd / client1 на S1 (client1 - это CN клиента)
iroute 192.168.2.0 255.255.255.0
client.conf
dev tun
port 1195
client
remote mylan.de 1195
# allow script execution
script-security 2
# routing information
redirect-private bypass-dhcp bypass-dns
route-up vpn-route-up.sh
ca ca.crt
cert client1.crt
key client1.key
tls-auth ta.key 1
verify-x509-name server name
comp-lzo
keepalive 10 60
persist-key
persist-tun
user nobody
group nobody
vpn-route-up.sh на S1
#!/bin/sh
ip route add 10.8.0.0/24 dev tun1 proto kernel scope link src 10.8.0.1 table 1
ip route add 192.168.2.0/24 via 10.8.0.2 dev tun1 table 1
vpn-route-up.sh на C2
#!/bin/sh
ip route add 10.8.0.0/24 dev tun1 proto kernel scope link src 10.8.0.2 table 1
ip route add 192.168.1.0/24 via 10.8.0.1 dev tun1 table 1
в H1
попробуйте добавить такой маршрут "route add -net 192.168.2.0/24 gw 192.168.1.10"
и после этого попробуйте пинговать еще раз, если хотите H1
и H2
пингуют друг друга, в H2
сделать то же самое, "rout add -net 192.168.1.0/24 gw 192.168.2.10"
In this the two pc in the two lans, they will use the vpn client and vpn server to reach the remote lan