Лечим глюки провайдера с Mikrotik и DigitalOcean.

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

Как пример вот вид главной странички офф. сайта Тектроникса у моего провайдера и за границей:

Отличия видны невооруженным глазом vava , видео-контент на всем сайте недоступен. И таких примеров куча.

Мне это надоело, и я решил поправить ситуацию, создав за границей шлюз для маршрутизации части своего трафика. Об этом и будет данная статья.

Я как заядлый(читай долбанутый gamer ) админ, естественно имею дома в качестве фаервола железку Mikrotik CCR1009-8G-1S-1S+, это простой, очень производительный и при этом дешевый роутер серии Cloud Core Router. Он без проблем своими 9-ю ядрами Tilera 1.2Ghz переваривает любые даже самые сложные правила, и ко всему прочему у него на борту есть аппаратная акселерация IPSEC шифрования.

Если с железом мы определились, попробуем определится с точкой выхода трафика. Тут хорошо попробовать разных хостеров, универсального совета здесь к сожалению нет, поскольку пути трафика неисповедимы. Помимо этого, надо заметить, что не у всех хостеров можно загружать нужные для тунелирования модули ядра. Единственный способ — тест. Мне хорошо подошла площадка DigitalOcean.

Создадим новый дроплет: OS Debian 9.5 — 1vCPU, 1GB RAM, 25GB SSD, 1TB Lan limit. Это удовольствие нам обойдется в 5 баксов в месяц.

Заходим по выданному IP, и радуемся полноценной виртуалке, с возможностью загрузки нужных модулей.

Ставим минимальный пакет софта необходимый для повседневной эксплуатации:

apt-get install mc tcpdump vnstat aptitude racoon

Чтобы подсчитывать трафик инициализируем и запускаем vnstat:

service vnstat start

В дальнейшем потребленный трафик можно просматривать через  vnstat -q

Поскольку в микротике есть аппаратная акселерация IPSEC грех ей не воспользоваться, для этого установим на дроплет пакет Racoon и настроим его. Я не буду сильно вдаваться в подробности сего действа просто приведу примеры конфигов:
# cat psk.txt

IP_MIKROTIK ПАРОЛЬНАЯ_ФРАЗА_PSK

# cat racoon-tool.conf

global:
log: notify
privsep: no
flush;
spdflush;

# cat racoon.conf

log notify;
path pre_shared_key "/etc/racoon/psk.txt";
path certificate "/etc/racoon/certs";

remote IP_MIKROTIK  {

nat_traversal off;
doi ipsec_doi;
exchange_mode main;
initial_contact on;
generate_policy on;
proposal {
encryption_algorithm aes;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group modp8192;
}
}

sainfo anonymous {
pfs_group modp8192;
lifetime time 1 hour;
encryption_algorithm aes;
authentication_algorithm hmac_sha1;
compression_algorithm deflate;
}

Как видим, конфиги Ракуна максимально просты, и написаны под авто-настройку(полиси генерируются сами, sainfo без указания хостов) Минимум заморочек, при том, что соединится с хостом по IPSEC не имея PSK фразы и указанного IP не получится.

Точно такие-же настройки надо сделать в профилях Микротика:

Есть не планируется разворачивать несколько разных тунелей с разными настройками, можно ограничится правкой дефолтных профилей как на картинках.

Важно учесть, что микротик аппаратно поддерживает акселерацию далеко не всех методов шифрования тунеля. И это стоит проверить! Если акселерация активна, подсветится соответствующая строчка в SA.

Параметры шифрования заданы, теперь самое время создать непосредственно саму тунельку в которую мы завернем трафик:

Со стороны микротика создаем и настраиваем IP-IP тунель с шифрованеием:

И немного маскарада:

/ip firewall nat
add action=masquerade chain=srcnat comment=DigitalOcean out-interface=ipip-tunnel1

Со стороны Linux сервера добавляем в /etc/network/interfaces:

auto tun_ipsec
iface tun_ipsec inet static
address 10.0.200.1
netmask 255.255.255.0
pointopoint 10.0.200.2
pre-up ip tunnel add tun_ipsec mode ipip remote IP_MIKROTIK local IP_ЛИНУКС_СЕРВЕРА
post-down ip tunnel del tun_ipsec

Мной был замечен небольшой глюк, когда тунель не поднимался без трафика со стороны линукс сервера, я не стал основательно копаться в этом и просто добавил в крон строчку, дабы инициировать постоянный небольшой трафик:

* * * * * root ping 10.0.200.2 -c 1

