Policy based маршрутизация и VPN не работает

Раздел для тех, кто начинает знакомиться с MikroTik
Правила форума
Как правильно оформить вопрос.
Прежде чем начать настройку роутера, представьте, как это работает. Попробуйте почитать статьи об устройстве интернет-сетей. Убедитесь, что всё, что Вы задумали выполнимо вообще и на данном оборудовании в частности.
Не нужно изначально строить Наполеоновских планов. Попробуйте настроить простейшую конфигурацию, а усложнения добавлять в случае успеха постепенно.
Пожалуйста, не игнорируйте правила русского языка. Отсутствие знаков препинания и неграмотность автора топика для многих гуру достаточный повод проигнорировать топик вообще.

1. Назовите технологию подключения (динамический DHCP, L2TP, PPTP или что-то иное)
2. Изучите темку "Действия до настройки роутера".
viewtopic.php?f=15&t=2083
3. Настройте согласно выбранного Вами мануала
4. Дочитайте мануал до конца и без пропусков, в 70% случаев люди просто не до конца читают статью и пропускают важные моменты.
5. Если не получается, в Winbox открываем терминал и вбиваем там /export hide-sensitive. Результат в топик под кат, интимные подробности типа личных IP изменить на другие, пароль забить звездочками.
6. Нарисуйте Вашу сеть, рисунок (схему) сюда. На словах может быть одно, в действительности другое.
Ответить
vangrieg
Сообщения: 0
Зарегистрирован: 23 ноя 2016, 20:43

Добрый день всем,

Четвертый день уже мучаюсь с настройкой policy based routing на hAP AC Lite, получаю странный и непонятный результат. Сделать пытаюсь обход блокировок на роутере через VPN для всех компьютеров в локальной сети. Для этого сделал следующее:

1. В качестве DNS указал сервера Google и OpenDNS.
2. Настроил VPN (сейчас это L2TP, но пробовал OVPN, PPTP, результат один). Сам по себе VPN работает, название интерфейса (чтобы понятно было в конфигах ниже) HMA_L2TP, однако интернет через него не работает, если при создании не ставить галку Add default gateway. А если ставить, пропадает весь смысл затеи (об этом ниже).
3. Создал список адресов:

Код: Выделить всё

/ip firewall address-list
add address=195.82.146.214 comment="RCN Blacklist" list=rcn
add address=108.174.10.10 list=rcn
add address=23.22.128.188 list=rcn
add address=31.192.120.36 list=rcn

4. Создал правило в Firewall Mangle:

Код: Выделить всё

add action=mark-routing chain=prerouting comment="Mark for L2TP" dst-address-list=rcn in-interface=bridge log=yes log-prefix=rcn new-routing-mark=L2TP passthrough=yes

5. Создал правило в Firewall NAT:

Код: Выделить всё

add action=masquerade chain=srcnat comment="Masquerade for L2TP" log=yes out-interface=HMA_L2TP


На этом как бы все должно бы заработать, если верить многочисленным мануалам и туториалам, включая тому, который приведен на этом сайте, но нет. Происходит следующее - если в настройках VPN ставить галку Add default gateway, то трафик, как положено, идет через VPN в обход всех блокировок, но, разумеется, весь без исключений. При этом таблица маршрутизации выглядит так:

Код: Выделить всё

#      DST-ADDRESS        PREF-SRC        GATEWAY            DISTANCE
 1 ADS  0.0.0.0/0                          10.200.24.1               0
 2  DS  0.0.0.0/0                          192.168.100.1             1
 3 ADC  10.200.24.1/32     10.200.25.5     HMA_L2TP                  0
 4 ADS  72.8.134.120/32                    192.168.100.1             0
 5 ADC  192.168.88.0/24    192.168.88.1    bridge                    0
 6 ADC  192.168.100.0/24   192.168.100.14  ether1                    0


