В цій статі я розповім про моє знайомство із таблицями маршрутизації та політиками маршрутизації в Linux.
Для керування політиками маршрутизації використовується пакет iproute2.
Для чого потрібна маршрутизація пакетів на основі політик маршрутизації?Маємо декілька адрес чи інтерфейсів на одному сервері, зазвичай пакети будуть виходити через той інтерфейс та з тієї адреси що прописані в основній таблиці маршрутизації (таблиця `main`) як основний шлюз.
root@node01:~# ip route show table main
default via 10.10.10.11 dev ens18
У випадку, наприклад якщо у нас на сервер під'єднано декілька інтернет-провайдерів, за допомогою політики маршрутизації та таблиць маршрутизації можемо налаштувати балансування внутрішнього трафіку через них.
Це один із прикладів, далі я розповім ще один приклад із мого кейсу.
Час від часу я заглядаю на біржі фрилансу для пошуку цікавих для мене проєктів, а саме таких в яких у мене є прогалини в знаннях чи є розуміння розв'язання задачі тільки в теорії.
Тут і попався мені такий проєкт.
Умови:
Є віддалений орендований сервер з публічною (білою) адресою.
Є локальний сервер, в цьому сервері дві мережеві карти:
перша для виходу в інтернет (далі - eth0);
друга для локальної мережі (далі - eth1).
Завдання:
Об’єднати ці два сервери за допомогою OpenVPN (далі - tun0)
Направити увесь трафік із локального інтерфейсу через VPN на орендований сервер.
Заборонити вихід в інтернет через інтерфейс eth0 з інтерфейсу eth1.
Ну, почнемо! Будемо налаштовувати тільки локальний сервер, віддалений орендований сервер та об'єднання двох серверів через OpenVPN тут розглядати не будемо.
Створення таблиці маршрутизації
Для початку гляньмо які таблиці вже існують
root@node01:~# ip rule ls
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
бачимо що є наступні таблиці local main default, їх також ми бачимо в файлі /etc/iproute2/rt_tables
root@node01:~# cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
додамо свою таблицю в цей файл, назвемо її toVPN під номером 100,
номер бажано брати від 2 до 252 вони матимуть більший пріоритет.
echo “100 toVPN” » /etc/iproute2/rt_tables
Наступним кроком буде додавання основного шлюзу
ip route add default via 172.16.0.1 dev tun0 table toVPN
default - вказуємо що це основний маршрут;
172.16.0.1 - адреса віддаленого сервера;
tun0 - мережевий інтерфейс OpenVPN;
toVPN - назва таблиці маршрутизації (назву можливо замінити номером таблиці - 100).
Як результат в нас вийшло створити таблицю маршрутизації під назвою toVPN та номером 100, додали до цієї таблиці основний шлюз.
Створення політик маршрутизації
На цьому етапі потрібно розібратися як же вказати мережі, інтерфейсу чи промаркованому трафіку які таблицю маршрутизацію потрібно використовувати. З цим нам допоможе політики маршрутизації.
Додамо політику маршрутизації для локальної мережі
ip rule add iif eth1 table toVPN
iif - вказуємо назву інтерфейсу на який прийшов пакет, наш випадок;
oif - вказуємо назву інтерфейсу із якого вийшов пакет, працює для вихідних пакетів з локальних сокетів, прив’язаних до пристрою;
from - адреса чи мережа із якої прийшов пакет;
to - отримувач пакетів;
fwmark - вказуємо маркер.
Форвардінг та Маскарад
З маршрутизацією закінчили, но у нас нічного не запрацює без “Маскараду” чи “Роутінгу” та ще й “Форвард” пакетів потрібно дозволити.
Примітка:
iptables на сервері налаштований і політика для FORWARD встановлена DROP - відкинути весь трафік який не дозволено, тому 3 пункт виконано)
Почнімо із FORWARD:
Дозволяємо ipv4 forward:
sed -i 's/.*net.ipv4.ip_forward.*/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
sysctl -p
Додамо правила forward в iptables:
# першими двома правилами ми дозволимо проходити трафіку
# встановленних з’єднань або додаткових
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# дозволимо проходити трафіку від eth1 до tun0
iptables -A FORWARD -i eth1 -o tun0 -j ACCEPT
Додамо правило masquerade в iptables:
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
Підсумок
В цій статті ми створили таблицю маршрутизації, додали основний шлюз в нашу таблицю, створили політику маршрутизації та налаштували iptables.
Потрібно ще оговорити нюанси:
При перепідключенні (відключенні) VPN з’єднання, основний шлюз із таблиці toVPN.
Це можливо вирішити написавши bash скрипт який буде підчищати залишки налаштувань коли tun0 зі статусом down, а при статусі up налаштовувати таблицю маршрутизації, політики маршрутизації та правила iptables.
При використанні постійних мережевих інтерфейсів проблем не повинно виникнути.
Від автора
Це перша моя публічна стаття в житті, на далі буду старатися робити більше таких заміток на різні тематики.
Ця стаття була написана як замітка для себе майбутнього та людей які шукають рішення подібній задачі.
Із задоволенням почитаю адекватну критику та відгуки.
Дякую за увагу!