Страница 1 из 1

Нужна помощь по kernel NAT!

Добавлено: 2009-07-16 13:13:19
km
Здравствуйте!

С FreeBSD работать начал совсем недавно. Хочу сказать, спасибо lissyara за сайт и форум. Отдельное спасибо пользователям за статьи и опыт, которыми они делятся.

Задача такая: пробросить порт на локальную машину.

Подробнее:
Установлена FreeBSD 7.2. Имеем два интерфейса xl0(внешний интерфейс с ip:192.168.0.2) и sk0(внутренний интерфейс c ip:192.168.10.1). xl0 - подключен к роутеру(аппаратное устройство с ip:192.168.0.1). На роутере(192.168.0.1) проброс порта 6969 идет на 192.168.0.2(xl0).

Ядро собрано со следующими опциями:

Код: Выделить всё

options         IPFIREWALL
options         IPFIREWALL_VERBOSE
options         IPFIREWALL_VERBOSE_LIMIT=100
options         IPFIREWALL_FORWARD
options         IPFIREWALL_DEFAULT_TO_ACCEPT
options         IPFIREWALL_NAT
options         LIBALIAS
rc.conf(только то, что касается сети и firewall):

Код: Выделить всё

defaultrouter="192.168.0.1"
gateway_enable="YES"
ifconfig_sk0="inet 192.168.10.1 netmask 255.255.255.0"
ifconfig_xl0="inet 192.168.0.2 netmask 255.255.255.0"
firewall_enable="YES"
firewall_nat_enable="YES"
firewall_nat_interface="xl0"
firewall_script="/etc/firewall.sh"
sysctl(только то, что касается firewall):

Код: Выделить всё

net.inet.ip.fw.dyn_keepalive: 1
net.inet.ip.fw.dyn_short_lifetime: 5
net.inet.ip.fw.dyn_udp_lifetime: 10
net.inet.ip.fw.dyn_rst_lifetime: 1
net.inet.ip.fw.dyn_fin_lifetime: 1
net.inet.ip.fw.dyn_syn_lifetime: 20
net.inet.ip.fw.dyn_ack_lifetime: 300
net.inet.ip.fw.static_count: 25
net.inet.ip.fw.dyn_max: 4096
net.inet.ip.fw.dyn_count: 152
net.inet.ip.fw.curr_dyn_buckets: 256
net.inet.ip.fw.dyn_buckets: 256
net.inet.ip.fw.tables_max: 128
net.inet.ip.fw.default_rule: 65535
net.inet.ip.fw.verbose_limit: 100
net.inet.ip.fw.verbose: 1
net.inet.ip.fw.one_pass: 0
net.inet.ip.fw.autoinc_step: 100
net.inet.ip.fw.enable: 1
firewall.sh:

Код: Выделить всё

#!/bin/sh
iip="192.168.10.1"
oip="192.168.0.2"
oif="xl0"
iif="sk0"

ipfw -f flush
ipfw add 1 check-state

ipfw add 10 allow all from any to any via lo0

ipfw add 20 fwd ${iip},8080 tcp from ${iip}/24 to any 80 recv ${iif}

ipfw nat 1 config ip ${oip} redirect_port tcp 192.168.10.11:6969 6969
ipfw add 30 nat 1 tcp from 192.168.10.11 6969 to any via ${oif}
ipfw nat 2 config ip ${oip} redirect_port udp 192.168.10.11:6969 6969
ipfw add 40 nat 2 udp from 192.168.10.11 6969 to any via ${oif}

ipfw add 50 deny icmp from any to any in icmptype 5,9,13,14,15,16,17
ipfw add 60 reject ip from ${iip}/24 to any in via ${oif}
ipfw add 70 allow tcp from me to any keep-state via ${oif}
ipfw add 80 allow icmp from any to any
ipfw add 90 allow udp from me to any domain keep-state
ipfw add 100 allow udp from any to me domain
ipfw add 110 allow ip from me to any

ipfw nat 3 config if ${oif} deny_in same_ports unreg_only
ipfw add 120 nat 3 ip from any to any out via ${oif}
ipfw add 130 nat 3 ip from any to ${oip} in via ${oif}

ipfw add 140 allow tcp from any to any 25,110 out via ${oif}
ipfw add 150 allow tcp from any 25,110 to any in via ${oif}

ipfw add 160 allow tcp from any to any 5190 out via ${oif}
ipfw add 170 allow tcp from any 5190 to any in via ${oif}

ipfw add 180 allow ip from any to any via ${iif}

ipfw add 190 deny all from any to any
Никак не хочет работать правило 30(nat 1), 40(nat 2). Интернет есть, почта и icq тоже работают(через NAT, правило nat 3).

Раньше стоял natd, всё работало. Охота с kernel NAT поработать.

Заранее, огромное спасибо!

Re: Нужна помощь по kernel NAT!

Добавлено: 2009-07-16 14:19:07
terminus

Код: Выделить всё

ipfw nat 1 config ip ${oip} redirect_port tcp 192.168.10.11:6969 6969

ipfw add 30 nat 1 tcp from 192.168.10.11 6969 to any via ${oif}
ipfw add 31 nat 1 tcp from any to ${oip} 6969 via ${oif}

