изолировать локальную сеть от глобальной
Чтобы достигнуть нашей цели - изолировать локальную сеть от глобальной (к которой мы подключены при помощи DSL), используя нашу Linux-машину - необходимы две сетевых карты. Одна карта подключена к локальной сети, вторая - к глобальной. Единственная машина, которая может свободно общаться с окружающим миром - это наш Linux. Все остальные машины должны общаться с внешним миром через firewall, установленный на Linux.
Настройка системы состоит из двух частей, выполняющих разные задачи:
Маршрутизация пакетов между глобальной и локальной сетями (мост)
Фильтрация ненужных, неразрешенных и опасных пакетов (firewall)
В "Мини-Howto: Мосты" приведены подробные инструкции, решающие первую проблему - маршрутизацию пакетов между двумя сторонами сети (локальной и глобальной). Это проделывается следующим способом: обе карты переводятся в режим "promisc", в котором они обрабатывают все пакеты, проходящие по сети, и передают пакеты на другую сторону моста, если там находится их получатель. Эта процедура прозрачна для сети - другие компьютеры даже не видят мост, потому что он даже не имеет IP-адреса. Но это - неполное решение проблемы. Мне нужно, чтобы firewall имел IP-адрес (для административных функций, если не более), и, что гораздо важнее, код моста в ядре перехватывает и передает пакеты до того, как они попадут в firewall, и поэтому в этой ситуации firewall не работает.
Выяснилось, что возможно одновременно назначить IP-адреса сетевым картам и использовать их в качестве моста. Несмотря на то, что в "Мини-Howto: Мосты"
это не делается (ну, на самом деле, там используются внутренние адреса) - все прекрасно работает. Это полностью разрешает первую проблему. Чтобы решить вторую, мы установим патч ядра (он находится по адресу http://ac2i.tzo.com/bridge_filter/), который позволяет применять правила firewall к пакетам, проходящим через сеть, добавляя в таблицу firewall новое правило "bridgein".