LINUX.ORG.RU
ФорумAdmin

Настройка DoubleVPN. Роутинг маршрутов

 ,


2

2

Доброго времени суток. Есть с виду простая задача — Поднять DoubleVPN. Информации в сети для новичков с контекстом «How TO», нет. Весь корень проблем заключается в правильной настройке роутинга с первого VPN (входного) на выходной. Идею по роутингу взял отсюда https://habrahabr.ru/sandbox/78897/

Если кто сталкивался, подскажите пожалуйста по настройке, чего не хватает?

Схема подключения: Клиент (Windows)<-->VPN1(1.1.1.1)<-->VPN2(2.2.2.2)<-->Internet

Конфиг клиента на Windows

client
dev tun
proto tcp
remote 1.1.1.1 443
resolv-retry infinite
nobind
ns-cert-type server
persist-key
persist-tun
cipher AES-256-CBC
comp-lzo
verb 3
<ca>
.....
</ca>
<cert>
.....
</cert>
<key>
.....
</key>
<tls-auth>
.....
</tls-auth>
key-direction 1

server.conf на VPN1

port 443
proto tcp
dev tun0
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
server 10.8.0.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"
push "route 10.8.0.0 255.255.255.0"
client-to-client
duplicate-cn
keepalive 10 120
tls-auth ta.key 0
ifconfig-pool-persist ipp.txt
cipher AES-256-CBC
comp-lzo
max-clients 1
user nobody
group nogroup
persist-key
persist-tun
log  /var/log/openvpn.log
verb 3
sndbuf 393216
rcvbuf 393216
push "sndbuf 393216"
push "rcvbuf 393216"
up /etc/openvpn/up
down /etc/openvpn/down

Права на скрипт выставлены, в /etc/default/openvpn выставлено OPTARGS="--script-security 2", на VPN1 форвардинг включен

echo 1 > /proc/sys/net/ipv4/ip_forward


В файле /etc/sysctl.conf тоже раскомменчен этот параметр.
443 порт открыт на INPUT и OUTPUT на VPN1 и на VPN2.


Содержимое up и down скриптов

#!/bin/bash
/sbin/ip rule add from 10.8.0.0/8 table vpn.out
/sbin/ip route add default dev tun1 table vpn.out
/sbin/iptables -t nat -A POSTROUTING -s 10.8.0.0/8 -o tun1 -j SNAT --to-source 10.9.0.1
#!/bin/bash
/sbin/ip rule del from 10.8.0.0/8 table vpn.out
/sbin/ip route del default dev tun1 table vpn.out
/sbin/iptables -t nat -D POSTROUTING -s 10.8.0.0/8 -o tun1 -j SNAT --to-source 10.9.0.1


Табличка для vpn трафика создана

echo '150 vpn.out' >> /etc/iproute2/rt_tables


client.conf На VPN1 для подключения к VPN2

client
remote 2.2.2.2
port 443
proto tcp
dev tun1
resolv-retry infinite
nobind
comp-lzo
persist-key
persist-tun
ca /etc/openvpn/client/ca.crt
cert /etc/openvpn/client/client.crt
key /etc/openvpn/client/client.key
tls-auth /etc/openvpn/client/ta.key 1
log /var/log/openvpn-client.log
verb 3
cipher AES-256-CBC
ns-cert-type server


ifconfig после запуска openvpn на VPN1

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tun1      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.9.0.6  P-t-P:10.9.0.5  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

venet0    Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:127.0.0.2  P-t-P:127.0.0.2  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1
          RX packets:2859 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2732 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:188912 (188.9 KB)  TX bytes:186461 (186.4 KB)

venet0:0  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:1.1.1.1  P-t-P:1.1.1.1  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1


Вывод команды route -n после поднятия интерфейсов

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.9.0.5        0.0.0.0         255.255.255.255 UH    0      0        0 tun1
10.8.0.2        0.0.0.0         255.255.255.255 UH    0      0        0 tun0
10.8.0.0        10.8.0.2        255.255.255.0   UG    0      0        0 tun0
10.9.0.0        10.9.0.5        255.255.255.0   UG    0      0        0 tun1
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 venet0


server.conf на VPN2

port 443
proto tcp
dev tun
ca ca.crt
cert server2.crt
key server2.key
dh dh2048.pem
server 10.9.0.0 255.255.255.0
push "route 10.9.0.0 255.255.255.0"
client-to-client
duplicate-cn
keepalive 10 120
tls-auth ta.key 0
cipher AES-256-CBC
comp-lzo
max-clients 1
user nobody
group nogroup
persist-key
persist-tun
log  /var/log/openvpn.log
verb 3
sndbuf 393216
rcvbuf 393216
push "sndbuf 393216"
push "rcvbuf 393216"


iptables на VPN2