Если же галку не ставить, а маршрут к 0.0.0.0/0 для routing-mark L2TP прописать вручную, то сайты из списка ведут себя странно - некоторые вообще не открываются, некоторые через какое-то время идут через ether1 и показывают страницу блокировки. Сайты не из списка открываются нормально. При этом самое странное то, что в логах я вижу, что маркировка происходит, правило для NAT работает, отправляются куда положено всякие ACK и SYN, потом, где-то через минуту, RST. Если с компьютера в локальной сети сделать traceroute, то маршрут к сайтам из списка получается через VPN, как положено, к обычным сайтам - через ether1. Таблица маршрутизации при этом выглядит так:

Код: Выделить всё

1 A S  0.0.0.0/0                          HMA_L2TP                  1
 2 ADS  0.0.0.0/0                          192.168.100.1             1
 3 ADC  10.200.24.1/32     10.200.25.3     HMA_L2TP                  0
 4 ADC  192.168.88.0/24    192.168.88.1    bridge                    0
 5 ADC  192.168.100.0/24   192.168.100.14  ether1                    0

Команда print в терминале не показывает все, но первый маршрут имеет routing-mark=L2TP, как положено, и все reachable. IP адреса у VPN динамические, поэтому просто прописать их не получится.

Что я делаю не так?

Заранее спасибо!

 export
