Дозволити лише певний вихідний трафік на певних інтерфейсах


15

У мене досить дивне питання. У мене є сервер з двома мережевими інтерфейсами eth0і eth1. Кожен з них підключений до іншої мережі. Кожна мережа має Інтернет-шлюз. Сервер має різні вихідні підключення: http (деякі сценарії на веб-сайтах, які прокручують сервер), клієнт nfs, клієнт самби, клієнт dns та вибір електронної пошти.

З причин, на які я не заходжу, мені потрібно розділити цих вихідних клієнтів, щоб вихідний трафік http, nfs, samba та dns запитувався лише eth0тоді, коли все інше вимикається eth1.

Я прочитав кілька пошукових запитів Google, і, схоже, iptablesце те, що мені знадобиться, але насправді не маю підказки. Я звик керувати правилами вхідного брандмауера наскрізь ufw.

Чи може хтось почати мене з кількох прикладних правил і підказати, як змусити систему прийняти ці правила під час завантаження? В ідеалі, не вимикаючи мене зі свого SSH-з'єднання (я можу отримати фізичний доступ, але я краще не хочу).

Редагувати Я можу розділити клієнтів на двох користувачів, якщо можливо обмежити весь вихідний трафік від облікового запису до одного інтерфейсу. на папері, що здається, що це може бути простіше.

Відповіді:


12

Я встановив би окрему таблицю маршрутизації та політику для маршрутизації позначених пакетів за допомогою цієї таблиці і мав iptables / netfilter позначити певні пакети.

Створіть таблицю: echo 1 known >> /etc/iproute2/rt_tables

Створіть правило маршрутизації ( ipкоманда від iproute2 ): ip rule add from all fwmark 1 table known

Ми створили таблицю під назвою "відомий" і створили правило маршрутизації, яке говорить, що будь-який пакет із позначкою, рівним 1, отримує маршрутизацію відповідно до "відомої" таблиці. Я назвав його відомим лише тому, що це для списку відомих протоколів - ви можете назвати його все, що завгодно. Тепер ми налаштовуємо відому таблицю для правильного маршруту.

ip route add default dev eth0 table known

Створіть правила iptables:

iptables -t mangle -I PREROUTING -p tcp --dport 111 -j MARK --set-mark 1
iptables -t mangle -I PREROUTING -p tcp --dport 2049 -j MARK --set-mark 1

Приклад позначає пакети на портах NFS (111, 2049) з 1. Ми додаємо це правило до iptable 'mangle'. Це відрізняється від таблиць маршрутизації і не змінюється; таблиця mangle призначена спеціально для зміни пакетів будь-яким іншим способом, ніж NAT.

Тепер, щоб прокласти все інше через інший інтерфейс, ми додаємо маршрут до стандартної таблиці маршрутизації.

ip route add default dev eth1

Щоб дійсно зрозуміти це, прочитайте розділи 4 та 11 програми " LARTC" .


Ну це насправді набагато простіше, ніж я боявся. Мережевий стек Linux справді прекрасний звір, чи не так ?! Я дав це швидкий тест, і все, здається, працює так, як очікувалося. Я контролюю кожен інтерфейс через, iftopі кожен з них показує правильний тип трафіку. Дуже дякую.
Олі

Я не знаю, як iptables або iproute2 зберігають свою конфігурацію. Чи повинен я знімати ці правила при кожному завантаженні?
Олі

@Oli вони видаляються при перезавантаженні. Ви можете зберегти та відновити правила за допомогою iptables-saveта iptables-restore. Якщо ви використовуєте NetworkManager, ви можете налаштувати диспетчерські сценарії для автоматизації процесу. На жаль, на офіційній сторінці NM немає документації про цю функцію, але в документації на Ubuntu та Arch Linux це згадується.
Шон Дж. Гофф

5

