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

iptables / bridge / настройка NAT

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

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

Здесь мы делаем нечто подобное. 3 подсети за «роутером» CentOS5. По сути, у нас просто есть iptables, настроенные на следующее правило таблицы nat:

iptables -t nat -A POSTROUTING -o <external NIC device> -j SNAT --to-source <external interface IP>

В нашем случае устройство - это eth1, а IP-адрес - 10.0.0.2, чтобы отличаться от подсетей IP4 класса C, которые мы все еще используем здесь.

Настоящая работа выполняется таблицей маршрутизации. Если ваши сетевые адаптеры настроены правильно, записи в таблице маршрутизации уже должны существовать.

Например, у нас есть две подсети в таблице маршрутизации:

192.168.16.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.0.13.0        0.0.0.0         255.255.255.0   U     0      0        0 eth2

Но внешний трафик обрабатывается линией шлюза по умолчанию:

0.0.0.0         10.0.0.10       0.0.0.0         UG    0      0        0 eth1

И трафик, возвращающийся через NAT, отслеживается модулем netfilter в ядре и отправляется на исходный IP-адрес строкой State RELATED, ESTABLISHED в обычной цепочке FORWARD в iptables:

 158M  168G ACCEPT     all  --  eth1   eth0    0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
  8M   11G ACCEPT     all  --  eth1   eth0    0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 

(Примечание: любой человек с шейной бородой хочет исправить ошибки в этом, пожалуйста, оставьте комментарий. Я хотел бы услышать критику.)

Я сомневаюсь, что у кого-то еще будет такая же проблема, как у меня, но вот лучшее решение, которое я нашел (очевидно, что удаление моста было бы лучше, но это было невозможно)

Я установил ebtables и использовал эту команду:

ebtables -t broute -A BROUTING -p IPv4 --in-if eth1 --ip-dst 10.0.0.0/8 -j redirect --redirect-target ACCEPT

..это предотвращает передачу соответствующих пакетов по мосту и означает, что они вместо этого маршрутизируются.

Найдено вдохновение Вот:

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

Что я бы здесь сделал, так это добавить записи маршрутизации на брандмауэр, которые говорят ему использовать дополнительную сетевую карту, если адресуется новая подсеть за новой сетевой картой; это должно позаботиться об отправке материалов туда и обратно. Затем вы можете добавить несколько записей в iptables, чтобы убедиться, что в вашу локальную сеть передаются только пакеты, исходящие из вашей локальной сети, или любые другие политики, которые вы хотите применить.

Что касается того, что у вашего брандмауэра нет трафика NAT, который просто проходит из одной части локальной сети в другую, вы можете просто использовать правило NAT, которое предоставил @AdrianK и которое вы, вероятно, уже используете:

iptables -t nat -A POSTROUTING -o < external NIC device > -j SNAT --to-source < external interface IP >

Если вы не используете статический IP-адрес для «внешнего» интерфейса брандмауэра, вы можете изменить «SNAT» на «MASQUERADE» (но вы, вероятно, знаете об этом, просто для полноты картины).