Здравствуйте, я пытаюсь создать правило 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
правила.