# nov/23/2016 20:49:23 by RouterOS 6.37.1
# software id = YC28-MXEQ
#
/interface bridge
add admin-mac=6C:3B:6B:55:93:F5 auto-mac=no comment=defconf name=bridge
/interface ethernet
set [ find default-name=ether2 ] name=ether2-master
set [ find default-name=ether3 ] master-port=ether2-master
set [ find default-name=ether4 ] master-port=ether2-master
set [ find default-name=ether5 ] master-port=ether2-master
/interface l2tp-client
add connect-to=ca.us.hma.rocks disabled=no mrru=1500 name=HMA_L2TP password=***** user=*****
/interface wireless
set [ find default-name=wlan1 ] band=2ghz-b/g/n channel-width=20/40mhz-Ce country=russia distance=indoors frequency=auto mode=ap-bridge ssid=DC wireless-protocol=802.11
set [ find default-name=wlan2 ] band=5ghz-a/n/ac channel-width=20/40mhz-Ce country=russia disabled=no distance=indoors frequency=auto mode=ap-bridge ssid=DC wireless-protocol=802.11
/ip neighbor discovery
set ether1 discover=no
set bridge comment=defconf
/interface wireless security-profiles
set [ find default=yes ] authentication-types=wpa-psk,wpa2-psk mode=dynamic-keys supplicant-identity=MikroTik wpa-pre-shared-key=***** wpa2-pre-shared-key=*****
/ip hotspot profile
set [ find default=yes ] html-directory=flash/hotspot
/ip pool
add name=dhcp ranges=192.168.88.10-192.168.88.254
/ip dhcp-server
add address-pool=dhcp disabled=no interface=bridge name=defconf
/ppp profile
set *0 dns-server=208.67.222.220,208.67.222.222
add change-tcp-mss=no dns-server=8.8.8.8,8.8.4.4 name="HMA OVPN" only-one=no use-encryption=yes use-upnp=no
set *FFFFFFFE dns-server=208.67.222.220,208.67.222.222 only-one=no
/interface ovpn-client
add add-default-route=yes certificate=hmauser.cer_0 cipher=aes256 connect-to=ca.us.hma.rocks disabled=yes mac-address=02:72:F5:DA:25:14 name=HMA_OVPN password=***** port=443 profile="HMA OVPN" user=*****
/interface bridge port
add bridge=bridge comment=defconf interface=ether2-master
add bridge=bridge comment=defconf interface=wlan1
add bridge=bridge comment=defconf interface=wlan2
/ip address
add address=192.168.88.1/24 comment=defconf interface=ether2-master network=192.168.88.0
/ip dhcp-client
add comment=defconf dhcp-options=hostname,clientid disabled=no interface=ether1 use-peer-dns=no
/ip dhcp-server lease
add address=192.168.88.254 client-id=1:4c:b:be:2e:82:eb mac-address=4C:0B:BE:2E:82:EB server=defconf
/ip dhcp-server network
add address=192.168.88.0/24 comment=defconf gateway=192.168.88.1 netmask=24
/ip dns
set allow-remote-requests=yes servers=208.67.222.220,208.67.222.222,8.8.8.8,8.8.4.4
/ip dns static
add address=192.168.88.1 name=netet.local
add address=192.168.88.251 name=dcbrain.local
add address=192.168.88.254 name=dcsurface.local
add address=192.168.88.1 name=dcnet.local
add address=208.67.222.222 name=OpenDNS
add address=208.67.220.220 name=OpenDNS2
add address=8.8.8.8 name=Google1
add address=8.8.4.4 name=Google2
/ip firewall address-list
add address=195.82.146.214 comment="RCN Blacklist" list=rcn
add address=108.174.10.10 list=rcn
add address=23.22.128.188 list=rcn
add address=31.192.120.36 list=rcn
/ip firewall filter
add action=drop chain=input comment="Drop remote telnet" dst-port=23 in-interface=ether1 log=yes protocol=tcp
add action=drop chain=input comment="Drop remote ftp" dst-port=21 in-interface=ether1 log=yes protocol=tcp
add action=drop chain=input comment="Drop remote ssh" dst-port=22 in-interface=ether1 log=yes protocol=tcp
add action=drop chain=input comment="Drop remote api" dst-port=8728 in-interface=ether1 log=yes protocol=tcp
add action=drop chain=input comment="Drop remote api-ssl" dst-port=8729 in-interface=ether1 log=yes protocol=tcp
add action=accept chain=input comment="Allow remote Winbox" dst-port=8291 protocol=tcp
add action=accept chain=input comment="defconf: accept ICMP" protocol=icmp
add action=accept chain=input comment="defconf: accept ICMP on L2TP" in-interface=HMA_L2TP protocol=icmp
add action=accept chain=input comment="defconf: accept establieshed,related" connection-state=established,related
add action=accept chain=input comment="defconf: accept establieshed,related on L2TP" connection-state=established,related in-interface=HMA_L2TP
add action=drop chain=input comment="defconf: drop all from WAN" in-interface=ether1 log=yes
add action=fasttrack-connection chain=forward comment="defconf: fasttrack" connection-state=established,related
add action=accept chain=forward comment="defconf: accept established,related" connection-state=established,related log=yes
add action=accept chain=forward comment="defconf: accept established,related on L2TP" connection-state=established,related in-interface=HMA_L2TP log=yes
add action=drop chain=forward comment="defconf: drop invalid" connection-state=invalid log=yes
add action=drop chain=forward comment="defconf: drop all from WAN not DSTNATed" connection-nat-state=!dstnat connection-state=new in-interface=ether1 log=yes
add action=accept chain=forward disabled=yes out-interface=HMA_L2TP routing-mark=L2TP
add action=accept chain=forward disabled=yes out-interface=ether1 routing-mark=main
/ip firewall mangle
add action=mark-routing chain=prerouting comment="Mark for OVPN" disabled=yes dst-address-list=rcn new-routing-mark=OpenVPN passthrough=no src-address=192.168.88.2-192.168.88.254
add action=mark-routing chain=prerouting comment="Mark for main" disabled=yes dst-address-list=!rcn new-routing-mark=main passthrough=yes src-address=192.168.88.2-192.168.88.254
add action=mark-routing chain=prerouting disabled=yes dst-address-list=!rcn new-routing-mark=main passthrough=yes
add action=mark-routing chain=prerouting comment="Mark for L2TP" dst-address-list=rcn in-interface=bridge log=yes log-prefix=rcn new-routing-mark=L2TP passthrough=yes
add action=mark-routing chain=prerouting disabled=yes dst-address-list=!rcn new-routing-mark=main passthrough=yes src-address=192.168.88.2-192.168.88.254
/ip firewall nat
add action=masquerade chain=srcnat comment="defconf: masquerade" out-interface=ether1
add action=masquerade chain=srcnat comment="Masquerade for OVPN" disabled=yes out-interface=HMA_OVPN src-address=192.168.88.2-192.168.88.254
add action=masquerade chain=srcnat comment="Masquerade for L2TP" log=yes out-interface=HMA_L2TP
add action=accept chain=dstnat disabled=yes in-interface=ether1 routing-mark=L2TP
/ip route
add check-gateway=ping distance=1 gateway=HMA_L2TP routing-mark=L2TP
add check-gateway=arp disabled=yes distance=1 gateway=HMA_OVPN routing-mark=OpenVPN
/ip route rule
add disabled=yes interface=HMA_OVPN routing-mark=OpenVPN table=OpenVPN
add disabled=yes interface=ether1 routing-mark=main table=main
add action=lookup-only-in-table disabled=yes interface=HMA_L2TP routing-mark=L2TP table=L2TP
/ip upnp
set enabled=yes
/ip upnp interfaces
add interface=bridge type=internal
add interface=ether1 type=external
/system clock
set time-zone-autodetect=no time-zone-name=Europe/Moscow
/system identity
set name=DCNet
/system ntp client
set enabled=yes primary-ntp=13.80.12.54 secondary-ntp=213.249.66.35
/system routerboard settings
set cpu-frequency=650MHz init-delay=0s protected-routerboot=disabled
/tool mac-server
set [ find default=yes ] disabled=yes
add interface=bridge
/tool mac-server mac-winbox
set [ find default=yes ] disabled=yes
add interface=bridge


