
Я пытаюсь создать правила iptables для перенаправления всего трафика, предназначенного для порта 1986, на порт 9, чтобы спровоцировать «отказ в подключении», используя следующее правило:
iptables -t nat -I PREROUTING -p tcp -m tcp --dport 1986 -j DNAT --to-destination :9
Это отлично работает для новых подключений, но проблема в том, что установленные подключения, похоже, обходят это правило и не отклоняются.
Я попробовал добавить NOTRACK
правило в таблицу raw, чтобы попытаться избежать отслеживания состояния соединения, но это не дало никакого эффекта:
iptables -t raw -I PREROUTING -p tcp --dport 1986 -m state --state ESTABLISHED,RELATED,NEW,INVALID -j NOTRACK
Добавление состояния в правило nat также не работает:
iptables -t nat -I PREROUTING -p tcp --dport 1986 -m state --state ESTABLISHED,RELATED,NEW,INVALID -j DNAT --to-destination :9
Как использовать iptables для вызова ошибки «соединение отклонено» для пакетов, отправленных по установленным соединениям?
решение1
Правило DNAT
создает запись в таблице conntrack, когда соединение устанавливается с помощью трехстороннего TCP-рукопожатия.
Правило notrack
, похоже, отключает создание новых записей conntrack. Однако оно не мешает использовать существующие записи conntrack.
Поскольку соединение уже установлено, в таблице conntrack уже есть запись, и ядро использует ее для пересылки трафика.
Вам следует использовать conntrack
инструмент для удаления потоков из таблицы conntrack. Например:
conntrack -D -s 192.168.1.10 -d 192.168.100.20 -p tcp --dport 1986
После выполнения этой команды соединение повторно добавляется в conntrack с использованием новых правил DNAT в iptables. Затем новый сервер назначения отклонит соединение. Я не уверен, что именно новый сервер назначения отправит обратно, возможно, TCP RST.