Ну, " найпростішим " способом має бути вказівка ​​одиночним програмам використовувати певний інтерфейс (або ip інтерфейсу. Наприклад:

ping -I eth1 8.8.8.8

вказує ping використовувати eth1 в якості вихідного інтерфейсу, в той час

wget --bind-address 10.0.0.1 http://www.google.it/

вказує wget перейти через інтерфейс, який має 10.0.0.1IP-адресу.

Чесно кажучи, я не знаю, чи можливо це з усіма необхідними програмами, але це початок обробляти правила, необхідні для написання, iptablesта iprouteпрограми.

Для початку слід прочитати цей підручник на кількох підключеннях до Інтернету . Добре прочитати - це також один із тисяч навчальних посібників із iptables, особливо на outbound filtering, process/ pid filteringта port filtering.


4

Правильний шлях до цього - прив’язати () до інтерфейсу, який ви хочете використовувати для вихідних пакетів. Оскільки потім ви можете встановити маршрути за допомогою команд ip routeта ip ruleдля керування маршрутизацією пакетів на основі їх вихідного інтерфейсу. Для мого прикладу я візьму на себе таку мережу:

  • eth0:
    • Адреса: 192.168.0.2/24
    • Шлюз за замовчуванням: 192.168.0.1
  • eth1:
    • Адреса: 192.168.1.2/24
    • Шлюз за замовчуванням: 192.168.1.1

Я створять дві таблиці маршрутизації, одну для вихідного трафіку для eth0, що називається альтернативною, і одну таблицю для eth1, що називається головною. Основна таблиця маршрутизації завжди існує і є звичайною таблицею, яка використовується командами routeта ip route. Більшість людей ніколи не мають справу з якимись іншими таблицями. Щоб створити таблицю під назвою альтернативна, ми додамо наступний рядок до /etc/iproute2/rt_tables:

10    alternate

Основна таблиця має пріоритет за замовчуванням 254. Правилами, щодо яких діє таблиця маршрутизації, керується ip ruleкомандою. За замовчуванням ця команда роздрукує список існуючих правил, який повинен виглядати приблизно так:

0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

В основному це говорить про те, що він буде шукати маршрут у таблиці, localяка є спеціальною таблицею, яка підтримується ядром для локальних маршрутів, таких як моя власна IP-адреса. Потім буде спробувати основна таблиця та таблиця за замовчуванням. За замовчуванням таблиця зазвичай порожня, тому якщо основне не відповідає, немає маршруту для розміщення. По-перше, давайте заповнювати таблицю чергуватись з правилами eth0.

sudo ip route add table alternate 192.168.0.0/24 dev eth0
sudo ip route add table alternate 192.168.1.0/24 dev eth1
sudo ip route add table alternate default via 192.168.0.1

Зазвичай ви хочете, щоб alternateстіл був схожий на mainстіл. Єдині відмінності, коли маршрутизація повинна бути різною. Ви можете не хочете включати другий рядок вище, якщо ви буквально хочете, щоб увесь трафік NFS, HTTP і т.д. проходив через шлюз за замовчуванням на eth0, навіть якщо це призначено для мережі на eth1. Наступним кроком є ​​додавання правила, коли використовувати цю альтернативну таблицю маршрутизації:

sudo ip rule add from 192.168.0.0/24 pref 10 table alternate

Це правило говорить, що будь-який трафік, який надходить з адреси мережі 192.168.0, використовуватиме alternateтаблицю маршрутизації замість звичайної mainтаблиці. Останній крок - переконатися, що всі клієнти, які повинні використовувати eth0прив'язку до нього. З wget, наприклад, встановити --bind-address=192.168.0.2, для NFS встановитиclientaddr=192.168.0.2 опцією кріплення. Якщо ви використовуєте LibWWW з Perl, ви можете встановити параметр localaddr в LWP :: UserAgent для управління локальним інтерфейсом, до якого він пов'язується. Якщо у вас є клієнт, ви не можете керувати джерелом зв’язування та компіляції, це не варіант, ви можете скористатися правилом iptables для зміни його адреси, але це більше хак і може не працювати. Вам знадобиться правило SNAT, встановлене у ланцюжку ПЕРЕДАЧА або таблиці nat, або таблиці mangle. Для цього вам все одно знадобляться модифіковані таблиці маршрутів, наведені вище.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.