ipfw nat 2 config ip ${oip} redirect_port udp 192.168.10.11:6969 6969

ipfw add 40 nat 2 udp from 192.168.10.11 6969 to any via ${oif}
ipfw add 41 nat 2 udp from any to ${oip} 6969 via ${oif}

Re: Нужна помощь по kernel NAT!

Добавлено: 2009-07-16 15:17:13
hizel

Код: Выделить всё

firewall_nat_enable="YES"
firewall_nat_interface="xl0"
зачем это в rc.conf ?

Re: Нужна помощь по kernel NAT!

Добавлено: 2009-07-17 3:52:34
km
terminus:
Сделал

Код: Выделить всё

ipfw nat 1 config ip ${oip} redirect_port tcp 192.168.10.11:6969 6969

ipfw add 30 nat 1 tcp from 192.168.10.11 6969 to any via ${oif}
ipfw add 31 nat 1 tcp from any to ${oip} 6969 via ${oif}

ipfw nat 2 config ip ${oip} redirect_port udp 192.168.10.11:6969 6969

ipfw add 40 nat 2 udp from 192.168.10.11 6969 to any via ${oif}
ipfw add 41 nat 2 udp from any to ${oip} 6969 via ${oif}
Не помогло.

Может

Код: Выделить всё

net.inet.ip.fw.one_pass=1
сделать?

hizel:

Код: Выделить всё

firewall_nat_enable="YES"
firewall_nat_interface="xl0"
зачем это в rc.conf ?
Честно сказать не могу..., наверное где-то видел.
Убрал(было лишнее). Ничего не изменилось. Спасибо.

Re: Нужна помощь по kernel NAT!

Добавлено: 2009-07-17 4:14:14
km
terminus:
Извени, ты был прав.
Только я сделал так:

Код: Выделить всё

ipfw nat 1 config ip ${oip} redirect_port tcp 192.168.10.11:6969 6969

ipfw add 30 nat 1 tcp from 192.168.10.11 6969 to any out via ${oif}
ipfw add 31 allow tcp from any 6969 to any out via ${oif}
ipfw add 32 nat 1 tcp from any to ${oip} 6969 in via ${oif}
ipfw add 33 allow tcp from any to any 6969 in via ${oif}

ipfw nat 2 config ip ${oip} redirect_port udp 192.168.10.11:6969 6969

ipfw add 40 nat 2 udp from 192.168.10.11 6969 to any out via ${oif}
ipfw add 41 allow udp from any 6969 to any out via ${oif}
ipfw add 42 nat 2 udp from any to ${oip} 6969 in via ${oif}
ipfw add 43 allow udp from any to any 6969 in via ${oif}
Всё работает(проброс порта идёт). Может есть ошибки?
Опцию net.inet.ip.fw.one_pass я не трогал(net.inet.ip.fw.one_pass=0).

terminus и hizel спасибо, выручили!

Re: Нужна помощь по kernel NAT!

Добавлено: 2009-07-17 9:21:57
terminus
мой пример должен был работать при one_pass=1

Re: Нужна помощь по kernel NAT!

Добавлено: 2009-07-20 4:40:14
km
terminus писал(а):мой пример должен был работать при one_pass=1
И тут ты совершенно прав. Проверил, работает. Спасибо большое!

Re: Нужна помощь по kernel NAT!

Добавлено: 2009-07-21 5:35:11
km
Тогда получается, что правила:

Код: Выделить всё

ipfw nat 3 config if ${oif} deny_in same_ports unreg_only
ipfw add 120 nat 3 ip from any to any out via ${oif}
ipfw add 130 nat 3 ip from any to ${oip} in via ${oif}

ipfw add 140 allow tcp from any to any 25,110 out via ${oif}
ipfw add 150 allow tcp from any 25,110 to any in via ${oif}

ipfw add 160 allow tcp from any to any 5190 out via ${oif}
ipfw add 170 allow tcp from any 5190 to any in via ${oif}
Не имеют смысла, т.к. пакет уже не проходит дальше по правилам(net.inet.ip.fw.one_pass=1).
Их нужно заменить на:

Код: Выделить всё

ipfw nat 3 config if ${oif} deny_in same_ports unreg_only
ipfw add 120 nat 3 tcp from any to any 25,110 out via ${oif}
ipfw add 130 nat 3 tcp from any 25,110 to ${oip} in via ${oif}

ipfw nat 4 config if ${oif} deny_in same_ports unreg_only
ipfw add 140 nat 4 tcp from any to any 5190 out via ${oif}
ipfw add 150 nat 4 tcp from any 5190 to ${oip} in via ${oif}
Правильно ли я рассуждаю?

Re: Нужна помощь по kernel NAT!

Добавлено: 2009-07-21 6:48:50
hizel
да, но можно еще поставить one_pass в 0 если припрет :]

Re: Нужна помощь по kernel NAT!

Добавлено: 2009-07-21 12:31:17
km
Спасибо hizel !

Re: Нужна помощь по kernel NAT!

Добавлено: 2009-07-21 12:41:05
hizel
или ipfw disable one_pass что аналогично пинку sysctl