в конфигурации с несколькими интернет-провайдерами я маршрутизирую и использую NAT для конкретного трафика, например 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
Заранее спасибо! С уважением, Зрин
Решение дано Вот.
У меня аналогичная задача - удалить определенные записи 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");}';
Пытаться,
conntrack -D --src-nat --reply-dst old.ext.ip.adr