Постановка задачи: есть у меня 3 сетки: одна домашняя и две "враждебные", одна из которых - инет. Но из эксперимента я исключил вторую враждебную сетку и оставил только домашнюю (rl0) и инет (rl2). Задача - свернуть домашнюю сетку во внешний ip, да так, чтобы снаружи можно было обращаться к определённым сервисам на гейте. Казалось бы просто?
Вот моё решение:
Я собрал фрю 5.4 (была 5.3, а там, как мне известно, ip forwarding не работает, что впрочем не имеет отношения к этой задаче). Запустил natd, для ipfw указал следующие правила:
#!/bin/sh
cmd="ipfw -q add"
skip="skipto 1000"
ifhome="rl0" # домашняя сетка
ifham="rl1" # не используется
ifinet="rl2" # инет
$cmd 50 allow ip from any to any via lo0
$cmd 53 deny ip from any to 127.0.0.0/8
$cmd 55 deny ip from 127.0.0.0/8 to any
$cmd 60 deny icmp from any to any in icmptype 5,9,13,14,15,16,17
$cmd 100 divert natd ip from any to any in via $ifinet
$cmd 110 check-state
# Исходящий траф
$cmd 200 $skip ip from any to any out via $ifinet keep-state
# Deny all inbound traffic from non-routable reserved address spaces
$cmd 400 deny all from 192.168.0.0/16 to any in via $ifinet #RFC 1918 private IP
$cmd 401 deny all from 172.16.0.0/12 to any in via $ifinet #RFC 1918 private IP
$cmd 402 deny all from 10.0.0.0/8 to any in via $ifinet #RFC 1918 private IP
$cmd 403 deny all from 127.0.0.0/8 to any in via $ifinet #loopback
$cmd 404 deny all from 0.0.0.0/8 to any in via $ifinet #loopback
$cmd 405 deny all from 169.254.0.0/16 to any in via $ifinet #DHCP auto-config
$cmd 406 deny all from 192.0.2.0/24 to any in via $ifinet #reserved for doc's
$cmd 407 deny all from 204.152.64.0/23 to any in via $ifinet #Sun cluster
$cmd 408 deny all from 224.0.0.0/3 to any in via $ifinet #Class D & E ulticast
$cmd 500 allow all from any to any via $ifhome
# Входящий траф
$cmd 550 allow tcp from any to me 21 in via $ifinet
$cmd 560 allow tcp from any to me 80 in via $ifinet
$cmd 550 allow icmp from any to me in via $ifinet icmptypes 8
$cmd 700 deny log ip from any to any
$cmd 1000 allow ip from me to any out via $ifinet
$cmd 1010 divert natd ip from any to any out via $ifinet
# по дефолту allow ip from any to any
Что из этого получилось: вся эта конструкция благополучно работает минут 10-15, а потом ipfw резко начинает игнорировать правила, содержащие keep-state (возможно, ещё какие-то) и выкидывать пакеты через 700-е правило. Инет ни в локалке, ни на серваке соответственно не работатет.
Иногда помогает даже добавление и удаление какого-нибудь бестолкового правила.
У кого-нибудь такое было, и кто-нибудь знает, из-за чего это и как с этим бороться?