метка: ipfw

ipfw + natd + tun0

Исходные данные: имеем сервер FreeBSD 6.3 с двумя сетевыми картами в одну подключен модем ADSL в режиме bridge, в другую локальную сеть
Задача: разрешить выход в интернет компьютерам локальной сети и дать возможность доступа по определенным портам из интернета на компьютеры в сети.

Для начала работы ipfw пересоберем ядро с нужными опциями:

# Включаем поддержку ipfw
options IPFIREWALL
# Включаем логирование пакетов,
# которые попадут под правило log
options IPFIREWALL_VERBOSE
# Ограничение размера журнального файла,
# на случай DDoS атаки
options IPFIREWALL_VERBOSE_LIMIT=100
# Пригодится, если понадобится воспользоваться
# возможностью перенаправления пакетов
# (например, при создании transparent proxy).
options IPFIREWALL_FORWARD
# Дайверт, для того, чтобы работал NAT, если
# нужно выпустить в Интернет локальную сеть
options IPDIVERT
# Эта опция пригодится, в случае задания
# шейпов для ограничения скорости.
options DUMMYNET

Файл с настройками для дозвона модема:

/etc/ppp/ppp.conf

default:
set device PPPoE:rl0:vtc
set speed sync
set mru 1492
set mtu 1492
set ctsrts off
set timeout 0
set redial 0 0

# Link Quality Request
enable lqr
set lqrperiod 5

vtc:
set authname login # наш логин
set authkey password # наш пароль
add default HISADDR

/etc/rc.conf

defaultrouter=»192.168.1.1″
hostname=»gorod.vera.local»
ifconfig_re0=»inet 10.10.38.100 netmask 255.255.255.0″
ifconfig_rl0=»inet 192.168.1.2 netmask 255.255.255.0″

gateway_enable=»YES»
natd_enable=»YES»
#NAT будет работать на внешнем интерфейсе модема
natd_interface=»tun0″
natd_flags=»-f /etc/natd.conf»

firewall_enable=»YES»
firewall_type=»/etc/rc.firewall»
#включаем логирование пакетов
firewall_logging=»YES»

#включаем дозвон модема
ppp_nat=»NO»
ppp_enable=»YES»
ppp_mode=»ddial»
ppp_profile=»vtc»

Файл с настройками ipfw (делаем его исполняемым — 754)

/etc/rc.firewall

#!/bin/sh —

fw=»/sbin/ipfw -q»

inif=»re0″
outif=»tun0″
inip=»10.10.38.100″
outip=»85.192.x.x»
innet=»10.10.38.0/24″

${fw} -f flush
${fw} add allow all from any to any via lo0
${fw} add deny log all from any to 127.0.0.0/8
${fw} add deny log all from 127.0.0.0/8 to any

${fw} add divert natd log all from ${innet} to any out via ${outif}
${fw} add divert natd log all from any to ${outip} in via ${outif}

${fw} add allow tcp from any to any via ${outif} established
${fw} add allow tcp from ${inip},${outip} to any out xmit ${outif} setup

${fw} add allow all from ${innet} to any out via ${inif}
${fw} add allow all from any to ${innet} in via ${inif}

##### Правила для UDP протокола ####
#
# — для сервера
# Разрешаем все исходящие UDP запросы с самого сервера
# Без этого не работают такие команды как traceroute
# Хотя, как вариант, можно обойтись и без этого если
# использовать traceroute -P icmp
${fw} add allow udp from ${outip} to any out via ${outif}
# Разрешаем входящие DNS запросы к нашему DNS серверу
# если конечно таковой испольуется на этой машине.
${fw} add allow udp from any to ${outip} 53 in via ${outif}
# Разрешаем ответы от DNS серверов на запросы
# от нашего хоста.
${fw} add allow udp from any 53 to ${outip} in via ${outif}
# Разрешаем ответы от серверов времени на запросы
# от нашего хоста
${fw} add allow udp from any 123 to ${outip} in via ${outif}
#
# — для локальной сети
# Разрешаем DNS запросы/ответы для всей сети
${fw} add allow udp from ${innet} to any 53
${fw} add allow udp from any 53 to ${innet}
# Разрешаем запросы/ответы к серверам времени для всей сети
${fw} add allow udp from ${innet} to any 123
${fw} add allow udp from any 123 to ${innet}

${fw} add allow tcp from ${innet} to any in via ${inif}
${fw} add allow tcp from any to ${innet} out via ${inif}

${fw} add allow all from any to any
${fw} add deny log all from any to any

При настройке сервера я долго не мог понять почему не работает данная связка. Ответ оказался простым — natd не стартовал на интерфейсе tun0 т.к. его еще нет при старте системы, а появляется он после того как модем дозвонился. Проверить включен ли нат можно командой:

# /etc/rc.d/natd status

Если работает, то ответ получаем примерно такой:

natd is running as pid 1175.

Если не работает, то запустить можно командой:

# /etc/rc.d/natd start

Решение данной проблемы может быть таким: прописываем задачу в cron чтобы natd стартовал при каждой загрузке компьютера принудительно.

# crontab -e

@reboot /etc/rc.d/natd start

Если нужно пробросить порты с внешнего интерфейса на компьютеры внутри сети, то редактируем файл /etc/natd.conf. К примеру нужно открыть доступ по 5000 порту на компьютер с IP 10.10.38.200. Для этого добавляем в файл строчку:

redirect_port tcp 10.10.38.200:5000 5000

На этом настройку можно считать законченной.

Статья на основе которой я  настраивал связку — http://live.daemony.org/freebsd/ipfw-natd-tun0.html