Итак, у нас задача включить т.н. маскарадинг (или NAT - Network Addresses Translation) во FreeBSD с использованием ipfw. В нашем примере мы включим NAT на основе демона natd, не останавливаясь на ядерном NAT из-за его проблем (на момент FreeBSD 8.1) с длинной строки конфигурации.
NATd во FreeBSD, на самом деле, встроен из коробки и ничего дополнительно ставить не придется.
1) Включаем NAT в rc.conf
Редактируем /etc/rc.conf и вставляем в него следующие строки:
natd_enable="YES"
natd_flags="-f /usr/local/etc/natd.conf"
natd_interface="xl0"
Здесь:
- natd_enabled="YES" : включаем NAT
- natd_flags="-f /usr/local/etc/natd.conf" : откуда брать конфиг-файл для NATd
- natd_interface="xl0" : здесь вместо xl0 указывайте имя интерфейса, смотрящего наружу
2) Создаем сам файл natd.conf
Переходим в /usr/local/etc и создаем файл с именем natd.conf и следующим содержимым:
same_ports
use_sockets
Обратите внимание - пустая строка в конце файла обязательна!
В этом файле ничего особенного NATd не говорится - только то, что он должен пытаться использовать те же исходящие порты, что и от серого клиента, а так-же то, что он должен использовать сокеты.
3) Правила в ipfw
Теперь нам нужно прописать в ipfw задачу перенаправлять все пакеты, выходящие через внешний интерфейс на адрес интернет и входящие на внешний интерфейс на адрес самого роутера - на демон natd.
Вот необходимый кусок кода:
oif="xl0"
inet="192.168.0.0/16"
oip="11.22.33.44"
### NAT
# Исходящий трафик в интернет - пропускаем через NAT
${fwcmd} add divert natd ip from ${inet} to any out via ${oif}
# Входящий трафик на ${oip} - т.е. на IP адрес самого маршрутизатора
# тоже загоняем в NATD - для демаскировки
${fwcmd} add divert natd ip from any to ${oip} in via ${oif}
Здесь требуется определить следующие переменные:
- oif : название сетевой карты во FreeBSD, которая "смотрит" наружу - в интернет. В наше примере это "xl0";
- inet : определение внутренней (серой) адресации сети. Т.е. той сети, которая находится за NAT в Вашей организации. В нашем примере: 192.168.0.0/16, т.е. все, что имеет IP, начинающийся с 192.168.
- oip : IP-адрес "внешнего" сетевого интерфейса (oif который, который в нашем примере xl0). Т.е. это "белый" адрес Вашего роутера. В нашем примере - от балды - "11.22.33.44"
Этот кусок кода нужно вставлять перед определением всех разрешений и ограничений для внутренней сети. Вот этот же кусок, только "вырванный" из дефолтного конгифа - видно, где нужно прописывать.
#!/bin/sh
# Команда для общения с ipfw
fwcmd="/sbin/ipfw -q"
# eth0 - это внутренний сетевой интерфейс
# с IP-адресом 192.168.0.1
iip="192.168.0.1"
imask="255.255.255.0"
inet="192.168.0.0"
iif="eth0"
# eth1 - это интерфейс интернета
# IP, маска, подсеть и т.д. - чисто для примера
oip="11.22.33.44"
omask="255.255.255.0"
onet="11.22.33.0"
oif="eth1"
# Очищаем текущий набор правил
${fwcmd} -f flush
### Правила до NAT
# Через eth1 не может быть трафика с серыми IP
${fwcmd} add deny all from 10.0.0.0/8 to any in via ${oif}
${fwcmd} add deny all from 192.168.0.0/16 to any in via ${oif}
${fwcmd} add deny all from any to 10.0.0.0/8 via ${oif}
${fwcmd} add deny all from any to 172.16.0.0/12 via ${oif}
${fwcmd} add deny all from any to 192.168.0.0/16 via ${oif}
${fwcmd} add deny all from any to 0.0.0.0/8 via ${oif}
${fwcmd} add deny all from any to 169.254.0.0/16 via ${oif}
${fwcmd} add deny all from any to 192.0.2.0/24 via ${oif}
${fwcmd} add deny all from any to 224.0.0.0/4 via ${oif}
${fwcmd} add deny all from any to 240.0.0.0/4 via ${oif}
# Ну и на внутреннем интерфейсе - откуда взяться внешнему трафику
${fwcmd} add deny all from ${onet}:${omask} to any in via ${iif}
# Позволяем ходить трафику внутри наших сетей
${fwcmd} add allow all from ${inet}:${imask} to ${inet}:${imask}
### NAT
# Исходящий трафик в интернет - пропускаем через NAT
${fwcmd} add divert natd ip from ${inet}:${imask} to any out via ${oif}
# Входящий трафик на ${oip} - т.е. на IP адрес самого маршрутизатора
# тоже загоняем в NATD - для демаскировки
${fwcmd} add divert natd ip from any to ${oip} in via ${oif}
### Правила после NAT
# Весь трафик, исходящий с этого роутера - разрешен. Это же правило
# срабатывает при маскировке - если его отключить, что в интернет после
# NAT ничего улетать не будет
${fwcmd} add allow all from me to any
# Не проверяем пакеты, проходящие по уже установленному, соответственно,
# проверенному соединению TCP
${fwcmd} add allow all from any to any established
# Запрещаем длинные фрагментированые эхо-запросы
${fwcmd} add deny icmp from any to any frag
# Разрешаем проходить вторым и более частям фрагментированных пакетов
# (их заголовки мы уже проверили)
${fwcmd} add allow all from any to any frag
...
...
...
4) Перезагружаем роутер и получаем работающий NAT, который благополучно маскирует внутренние подсети, выдавая их за свой белый IP адрес при трафике с интернет.
$ sudo reboot
rсли нужно перезапустить только natd
то
$ sudo natd restart
ВНИМАНИЕ! Будьте очень внимательны с IPFW (файерволом) - идеально вообще в момент таких действий находится перед консолью роутера. Ибо если Вы где-то накосячите - имеете все шансы потерять возможность подцепиться к роутеру для исправления косяков.
P.S. как сделать проброс портов (port forwarding) в таком NAT. я уже писал
Актуально для: FreeBSD 6.x и выше
Комментарии
Оставить комментарий
Компьютерные сети
Термины: Компьютерные сети