Таки смог заставить работать сервер, при упавшем natd. Хотя всё дело в руках - при правильной настройке natd у меня ещё ни разу не падал.
Сложности конфигурации заключалась в том, чтобы заставить пакеты, проходящие через divert(4), создавать динамические правила (keep-state).
Вот собственно конфигурация:
00400 check-state
00410 divert natd ip from 192.168.0.0/24 to any via tun0
00420 count tag 80 ip from me to any diverted-output via tun0 keep-state
00425 count untag 80 ip from me to any diverted-output via tun0
00430 divert natd untag 80 ip from any to me tagged 80 via tun0
00440 divert natd ip from any to me dst-port 21,25,80,60000-60100 via tun0
, где:
192.168.0.0/24 - локалка
tun0 - интерфейс сервера, смотрящий в интернет
400 - включаем динамические правила
410 - выпускаем локалку в инет через natd
420 - создаем динамическое правило для пакетов ответивших из интернета на пакеты с natd, помечаем эти входящие пакеты меткой 80 (можно любой другой не используемой)
425 - так, косметическое правило (его можно и убрать) :)
430 - пакеты из интернета с меткой 80 отправляем в natd
440 - пакеты с инета предназначенные для портфорвардинга также отправляем в natd
Удобство этой конфигурации ещё и в том, что пакеты, непредназначенные для natd и приходящие с интернета, не будут отправляться в divert(4) сокет (как в классическом варианте: divert natd from any to me), а будут полностью обрабатываться ядром.