У меня довольно странная проблема. У меня есть сервер с двумя сетевыми интерфейсами eth0
и eth1
. Каждый из них подключен к другой сети. Каждая сеть имеет интернет-шлюз. Сервер имеет различные исходящие соединения: http (некоторые скрипты на серверах очищают веб-сайты), клиент nfs, клиент samba, клиент dns и сборщик электронной почты, и это лишь некоторые из них.
По причинам, в которые я не буду вдаваться, мне нужно разделить эти исходящие клиенты так, чтобы исходящий трафик http, nfs, samba и dns запрашивался только eth0
тогда, когда все остальное проходит eth1
.
Я прочитал несколько поисков в Google, и похоже, что iptables
это то, что мне нужно, но я действительно не понимаю. Я привык только управлять входящими правилами межсетевого экрана ufw
.
Может ли кто-нибудь начать меня с нескольких примеров правил и сказать, как заставить систему принять эти правила при загрузке? В идеале, не блокируя меня из моего соединения SSH (я могу получить физический доступ, но я бы не хотел).
Изменить Я могу разделить клиентов на двух пользователей, если возможно ограничить весь исходящий трафик от учетной записи до одного интерфейса. на бумаге кажется, что это может быть проще.
iftop
и каждый из них показывает правильный тип трафика. Огромное спасибо.iptables-save
иiptables-restore
. Если вы используете NetworkManager, вы можете настроить диспетчерские сценарии для автоматизации процесса. К сожалению, на официальной странице NM нет документации об этой функции, но в документации по Ubuntu и Arch Linux об этом упоминается.Что ж, « самый простой » способ должен указывать отдельным программам использовать определенный интерфейс (или ip интерфейса. Например:
инструктирует ping использовать eth1 в качестве интерфейса источника, а
инструктирует wget проходить через интерфейс, имеющий
10.0.0.1
IP-адрес.Честно говоря, я не знаю, возможно ли это со всеми необходимыми программами, но это начало, чтобы урезать правила, для которых вы должны писать,
iptables
иiproute
программы.Для начала вы должны прочитать это руководство по нескольким интернет-соединениям . Хорошо читать также является одним из тысяч из IPtables учебников, EXPECIALLY на
outbound filtering
,process
/pid filtering
иport filtering
.источник
Правильный способ сделать это - привязать () к интерфейсу, который вы хотите использовать для исходящих пакетов. Так как Вы можете настроить маршруты с
ip route
иip rule
команды управления , как пакеты направляются на основании их исходящего интерфейса. Для моего примера я буду использовать следующую сеть:Я создам две таблицы маршрутизации: одну для исходящего трафика для eth0, называемую альтернативой, и одну таблицу для eth1, называемую основной. Таблица маршрутизация магистрали всегда существует и нормальная таблица , которая используется
route
иip route
командами. Большинство людей никогда не имеют дело с другими таблицами. Чтобы создать таблицу под названием alternate, мы добавим следующую строку/etc/iproute2/rt_tables
:Основная таблица имеет приоритет по умолчанию 254. Правила, для которых действует таблица маршрутизации, контролируются
ip rule
командой. По умолчанию эта команда выведет список существующих правил, который должен выглядеть примерно так:Это в основном говорит, что он будет искать маршрут в таблице,
local
которая является специальной таблицей, поддерживаемой ядром для локальных маршрутов, таких как мой собственный IP-адрес. Затем он попытается использовать таблицу main и table default. Таблица по умолчанию обычно пуста, поэтому, если в main нет совпадений, нет маршрута к хосту. Во-первых, давайте заполним таблицу чередуя с правилами для eth0.Обычно вы хотите, чтобы
alternate
таблица выглядела аналогичноmain
таблице. Разница лишь в том, когда маршрутизация должна быть другой. Вы можете не захотеть включать вторую строку выше, если вы буквально хотите, чтобы весь трафик NFS, HTTP и т. Д. Проходил через шлюз по умолчанию на eth0, даже если он предназначен для сети на eth1. Следующим шагом является добавление правила для использования этой альтернативной таблицы маршрутизации:Это правило говорит, что любой трафик, приходящий с адреса в сети 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, настроенное в цепочке PREROUTING таблицы nat или таблицы mangle. Вам все еще понадобятся измененные таблицы маршрутизации, приведенные выше, чтобы это работало.источник