FreeBSD: как работать с NAT
У нас задача включить маскарадинг (или 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 указывайте имя интерфейса, смотрящего наружу
Создаем сам файл natd.conf
Переходим в /usr/local/etc и создаем файл с именем natd.conf и следующим содержимым:
# ee /usr/local/etc/natd.conf
same_ports use_sockets
Обратите внимание – пустая строка в конце файла обязательна! Особенно если вы используете MC
В этом файле ничего особенного NATd не говорится – только то, что он должен пытаться использовать те же исходящие порты, что и от серого клиента, а так-же то, что он должен использовать сокеты.
3) Правила в ipfw
Теперь нам нужно прописать в ipfw задачу перенаправлять все пакеты, выходящие через внешний интерфейс на адрес интернет и входящие на внешний интерфейс на адрес самого роутера – на демон natd.
Вот необходимый кусок кода перенаправляет трафик с интерфейса xl0 на подсеть xl0:
internet='vr0' ipfw='/sbin/ipfw -q' iface_local='xl0' ${ipfw} flush ${ipfw} pipe flush ${ipfw} queue flush ${ipfw} 100 add allow ip from any to any via lo0 ${ipfw} 110 add deny ip from any to 127.0.0.0/8 ${ipfw} 115 add deny ip from 127.0.0.0/8 to any ${ipfw} 3000 add divert natd ip from any to me in via $internet ${ipfw} 3020 add divert natd ip from 192.168.70.0/24 to any via $internet out ${ipfw} 3030 add allow ip from any to 192.168.70.0/24 via $internet in ${ipfw} 3040 add allow ip from any to 192.168.70.0/24 via $iface_local out ${ipfw} 3050 add allow ip from 192.168.70.0/24 to any via $iface_local in
4) Перезагружаем роутер и получаем работающий NAT, который благополучно маскирует внутренние подсети, выдавая их за свой белый IP адрес при трафике с интернет.
ВНИМАНИЕ! Будьте очень внимательны с IPFW (файерволом) – идеально вообще в момент таких действий находится перед консолью роутера. Ибо если Вы где-то накосячите – имеете все шансы потерять возможность подцепиться к роутеру для исправления косяков.
FreeBSD: настраиваем port forwarding (D-NAT) или проброс портов через NAT
Наша цель: настроить проброс портов через роутер на базе FreeBSD во внутреннюю сеть на определенные компьютеры.
Проброс портов: это когда кто-то ломится на внешний IP Вашего роутера (его белый IP) на определенный порт, а роутер этот трафик (приходящий на этот порт) перекидывает на определенный компьютер внутри локальной (или серой) сети, сам его не обрабатывая.
# ee /usr/local/etc/natd.conf
same_ports use_sockets redirect_port tcp 192.168.70.10:25 25 redirect_port udp 192.168.70.33:53 53 redirect_port tcp 192.168.70.1:3389 12345
Трафик, идущий на внешний IP Вашего роутера на порт 25 по TCP – будет переброшен на компьютер 192.168.0.10 на тот-же порт 25.
Трафик, идущий на внешний IP Вашего роутера на порт 53 по UDP – будет переброшен на компьютер 192.168.0.33 на тот-же порт 53.
Трафик, идущий на внешний IP Вашего роутера на порт 12345 по TCP – будет переброшен на компьютер 192.168.0.1 на другой порт – на порт 3389.
Это, конечно, лишь пример. Но суть составления правил Вам должна быть понятна – меняете внутренние IP на те, которые Вам необходимы, и порты на те, которые Вам необходимы.
P.S. Распространенная ошибка – пробовать рабоать с пробросом портов изнутри локальной сети – т.е. с серых адресов. Работать не будет – ибо трафик должен прилетать из интернета на сетевую карту, смотрящую во-вне. Поэтому изнутри Вашей же сети проброс портов банально не проверить.
Перезагрузка natd во FreeBSD может понадобиться, например, при внесении изменений в файл конфигурации. Например, Вы добавили порт для проброса из-вне во-внутрь через D-NAT и нужно, чтобы эта настройка заработала сейчас. Перезагружать весь сервер – тяжкое занятие, а вот ребутнуть только NAT – в самый раз.
# /etc/rc.d/natd restart