Между нашим шлюзом и нашей 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» (но вы, вероятно, знаете об этом, просто для полноты картины).