OpenVPN & MikroTik

Как оказалось, все просто. Имеется, сервер на ubuntu Linux, который выполняет роль шлюза в некоем головном офисе, задача дешево и хорошо подключить удаленный офис.
В качестве клиента будет выступать MikroTik router board.
Сеть будет маршрутизуемая — офисы, как сидели в разных сетях, так и останутся, но после проброса туннеля будут видеть друг-друга.

Исходные данные:
192.168.0.1/24 — шлюз в головном офисе и сеть, к которой нужно предоставить доступ
192.168.1.1/24 — mikrotik в удаленном офисе, и его сеть.
192.168.201.0/24 — VPN туннели OpenVPN
Linux OpenVPN server
RouterOS включает в себя почти полную реализацию OpenVPN, за некоторыми исключениями: не поддерживается сжатие и UDP транспорт. Исходя из этого конфиг:

 
port 1194
proto tcp
dev tun5
server 192.168.201.0 255.255.255.0
topology net30
push "route 192.168.0.0 255.255.255.0"
topology subnet
client-config-dir /etc/openvpn/office/ccd
route 192.168.1.0 255.255.255.0
ca 	/etc/openvpn/office/ca.crt
cert 	/etc/openvpn/office/server.crt
key 	/etc/openvpn/office/server.key
dh 	/etc/openvpn/office/dh1024.pem
keepalive 5 30
persist-key
persist-tun
status /var/log/openvpn/openvpn-status-office.log
verb 3

в /etc/openvpn/office/ccd добавляем файл с именем ключа клиента без расширения (client1 например)
с единственной строкой

iroute 192.168.1.0 255.255.255.0

Это инструкция для построения внутренней таблицы машртузации OpenVPN

Разрешаем 1194 TCP в цепочке INPUT
и весь трафик для сети 192.168.201.0/24 в FORWARD
ip_forward уже включен.

Для клиента в случае RouterOS для подключения потребуется только клиентский сертификат (с ключом, ес-но)
Для заливки сертификата и ключа загружаем их на FTP MikroTik, после чего их можно будет импортировать на вкладке System-Certificates, сначала сертификат, потом ключ (он добавится к сертификату), для удобства — как-нибудь переименуем.
Дальше просто — добавляем новый интерфейс OpenVPN Client в соответствующем разделе, с параметрами:
Connect To — IP OpenVPN сервера (разрешение имен все еще не поддерживается)
Port: 1194 — в моем случае
Mode: IP (для tun, ether для tap)
username, password роли не играют, но заполнить чем-нибудь прийдется
profile: так же роли не играет
Certificate: импортированный сертификат клиента
Auth: sha1
Cipher: blowfish 128
Add default route: disable

Сохраняем и смотрим, что получилось: интерфейс должен перейти в статус connected, а в таблице маршрутизации должна появится сеть головного офиса
На сервере OpenVPN же должна так же появится запись о внутренней сети клиента.
Так как и OpenVPN сервер и MikroTik уже выполняют роли шлюзов по-умолчанию, после вышеописанных манипуляций все компьютеры в сетях 192.168.0.0/24 и 192.168.1.0/24 будет видеть друг-друга
З.Ы.
Если необходимо подключать несколько клиентов — необходимо добавить правила ifconfig-push для ccd/*,

З.Ы.Ы.
Когда-нибудь позже разберу TAP-туннели, но пока без надобности

2 thoughts on “OpenVPN & MikroTik

  1. А в чём сложности с TAP туннелями? Они хорошие :)
    Позволяют делать «настоящий» интерфейс,
    на который можно натравливать ifconfig+route или iproute.
    Со всеми плюшками вроде iptables + tc + tcpdump.

    При помощи него я стыкую домашние подсети в рабочую.
    «Домашние сети» работают на TPLINK TP-WR1043ND + openwrt + 3g модем.
    Самоподдерживают соединения — так что из дома могу коннектиться в любую подсеть — ну и дома кого угодно достать.. Без ужасов NAT..

    в папке ccd/* (где * имя клиента в его сертификате) лежат конфиги статических адресов — может лишнее — но всё же страховка какая-никакая.. например:
    ifconfig-push 10.8.0.11 255.255.255.0

    Конфиг сервера такой:
    dev tap
    mode server
    tls-server
    port 25555
    proto udp
    ifconfig 10.8.0.1 255.255.255.0
    ifconfig-pool 10.8.0.10 10.8.0.251
    ifconfig-pool-persist /etc/openvpn/ipp.txt
    client-to-client
    route 192.168.0.0 255.255.0.0 10.8.0.10
    route 192.168.60.0 255.255.252.0 10.8.0.11
    route 192.168.72.0 255.255.252.0 10.8.0.12
    push «route 192.168.0.0 255.255.0.0 10.8.0.10»
    push «route 192.168.60.0 255.255.252.0 10.8.0.11»
    push «route 192.168.72.0 255.255.252.0 10.8.0.12»
    push «topology subnet»
    keepalive 10 120
    comp-lzo
    persist-key
    persist-tun
    dh /etc/openvpn/dh1024.pem # public — server only
    ca /etc/openvpn/ca.crt # public, share it
    crl-verify /etc/openvpn/crl.pem # revocation list — server only
    cert /etc/openvpn/main.crt # public
    key /etc/openvpn/main.key # !! secret !!
    client-config-dir /etc/openvpn/ccd

    Клиенты под openwrt, естественно, ещё проще (pkcs12 радует — можно загнать ca.crt+client.crt+client.pem в один файл — что требует отправить клиенту лишь его по ssh):
    /etc/config/openvpn:
    config ‘openvpn’ ‘bridge’
    option ‘config’ ‘/etc/openvpn/main.ovpn’
    option ‘enable’ ‘1’

    /etc/openvpn/main.ovpn:
    client
    tls-client
    ns-cert-type server
    tls-remote Main
    remote mymain.dyndns.ru 25555
    lport 25555
    proto udp
    dev tap
    resolv-retry infinite
    pkcs12 /etc/openvpn/SweetHome.p12
    comp-lzo
    persist-key
    persist-tun
    syslog openvpn(main.ovpn)
    verb 3

    Если клиент хочет иметь свою таблицу маршрутизации (например без некоторых строчек — или с маршрутом по-умолчанию через сервер — как их выборочно отправлять не понял — ибо ccd «push route» в режиме тап не даёт делать), добавляю в его конфиг строки:
    route-nopull
    route 192.168.60.0 255.255.252.0 10.8.0.11
    route 192.168.72.0 255.255.252.0 10.8.0.12
    route 0.0.0.0 0.0.0.0 10.8.0.1

    • Проблем с TAP никаких, но в данном случае используется topology subnet.
      Tap использовать хорошо в мостах, для маршрутизации проще tun.

Добавить комментарий