# Generated by iptables-save v1.4.21 on Tue Oct 18 04:45:20 2016
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 10.9.0.0/8 -o venet0 -j SNAT --to-source 2.2.2.2
COMMIT
# Completed on Tue Oct 18 04:45:20 2016
# Generated by iptables-save v1.4.21 on Tue Oct 18 04:45:20 2016
*filter
:INPUT ACCEPT [10:772]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [7:856]
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
COMMIT
# Completed on Tue Oct 18 04:45:20 2016
# Generated by iptables-save v1.4.21 on Tue Oct 18 04:45:20 2016
*mangle
:PREROUTING ACCEPT [35368:44232625]
:INPUT ACCEPT [35367:44232581]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [23529:1984196]
:POSTROUTING ACCEPT [23529:1984196]
COMMIT
# Completed on Tue Oct 18 04:45:20 2016

На VPN2 форвардинг включен.
VPN1 пингует VPN2 по ip 10.9.0.1
VPN2 НЕ пингует VPN1 по ip 10.8.0.1
Интернета на клиенте (Windows) тоже нет.
Клиент из Windows пингует 10.8.0.1 но не пингует 10.9.0.1
Пробовал вместо SNAT (в скриптах) прописывать MASQUERADE. То же самое. Подскажите в какую сторону копать?

Копать нужно в сторону чтения документации и понимания каждой команды, которую пишите.

Если у вас политика ″ACCEPT″, то нет никакого смысла в единственном правиле:

-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

Если вы хотите, чтобы VPN2 пингавал VPN1 по ip 10.8.0.1, вам не SNAT нужно на VPN1 делать, а прописывать на хосте VPN2 маршут к 10.8.0.1.

А для диагностики используется tcpdump. Запускаете на одном хосте ″ping″, а на остальных смотрите ″tcpdump -i tun0 -n -nn icmp″ есть пакеты или нет. Вместо ″tun0″ ставите разные интерфейсы и находите место, где исчезают пакеты (echo-запросы или echo-ответы).

mky ★★★★★
()
Ответ на: комментарий от mky

нет никакого смысла в единственном правиле

Там ещё веселее есть:

10.8.0.0/8

Причём в нескольких местах.

ArcFi
()
Ответ на: комментарий от mky

Если у вас политика ″ACCEPT″, то нет никакого смысла в единственном правиле:

Это правило лишнее убрал.

mky

Там ещё веселее есть:

Каюсь, копировал необдуманно. Исправил на /24.

Сейчас с клиента (windows) пингует 10.9.0.1 (VPN2), но проблема в другом. Теряются пакеты на tun0 интерфейсе, нет перенаправления в tun1. Вот вывод tcpdump:

root@vpn1:~# tcpdump -i tun0 -n -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 65535 bytes
04:31:46.224555 IP 10.8.0.6 > 10.9.0.1: ICMP echo request, id 1, seq 66, length 40
04:31:46.363761 IP 10.9.0.1 > 10.8.0.6: ICMP echo reply, id 1, seq 66, length 40
04:31:47.216599 IP 10.8.0.6 > 10.9.0.1: ICMP echo request, id 1, seq 67, length 40
04:31:47.355435 IP 10.9.0.1 > 10.8.0.6: ICMP echo reply, id 1, seq 67, length 40
04:31:48.213902 IP 10.8.0.6 > 10.9.0.1: ICMP echo request, id 1, seq 68, length 40
04:31:48.352711 IP 10.9.0.1 > 10.8.0.6: ICMP echo reply, id 1, seq 68, length 40
04:31:49.214573 IP 10.8.0.6 > 10.9.0.1: ICMP echo request, id 1, seq 69, length 40
04:31:49.353347 IP 10.9.0.1 > 10.8.0.6: ICMP echo reply, id 1, seq 69, length 40
04:31:56.751741 IP 10.8.0.6 > 8.8.8.8: ICMP echo request, id 1, seq 70, length 40
04:32:01.792694 IP 10.8.0.6 > 8.8.8.8: ICMP echo request, id 1, seq 71, length 40
04:32:06.869611 IP 10.8.0.6 > 8.8.8.8: ICMP echo request, id 1, seq 72, length 40
04:32:11.722925 IP 10.8.0.6 > 8.8.8.8: ICMP echo request, id 1, seq 73, length 40

d0br0t4
() автор топика
Ответ на: комментарий от ArcFi

Форвардинг включен на обоих машинах.

d0br0t4
() автор топика
Ответ на: комментарий от ArcFi

Разобрался в чем причина. Посмотрел детально логи. Суть в том, что сервер (vpn1) стартует раньше чем клиент на нём. Соответственно пишет об ошибке, мол tun1 не найден и скрипты не выполняются.

Подскажите как по умолчанию при перезагрузке сервера, запускать сначала openvpn client, а после server?

d0br0t4
() автор топика
Ответ на: комментарий от d0br0t4

Прописывать default маршут в tun1 должен тот, кто создаёт tun1 (openvpn-клиент), а openvpn-сервер на VPN1 должен прописывать маршрут:

ip route add unreachable default metric 10 table vpn.out
Чтобы в отсутствии tun1 (и отсутствии маршрута по умолчанию в table vpn.out) генерился icmp пакет.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.