Ну а теперь нафаршируем нашу новоиспеченную туннельку магией IPTABLES:
# cat /etc/rc.local

#!/bin/sh

iptables -F FORWARD
iptables -F INPUT
iptables -F OUTPUT
iptables -t nat -F POSTROUTING

iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i tun_ipsec -s 10.0.200.2 -m state --state NEW -j ACCEPT

iptables -I INPUT -p 4 -m policy --pol none --dir in -j DROP
iptables -I OUTPUT -p 4 -m policy --pol none --dir out -j DROP

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -p ah -m ah -j ACCEPT
iptables -A INPUT -p esp -m esp -j ACCEPT
iptables -A INPUT -p 4 -m policy --pol ipsec --dir in -j ACCEPT

И не забудем добавить в /etc/sysctl.conf разрешение форвардинга:

net.ipv4.ip_forward=1

Настройка Linux-шлюз-сервера на этом завершена, IPSEC настроен, IPIP-тунель с маскарадом выходящего трафика тоже. Все конфиги и операции с ним преведены максимально упрощенно, чтобы систему можно было развернуть максимально быстро. Далее можете фаршировать его по вкусу. gamer

А вот с правилами Микротика придется немного помучаться diablo

Сначала определимся какой трафик нам нужно упаковывать в тунель, лично мне удобно упаковывать весь зарубежный трафик, для этого качаем список всех подсетей РФ и загружаем его в Address-листы микротика:

/tool fetch url=http://www.iwik.org/ipcountry/mikrotik/RU
/import file-name=RU

На текущий момент лист составляет более 8.8к подсетей разных классов, который Cloud Core Router щелкает как орешки  cool

Теперь надо определить два разных маршрута для трафика c двумя разными метками роутинг таблиц:

/ip route

add distance=10 gateway=ether1-TTK-pppoe routing-mark=To_RUS
add distance=1 dst-address=192.168.88.0/24 gateway=SFP-10G-Switch pref-src=192.168.88.1 routing-mark=To_RUS scope=10

add distance=10 gateway=ipip-tunnel1 routing-mark=To_LNX scope=10
add distance=1 dst-address=192.168.88.0/24 gateway=SFP-10G-Switch pref-src=192.168.88.1 routing-mark=To_LNX scope=10

Когда все подготовлено для маршрутизации, создадим правила которые будут маркировать соеденения маркерами в соответствии с адресом назначения трафика. А на основании маркировки коннекшена будет определятся маркировка роутинга и соответственно используемая роутинг-таблица:

/ip firewall mangle

add action=mark-connection chain=prerouting comment="\D2\F0\E0\F4\E8\EA \E2 DigitalOcean" connection-mark=no-mark dst-address-list=Traffic_to_VPN new-connection-mark=Mark_to_LNX passthrough=yes
add action=mark-connection chain=output connection-mark=no-mark dst-address-list=Traffic_to_VPN new-connection-mark=Mark_to_LNX passthrough=yes

add action=mark-connection chain=prerouting comment="\C8\F1\EA\EB\FE\F7\E5\ED\E8\FF, \EA\EE\F2\EE\F0\FB\E5 \ED\E0\E4\EE \F1\EB\E0\F2\FC \F7\E5\F0\E5\E7 \E3\EB\E0\E2\ED\FB\E9 \EA\E0\ED\E0\EB" connection-mark=no-mark \
dst-address-list=Via_real_IP new-connection-mark=Mark_to_RUS passthrough=yes
add action=mark-connection chain=output connection-mark=no-mark dst-address-list=Via_real_IP new-connection-mark=Mark_to_RUS passthrough=yes
add action=mark-connection chain=prerouting dst-address-list=TTK_Local new-connection-mark=Mark_to_RUS packet-mark=no-mark passthrough=no
add action=mark-connection chain=output dst-address-list=TTK_Local new-connection-mark=Mark_to_RUS packet-mark=no-mark passthrough=no
add action=mark-connection chain=prerouting connection-mark=no-mark dst-address-list=RU new-connection-mark=Mark_to_RUS passthrough=yes
add action=mark-connection chain=output connection-mark=no-mark dst-address-list=RU new-connection-mark=Mark_to_RUS passthrough=yes

add action=mark-connection chain=prerouting comment="\D2\F0\E0\F4\F4\E8\EA \E2 DigitalOcean" connection-mark=no-mark new-connection-mark=Mark_to_LNX passthrough=yes
add action=mark-connection chain=output connection-mark=no-mark new-connection-mark=Mark_to_LNX passthrough=yes