gmx
Модератор
Сообщения: 3290
Зарегистрирован: 01 окт 2012, 14:48

Хотел было вас направить в эту тему viewtopic.php?f=15&t=5972#p31356
но оказалось, что в очередной раз картинки пропали.

Как задолбали хостинги хранения картинок.

Завтра поправлю картинки. А пока поробуйте понять последовательность действий по тексту. :-):


vangrieg
Сообщения: 0
Зарегистрирован: 23 ноя 2016, 20:43

Я был и в этой теме в том числе. Собственно, так и делал. Картинки в этой теме пропали, в других местах есть, дело не в них, без картинок действия тоже в общем понятны.

Ну и я раз восемь уже все удалял и делал заново.

Если есть что-то очевидное, что я упускаю, то я заметить его не могу. :(


gmx
Модератор
Сообщения: 3290
Зарегистрирован: 01 окт 2012, 14:48

Начать нужно с полного отключения ВСЕХ правил фаерволла.

Мой вариант однозначно рабочий. Проверено много раз.
Картинки завтра поправлю.


vangrieg
Сообщения: 0
Зарегистрирован: 23 ноя 2016, 20:43

В общем, если кому интересно, на основном форуме микротика подсказали, в чем проблема - нужно во встроенное правило для fast track вставить условие routing-mark=main, тогда все работает. Либо в новых прошивках баг, либо в старых был баг, который исправили, но с какого-то времени fast track стал мешать такому роутингу. Routing-mark=!VPN при этом не работает.


gmx
Модератор
Сообщения: 3290
Зарегистрирован: 01 окт 2012, 14:48

Так я же вам об этом написал чуть выше...


vangrieg
Сообщения: 0
Зарегистрирован: 23 ноя 2016, 20:43

gmx писал(а):Так я же вам об этом написал чуть выше...


Вы написали про отключение ВСЕХ правил файрволла, что, по понятным причинам, не вполне приемлемое решение, хотя за наводку спасибо.

Я же говорю о том, какое конкретно правило создает проблему. Все остальное отключать не надо. Это правило тоже отключать не надо, лишь немного модифицировать.


vangrieg
Сообщения: 0
Зарегистрирован: 23 ноя 2016, 20:43

Соорудил скрипт, который автоматически проверяет наличие блокировок для сайтов из списка и добавляет их адреса в address-list, по которому трафик направляется через VPN. Может пригодится кому. Скрипт проверяет по ключевым словам наличие в базе antizapret.info и вносит все IP адреса оттуда для обхода блокировки. Причем можно ключевые слова писать "про запас", если блокировки нет, то ничего добавляться не будет до следующей проверки и, соответственно, появления в базе antizapret. И наоборот, если какой-то айпи исчезнет из этой базы, он удалится и из address-list.

Кроме того,VPN я изначально заводил для того, чтобы на некоторые сайты ходить с американским айпи адресом, поэтому скрипт также позволяет опционально добавлять сайты независимо от того, заблокированы они или нет.

Итак, у скрипта два конфигурационных файла - testEntries.txt (для сайтов, которые надо добавить независимо от наличия блокировки), содержащем список доменов через запятую, следующего вида:

Код: Выделить всё

geoip.hidemyass.com,speedtest.net


и whitelist.txt (для ключевых слов, связанных с заблокированными сайтами или теми, которые мы хотим, чтобы скрипт проверял на предмет блокировки):

Код: Выделить всё

linkedin,rutracker.org,facebook,wikipedia


Сам скрипт:

Код: Выделить всё

:log warning ("-----------BEGIN WHITELIST UPDATE----------");

:local txtEntry;
#Здесь пишем название address-list для сайтов из списка РКН. Можете заменить на то, которое прописано у вас.
:local wlName "rcn_whitelist";
#Здесь пишем название address-list для тестовых сайтов (необязательно). Если этот список будет использоваться, для него нужно прописать такое же правило в Mangle, как и для основного списка.
:local tlName "test_sites";
#Название файла со списком сайтов, которые хотим разблокировать через запятую
:local wlFilename whitelist.txt;
#Название файла со списком тестовых сайтов (или других, которые хотим пустить через VPN по каким-либо причинам)
:local tlFilename testEntries.txt;
:local tmpFilename temp.txt;

:log warning ("-------------TEST SITES ADD---------------");

:local list;
do {
    :set list [:toarray [/file get $tlFilename contents]];
    /ip firewall address-list remove [find where list=$tlName];
    :if ($list = "" || $list = "\n") do={
        :log warning ("Test site list is empty. Skipping.");
    } else={
        :foreach i in=$list do={
            do {
                :local tlIp [:resolve $i]
                if ([/ip firewall address-list find where address=$tlIp] = "") do={
                    /ip firewall address-list add list=$tlName comment=$i address=$tlIp;
                    :log warning ("Entry for $i created");
                } else={
                    :log warning ("Entry for $i already exists. Skipping. ");
                }
            } on-error {
                :log warning ("Error - entry for $i couln't be created");
            }
        }
    }
} on-error {
    :log warning ("Couldn't update test site list. Skipping. ");
}

:log warning ("------------BLACKLIST SITES ADD---------------");

:local whitelist;
do {
    :set whitelist [:toarray [:file get $wlFilename contents]];
    /ip firewall address-list remove [find where list=$wlName];
    :if ($whitelist = "" || $whitelist = "\n") do={
        :log warning ("Whitelist is empty. Skipping. ");
    } else={
        :foreach i in=$whitelist do={
            :log warning ("Checking blacklist for $i");
            do {
                /tool fetch url="https://api.antizapret.info/get.php?item=$i&type=csv" mode=https dst-path=$tmpFilename;
                :delay 2;
                :set txtEntry [/file get $tmpFilename contents];
                :if ($txtEntry = "" || $txtEntry = "\n") do={
                    :log warning ("No entry for $i. Skipping. ");
                } else={
                    :log warning ("Blacklist entry for $i found. Adding. ");

                    :local counter 1;
                    :local beg -1;
                    :local nxt;
                    do {
                        :if ($counter = 4) do={
                            :set nxt [:find $txtEntry "\n" $beg];
                        } else={
                            :set nxt [:find $txtEntry ";" $beg];
                        }
                        :set beg ($beg + 1);
                        :local data [:pick $txtEntry $beg $nxt];
                        :set beg $nxt;
                        :if ($counter = 4) do={
                            :local arr [:toarray $data];
                            :foreach j in=$arr do={
                                :if ([/ip firewall address-list find where address=$j] = "") do={
                                    /ip firewall address-list add list=$wlName address=$j comment=$i;
                                    :log warning ("Adding entry for $i with address $j");
                                } else={
                                    :log warning ("Address already exists. Skipping. ");
                                }
                            }
                            :set counter 1;
                        } else={
                            :set counter ($counter + 1);
                        }
                    } while=([:typeof $beg] = "num");
                }
            } on-error {
                :log warning ("No entry for $i");
            }
        }
    }
} on-error {
    :log warning ("Couldn't update whitelist");
}

/file remove $tmpFilename;
:log warning ("---------------END BLACKLIST UPDATE-------------");


У меня этот скрипт запускается автоматом каждую ночь.

Может пригодится кому.


Ответить