Я работаю над приложением, которое должно ретранслировать пакеты udp с одного хоста на другой в соответствии с некоторыми правилами. Это в основном NAT.
Я согласовываю порты UDP с обоими хостами, и после этого мне нужно получать от хоста A и отправлять на хост B с согласованными портами.
Итак, я динамически добавляю и удаляю iptables
правила.
# my address is 10.1.1.1 # A is 10.10.10.10:30590 - 10.1.1.1:36232 # B is 10.20.20.20:30588 - 10.1.1.1:36230 # A to B iptables -t nat -A PREROUTING -s 10.10.10.10/32 -i eth0 -p udp -m udp --sport 30590 -j DNAT --to-destination 10.20.20.20:30588 iptables -t nat -A POSTROUTING -d 10.20.20.20/32 -p udp -m udp --dport 30588 -j SNAT --to-source 10.1.1.1:36232 # B to A iptables -t nat -A PREROUTING -s 10.20.20.20/32 -i eth0 -p udp -m udp --sport 30588 -j DNAT --to-destination 10.10.10.10:30590 iptables -t nat -A POSTROUTING -d 10.10.10.10/32 -p udp -m udp --dport 30590 -j SNAT --to-source 10.1.1.1:36230
И это работает в большинстве случаев, однако иногда первые пакеты начинают приходить до того, как добавляются правила. Очистка UDP-соединений заставляет правила работать ( conntrack -D -p udp
).
Я пытался отключить отслеживание соединений, используя такие правила, как:
iptables -t raw -A PREROUTING -j NOTRACK iptables -t raw -A OUTPUT -j NOTRACK # or iptables -t raw -A PREROUTING -j CT --notrack iptables -t raw -A OUTPUT -j CT --notrack
Но, похоже, ничего из этого не работает.
Единственным решением будет очистить отслеживание UDP-соединения для каждого потока?
Мне нужно поддерживать тысячи одновременных потоков, и несколько добавляются и удаляются каждую секунду.
Редактировать 2020:
В итоге мы использовали BPF XDP для управления потоками, и он работает очень хорошо!
Отключение отслеживания соединений не подходит, поскольку NAT зависит от отслеживания соединений, поэтому NAT перестанет работать.
Вы должны очистить все соответствующие существующие записи отслеживания соединений после вставки правил NAT, чтобы все последующие приходящие пакеты проверяли nat
таблица для новых правил DNAT / SNAT вместо того, чтобы просто искать «кешированный» результат.
Однако вы жестяная банка нацелить его на более конкретный, чем conntrack -D -p udp
что влияет на все записи отслеживания соединений udp; например, conntrack -D -p udp --src <ip> --sport <port> --dst <ip> --dport <port>
позволит очищать записи только для определенных пар src / dst ip и port.