add action=mark-routing chain=prerouting comment="\D0\E0\F1\EF\F0\E5\E4\E5\EB\E5\ED\E8\E5 \EA\E0\ED\E0\EB\EE\E2 (\CE\F2\EF\F0\E0\E2\EA\E0 \EC\E0\F0\EA\E8\F0\EE\E2\EA\E8 \EF\EE \ED\E0\E7\ED\E0\F7\E5\ED\E8\FE)" \
connection-mark=Mark_to_LNX new-routing-mark=To_LNX passthrough=yes routing-mark=!To_LNX
add action=mark-routing chain=output connection-mark=Mark_to_LNX new-routing-mark=To_LNX passthrough=yes routing-mark=!To_LNX
add action=mark-routing chain=prerouting connection-mark=Mark_to_RUS new-routing-mark=To_RUS passthrough=yes routing-mark=!To_RUS
add action=mark-routing chain=output connection-mark=Mark_to_RUS new-routing-mark=To_RUS passthrough=yes routing-mark=!To_RUS

После применения этих правил мы получим в мангл-таблице следующие записи:

Логика их работы проста:

Если адрес есть в адрес-листе Traffic_to_VPN — этот трафик принудительно маркируется меткой Mark_to_LNX и заворачивается в роутинг таблицу To_LNX которая шлет все в IPSEC тунель.

Если трафик есть в адрес-листах Via_real_IP(исключения добавленные в ручную), TTK_Local(разного-рода локалки местных провайдеров), RU(в нем вся РФ) — этот трафик принудительно маркируется меткой Mark_to_RUS и заворачивается в роутинг таблицу To_RUS которая шлет все напрямую провайдеру.

Все остальное мы маркируем Mark_to_LNX, заворачиваем в To_LNX, а затем в IPSEC тунель.

Стоит отметить, что в адрес-лист Via_real_IP надо обязательно добавить адрес сервера DigitalOcean дабы избежать проблем с доставкой пакетов IPSEC-тунеля.

На этом можно было-бы закончить, но стоит отметить одну особенность, это слишком большие пакеты. Не всегда успешно могут пересылаться достаточно крупные пакеты, поэтому их стоит фрагментировать на более мелкие при пересылке через тунельку выставив MSS на 40 бит меньше MTU:

/ip firewall mangle
add action=change-mss chain=forward comment="Fix MSS IPIP" new-mss=1380 out-interface=ipip-tunnel1 passthrough=yes protocol=tcp tcp-flags=syn tcp-mss=!0-1380
add action=change-mss chain=forward in-interface=ipip-tunnel1 new-mss=1380 passthrough=yes protocol=tcp tcp-flags=syn tcp-mss=!0-1380

А так-же при этом надо на IPIP интерфейс выставить MTU на ** бит меньше чем MTU физики. Мнения на счет оверлоада ipsec несколько расходятся, поскольку много влияющих факторов, у меня нормально работает mtu 1420 mss 1380.

Иногда так случается, что у провайдера некорректно работает DNS, это тоже можно решить на уровне микротика:

Смотрим DNS которые нам выдал DigitalOcean (cat /etc/resolv.conf) и прописываем их вместе с гугл-днс в настройки DNS микротика, разрешаем внешние запросы и корректируем настройки подсети для DHCP. Незабывая проверирть что трассы до этих DNS ходят через тунельку.

При правильном подборе хостера для шлюза, а так-же физического расположения шлюзового сервера, можно без проблем добится неплохих скоростей:

50 мегабит, 8.8к адрес-листов, а Микротик даже не вспотел drinks

Больше скорости получить не удалось, т.к. провайдер по тарифу дает столько.

На этом все….Спасибо за внимание!

PS.Я сознательно не уделял внимания настройке таблиц filter фаервола на микротике, т.к. обычно там уже есть разного рода доп. записи которые каждый должен учитывать самостоятельно в каждом конкретном случае.

UPD:

Кстати, «special for extra-paranoid sysadmins», команды по запрету IP-IP тунелей без шифрования:
В filter в самый верх надо вынести:

/ip firewall filter
add action=drop chain=output ipsec-policy=out,none protocol=ipencap
add action=drop chain=input ipsec-policy=in,none protocol=ipencap

Иначе можно случайно получить не шифрованный IP-IP который де-энкапсулируется даже tcpdump’ом.

Они просто запретят прохождение инкапсулированных пакетов IP-IP без активной IPSEC обертки dash2

Комментариев: 3 на “Лечим глюки провайдера с Mikrotik и DigitalOcean.

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