Здравствуйте, я пытаюсь создать правило 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
, определяют, как пакеты изначально соответствовали для добавления их в таблицу отслеживания соединений. После этого начального совпадения / попадания в правило 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
.