Удалить определенные записи conntrack?
В конфигурации с несколькими ISP я маршрутизирую и маршрутизирую определенный трафик, например, VoIP, через определенный интерфейс - к отдельному провайдеру. Когда один из интерфейсов (или маршрутов) становится недоступным, все соединения, которые его использовали, должны быть сброшены, а последующий трафик должен маршрутизироваться через все еще работающее соединение. При изменении статуса я сбрасываю и загружаю соответствующие iptables и записи маршрутизации (это "перезагрузка shorewall" - я использую shorewall).
Проблема в том, что все еще присутствующие записи conntrack приводят к тому, что старый (и теперь неправильный) внешний адрес все еще используется для NAT для этих соединений! После 'conntrack -D' NAT снова работает, как и ожидалось.
Я хотел бы удалить только записи conntrack, принадлежащие старому внешнему адресу, или решить проблему таким образом, чтобы это не влияло на соединения через другие интерфейсы.
Например, я хотел бы удалить все записи conntrack, имеющие адрес обратного соединения dst=old.ext.ip.adr
, лайк
udp 17 164 src=192.168.158.3 dst=213.208.5.40 sport=5060 dport=5060 packets=178 bytes=104509 src=213.208.5.40 dst=old.ext.ip.adr sport=5060 dport=5060 packets=234 bytes=127268 [ASSURED] mark=256 secmark=0 use=2
Что я уже пробовал:
# conntrack -D -r 212.108.43.143
^C (nothing happens, it just hangs)
# conntrack -D -r 213.208.5.40 -d 212.108.43.143
Operation failed: such conntrack doesn't exist
Заранее спасибо! С наилучшими пожеланиями, Зрин
3 ответа
Решение дано здесь.
У меня есть похожая задача - удалить определенные записи conntrack, относящиеся к UDP-соединениям, идущим к определенному Интернет-хосту и являющимся SNAT'ом, поэтому я создал следующий скрипт:
#!/bin/sh
set -e -u
HUB=AAA.BBB.CCC.DDD # target host's IP address
value()
{
echo ${1#*=}
}
/usr/sbin/conntrack -L conntrack -p udp -d $HUB |
while read proto _ _ src dst sport dport _; do
/usr/sbin/conntrack -D conntrack \
--proto `value $proto` \
--orig-src `value $src` \
--orig-dst `value $dst` \
--sport `value $sport` \
--dport `value $dport`
done
Создайте файл с именем clrcontrack, вставьте нижеприведенный код внутрь, предоставьте пользователю надлежащий доступ, сделайте его исполняемым, запустите его как "clrcontrack ip port", например, clrcontrack 192.168.56.123 80. Он должен очистить все установленные записи контрольных состояний для порта 80 на ip. Если вы не хотите целевого состояния, удалите часть grep ESTAB или замените ее соответствующим образом, чтобы выбрать любое состояние
/usr/sbin/conntrack -L |grep $1 | grep ESTAB |grep 'dport=$2' |
awk '{ system("/usr/sbin/conntrack -D --orig-src '$1' --orig-dst "
substr($6,5) " -p tcp --orig-port-src " substr($7,7) " --orig-port-dst $2");}';