Как пример вот вид главной странички офф. сайта Тектроникса у моего провайдера и за границей:
Мне это надоело, и я решил поправить ситуацию, создав за границей шлюз для маршрутизации части своего трафика. Об этом и будет данная статья.
Создадим новый дроплет: OS Debian 9.5 – 1vCPU, 1GB RAM, 25GB SSD, 1TB Lan limit. Это удовольствие нам обойдется в 5 баксов в месяц.
Ставим минимальный пакет софта необходимый для повседневной эксплуатации:
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-тунель с маскарадом выходящего трафика тоже. Все конфиги и операции с ним преведены максимально упрощенно, чтобы систему можно было развернуть максимально быстро. Далее можете фаршировать его по вкусу.
А вот с правилами Микротика придется немного помучаться
Сначала определимся какой трафик нам нужно упаковывать в тунель, лично мне удобно упаковывать весь зарубежный трафик, для этого качаем список всех подсетей РФ и загружаем его в Address-листы микротика:
/tool fetch url=http://www.iwik.org/ipcountry/mikrotik/RU /import file-name=RU
На текущий момент лист составляет более 8.8к подсетей разных классов, который Cloud Core Router щелкает как орешки
Теперь надо определить два разных маршрута для трафика 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к адрес-листов, а Микротик даже не вспотел
Больше скорости получить не удалось, т.к. провайдер по тарифу дает столько.
На этом все….Спасибо за внимание!
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 обертки
У меня сайт тектроникса отображается вот так:
Угу обычное отображение у некоторых в РФ…. к сожалению.
После выхода статьи сайт как ни странно заработал нормально)) Хе-хе