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

Iptables hashlimit и nat

Здравствуйте, я пытаюсь создать правило PREROUTING, чтобы перенаправить трафик на другой порт на основе hashlimit.

iptables -I PREROUTING -t nat -p udp --src 0/0 --dport 53 -j DNAT --to-destination 10.0.2.4:1053

Это отлично работает и перенаправляет все с порта 53 на 1053.

Это использование hashlimit, похоже, работает:

iptables -I PREROUTING -t raw -p udp --dport 53 -m hashlimit --hashlimit-mode srcip --hashlimit-srcmask 32 --hashlimit-above 100/second --hashlimit-burst 1 --hashlimit-name OL_Proc -j DROP

Но следующее, похоже, вообще не работает:

iptables -I PREROUTING -t nat -p udp --dport 53 -m hashlimit --hashlimit-mode srcip --hashlimit-srcmask 32 --hashlimit-above 100/second --hashlimit-burst 1 --hashlimit-name OL_Proc -j DNAT --to-destination 10.0.2.4:1053

Я что-то здесь делаю не так?

РЕДАКТИРОВАТЬ 1:

Основываясь на отзывах parkamark (что имеет смысл), я попробовал следующее:

Это работает, как ожидалось, и направляет весь трафик на новый IP / порт:

iptables -t mangle -A PREROUTING -p udp --dport 53 -j MARK --set-mark 1

iptables -t nat -A PREROUTING -p udp -m mark --mark 0x1 -j DNAT --to-destination 10.0.2.5:1053

Но это не работает, и я не могу понять, почему:

iptables -t mangle -A PREROUTING -p udp --dport 53 -m hashlimit --hashlimit-mode srcip --hashlimit-srcmask 32 --hashlimit-above 100/second --hashlimit-burst 1 --hashlimit-htable-expire 300000 --hashlimit-name OL_Proc -j MARK --set-mark 1

iptables -t nat -A PREROUTING -p udp -m mark --mark 0x1 -j DNAT --to-destination 10.0.2.5:1053

Я вижу в iptables -t mangle -L -v -n, что первое правило выполняется правильно, но второе никогда не срабатывает. Я также включил вход в первое правило и могу убедиться, что он срабатывает на 100%.

Есть идеи / отзывы по этому поводу?

Нет, вы не делаете ничего плохого.

Соединения NAT отслеживаются в таблице отслеживания соединений в ядре. Вы можете просмотреть эту таблицу в любой момент, используя conntrack команда (conntrack -L хорошее начало) - возможно, вам понадобится yum install conntrack-tools если он недоступен в вашей системе.

Как я уже объяснял Вот, когда дело доходит до NAT, правила iptables, определенные против -t nat table определяет, как пакеты изначально сопоставляются для добавления их в таблицу отслеживания соединений. После этого начального совпадения / попадания в правило iptables сеанс будет добавлен в таблицу отслеживания подключений, и все связанные пакеты будут обрабатываться через NAT в ядре, либо до тех пор, пока не истечет время ожидания подключения (в течение определенного периода не наблюдается трафика. времени), соединение разрывается / прерывается (в случае TCP) или вы используете conntrack -D возможность удалить правило NAT из таблицы отслеживания соединений, чтобы оно больше не отслеживалось.

В контексте вашего вопроса первое правило касается raw стол, направляя трафик на -j DROP что является немедленным падением трафика, когда NAT не задействован. Во втором правиле, которое находится на nat стол, -j DNAT --to-destination 10.0.2.4:1053 сопоставляет пакеты и добавляет пакеты начального сеанса в таблицу отслеживания соединений, после чего любой дальнейший связанный трафик между исходным IP / портом клиента и IP / портом назначения 10.0.2.4:1053 больше не будет соответствовать никаким iptables nat правила.