Мне интересно, как вы пишете свои сложные наборы правил фильтрации пакетов на маршрутизаторе Linux, действующем как брандмауэр. один с политикой сброса по умолчанию.
Я обычно использую такой подход [просто искусственный пример]:
iptables -F ; iptables -X; iptables -P FORWARD DROP
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -N FORWARD_machineA
iptables -A FORWARD_machineA -d $machineA -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD_machineA -d $machineA -s $machineB -p tcp --dport 3306 -j ACCEPT
iptables -A FORWARD_machineA -d $machineA -j DROP
iptables -A FORWARD_machineA -s $machineA -d $machineC -p tcp --dport 2 -j ACCEPT
iptables -A FORWARD_machineA -s $machineA -j REJECT
iptables -N FORWARD_machineB
iptables -A FORWARD_machineB -d $machineB -s $machineA -p tcp --dport 3306 -j ACCEPT
iptables -A FORWARD_machineB -d $machineB -j DROP
iptables -A FORWARD_machineB -s $machineB -d $machineC -p tcp --dport 2 -j ACCEPT
iptables -A FORWARD_machineB -s $machineB -j REJECT
iptables -N FORWARD_machineC
iptables -A FORWARD_machineC -d $machineC -s $machineA -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD_machineC -d $machineC -s $machineB -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD_machineC -d $machineC -j DROP
iptables -A FORWARD_machineC -s $machineC -j REJECT
iptables -A FORWARD -s $machineA -j FORWARD_machineA
iptables -A FORWARD -d $machineA -j FORWARD_machineA
iptables -A FORWARD -s $machineB -j FORWARD_machineB
iptables -A FORWARD -d $machineB -j FORWARD_machineB
iptables -A FORWARD -s $machineC -j FORWARD_machineC
iptables -A FORWARD -d $machineC -j FORWARD_machineC
это работает нормально, но далеко не идеально: например, если я добавляю два сервера в разных подсетях, которым необходимо взаимодействовать, правила необходимо добавлять как в цепочки для machineA, так и для machineB.
в этом случае меня больше всего интересует управляемость / читаемость - поэтому нет необходимости в специальной оптимизации производительности [например, минимизация среднего числа поисков правил].
пс: аналогичный вопрос, но это не ответы, которые я ищу.
Спасибо!
Ты можешь измениться
iptables -A FORWARD -s $machineA -j FORWARD_machineA
iptables -A FORWARD -d $machineA -j FORWARD_machineA
к
iptables -A FORWARD -g FORWARD_machineA
таким образом у вас может быть три таких правила
iptables -A FORWARD -g FORWARD_machineA
iptables -A FORWARD -g FORWARD_machineB
iptables -A FORWARD -g FORWARD_machineC
и после этих трех правил просто поставьте одно
iptables -A FORWARD -j REJECT
Таким образом, если вы разрешите обмен данными только один раз в цепочке FORWARD_machineA или chian FORWARD_machineB для связи между машиной A и машиной B, это может сработать.
По крайней мере, он сокращает шесть строк цепочки -j до трех строк цепочки -g. Это также устраняет необходимость помещать -j REJECT в конец каждой цепочки. Фактически, вы должны удалить -j REJECT из конца каждой цепочки, чтобы вышеуказанный метод работал.
Это простое улучшение, которое можно обобщить на вашем примере. Другие улучшения могут потребовать более подробной информации о том, что вы хотите разрешить и что вы хотите заблокировать.
Вы могли бы использовать pfSense вместо. у него много функции:
Брандмауэр
Графики RRD
Графики RRD в pfSense содержат историческую информацию о следующем.
Динамический DNS
Через:
Лучше всего, что вы можете построить его самостоятельно, используя обычное оборудование, и это Открытый источник.