Представьте, что в iptables есть 3 правила:
Это пример (не настоящие) правил:
iptables -A INPUT -m set --match-set whitelist src -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Но я хотел бы сделать это, если пользователь внесен в белый список (1-е правило), тогда не принимайте его, а пропустите / перенаправьте его на 3-е правило (пропустите 2-е правило), как на этом рисунке (Я знаю, что если пакет ПРИНЯТ, значит, это сделано, это только пример, я не знаю, как сделать этот переход):
Итак, я хотел бы спросить вас, как мне установить этот «пропуск» в цепочке.
Подвопрос: Если это возможно, то можно ли также перенаправить его в другую цепочку для определенного правила?
Обновить: Реальный сценарий
iptables -A INPUT -m set --match-set whitelist src -j ACCEPT
iptables -A INPUT -m geoip --src-cc DE -j DROP
... other rules ...
Как видите, я внес в белый список только Германию, если IP-адрес Германии проходит через второе правило, я проверю его на наличие других правил, но я также использую IP-адреса из белого списка.
Поэтому, если какой-то IP-адрес внесен в белый список (в основном не немецкий), я не хочу проверять, является ли он немецким IP-адресом (потому что он не работает), вместо этого IP-адрес должен перейти в другие правила (3-я строка) и пропустить проверку страны.
А как насчет того, чтобы работать?
Пользовательская цепочка может быть использована для более простой организации вещей. Есть еще одна «конечная» цель, более полезная в настраиваемой цепочке: RETURN
чтобы немедленно вернуться и выполнить правило после вызывающего правила. RETURN
в базовой цепочке просто применяется политика по умолчанию, поэтому не так часто используется.
Запрошенный пример становится:
iptables -N whitelist-check
iptables -A whitelist-check -m set --match-set whitelist src -j RETURN
iptables -A whitelist-check -p tcp --dport 22 -j DROP
iptables -A INPUT -j whitelist-check
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Иногда также могут работать инвертирование логики и группировка. Для этого простого случая эквивалентным методом было бы просто:
iptables -A INPUT -p tcp -m set ! --match-set whitelist src --dport 22 -j DROP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Для обновленного сценария: drop все, что не внесено в белый список, ни из DE (ни ...). Для дополнительных исключений просто добавьте больше правил, заканчивающихся на -j RETURN
перед -j DROP
Обновление 2: изменил логику с DE
так как OP тоже изменил его ... если, согласно изменению OP, трафик будет отключен для Германии, здесь трафик будет продолжен для других стран.
iptables -N filterchain
iptables -A filterchain -m set --match-set whitelist src -j RETURN
iptables -A filterchain -m geoip ! --src-cc DE -j RETURN
...
iptables -A filterchain -j DROP
iptables -A INPUT -j filterchain
... other rules ...
Насколько я знаю, вы не можете пропустить правила внутри цепочки. Вы абсолютно можете «перепрыгнуть» в другую цепочку, если правило будет соблюдено. Например, iptables -A INPUT -p tcp -j tcp_packet_chain
сопоставит все пакеты TCP и переместит их в цепочку "tcp_packet_chain". Однако важно отметить, что если пакет не ПРИНЯТ или НЕ ОТКЛОНЕН в цепочке, вы вернетесь к следующему правилу в исходной цепочке.