Собственно говоря возникла необходимость часто менять правила трансляции адресов на сервере для некоторого немаршрутизируемого в интернет хоста. Причем не просто часто, а буквально каждую минуту по cron. Причем транслируется не только этот хост и не очень хорошо прерывать существующие tcp-сессии. Добавить правило трансляции в ipnat «на ходу» нельзя. Как же изменить правила трансляции не разрывая существующих сессий? Есть 2 варианта:

  1. использовать ipfw nat
  2. разобраться с ipnat

Первый вариант мне однозначно не нравится, поскольку ipfw предназначен не для этого. Попытки осуществлять трансляцию адресов в ipfw вызывают целый ряд проблем и сложностей. О том, что называется «гибкость и масштабируемость» пакетной обработки можно забыть. Остается побеждать ipnat.есть 2 способа перезапуска:

  1. «жесткая» перегрузка  /etc/rc.d/ipnat restart
  2. перегрузка файла правил  /etc/rc.d/ipnat -f /etc/ipnat.rules

Для эксперимента я запустил с хоста,транслируемого исследуемым маршрутизатором, загрузку большого файла по ftp и в процесс загрузки выполнял обе вышеупомянутые команды. В первом случае («жесткая» перегрузка) сессия прерывается, при закачке сразу появляется статус stalled

ftp> get test.tar
local: terst.tar remote: test.tar
229 Entering Extended Passive Mode (|||39430|)
150 Opening BINARY mode data connection test.tar (144693254 bytes)
11% |***************** | 16060 KB 172.69 KB/s                                                                 - stalled -

При перечитывании конфигурационного файла сессия не прерывается! Правда есть другая неприятная особенность, посмотрите:

# ipnat -f /etc/ipnat.conf
4:ioctl(add/insert nat rule): File exists
5:ioctl(add/insert nat rule): File exists
8:ioctl(add/insert nat rule): File exists
11:ioctl(add/insert nat rule): File exists
13:ioctl(add/insert nat rule): File exists
1:ioctl(add/insert nat rule): File exists

Если правил около 1000, то и вывод будет соответствующим. Впрочем это безобразие можно перенаправить в /dev/null и «закрыть глаза».
К сожалению более красивого способа изменения правил трансляции «на лету» я не нашел.