Назад | Перейти на главную страницу

Маршрутизация трафика приложений через определенный интерфейс

Первый вопрос здесь, так что не торопитесь:

У меня есть сервер debian linux 5.0 с двумя общедоступными интерфейсами. Я хотел бы направить исходящий трафик от одного экземпляра приложения через один интерфейс, а второго экземпляра через второй интерфейс. Есть несколько проблем:

Возможно, я мог бы запустить два виртуализированных сервера на коробке и привязать каждый из них к другому интерфейсу, но я ищу более простое решение, возможно, используя iproute или iptables?

Есть идеи для меня? Заранее спасибо - и я буду рад ответить на любые вопросы.

Вы смотрели на owner модуль в iptables, возможно, в сочетании с исходным правилом NAT?

Это позволяет вам настроить OUTPUT правила цепочки на основе UID, GID, PID, SID и имени команды.

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

Общая идея состоит в том, что вы можете создать несколько параллельных таблиц маршрутизации (ip route имеет необязательный параметр table). Затем вы добавляете правило: «если он с IP [x.x.x.x], то используйте table [foo]».

Так:

  • Создайте таблицы маршрутизации [foo1, foo2] в / etc / iproute2 / rt_tables
  • Заполните таблицы маршрутизации (что-то вроде "ip route add default gateway 1.2.3.4 dev eth0 table foo1" и аналогично для foo2)
  • Создайте правила, чтобы указать, какую таблицу использовать на основе IP-адреса источника - «правило ip добавить из таблицы 1.2.3.2/32 foo1», «правило ip добавить из таблицы 1.2.3.3/32 foo2».

Я не тестировал эти примеры специально, но в прошлом успешно использовал похожие.

В Linux есть поддержка привязки приложения к определенному IP (например, используемому Apache). Если ваше приложение не поддерживает это, вам не повезло.

Мне неизвестны какие-либо модули ядра Linux (потому что это то, что вам может понадобиться) для привязки конкретного приложения к интерфейсу, даже когда оно пытается привязаться к *. Одна из возможностей - использование виртуальной машины.

Самое близкое, что я могу придумать для ваших требований, если нет поддержки приложений, - это связывание интерфейса Ethernet (http://www.cyberciti.biz/howto/question/static/linux-ethernet-bonding-driver-howto.php). Но тогда вы будете запускать только один экземпляр приложения на нескольких интерфейсах с одним и тем же IP.