Персональный
сайт
Игоря
Сысоева


 
english
обо мне
 
sysoev.ru
 
nginx
 
mod_accel
mod_realip
mod_deflate
программирование
всякая всячина
windows
freebsd
apache
pppd
unix
web
 
 

Как подсоединить сеть к Интернету, имея всего один реальный адрес

 

21.12.1999

Это делается с помощью трансляции сетевых адресов — network address translation (NAT). Заключается она в следующем. Допустим, у нас есть внутренняя сеть 192.168.1.0, а провайдер выделил нам один адрес 10.0.0.1. Предположим, мы хотим установить TCP-соединение с адреса 192.168.1.1 и порта 2000 на адрес 10.0.2.1 и порт 80. Для этого мы посылаем TCP-пакет с адресом и портом отправителя 192.168.1.1:2000 и адресом и портом получателя 10.0.2.1:80. При выходе из интерфейса ppp0 адрес и порт отправителя 192.168.1.1:2000 в нашем пакете будет заменён на 10.0.0.1:3000 и информация о данном соединении будет записана в таблицу состояний NAT. Таким образом, каждое соединение будет однозначно идентифицироваться шестью параметрами:

  • адрес и порт отправителя 192.168.1.1:2000;

  • изменённые адрес и порт отправителя 10.0.0.1:3000;

  • адрес и порт получателя 10.0.2.1:80.

Поэтому когда к нам извне на интерфейс ppp0 придёт пакет с 10.0.2.1:80 на 10.0.0.1:3000, мы оттранслируем его на 192.168.1.1:2000.

Для FreeBSD существует два пакета, делающие NAT — natd и ip-filter. Мы остановимся на первом. Для работы natd необходим файрволл, но эта статья не ставит своей целью описание установки файрволла. Поэтому, если у Вас уже стоит файрволл, то здесь Вы найдёте инструкции, как прикрутить к нему natd. Если же до Вас ещё не дошло, зачем нужен файрволл, то здесь Вы найдёте инструкции, как установить файрволл в режиме, когда он ничего не защищает. Сначала необходимо собрать ядро со следующими параметрами:

options         IPFIREWALL
options         IPFIREWALL_VERBOSE
options         "IPFIREWALL_VERBOSE_LIMIT=100"
options         IPDIVERT

Как это сделать, Вы можете прочитать по-английски во FreeBSD Handbook или по-русски на странице Ивана Паскаля. После того, как новое ядро собрано, необходимо изменить в файле /etc/rc.conf строки:

firewall_enable="YES"
firewall_type="open"

Теперь можно приступить к конфигурации natd. В файл /etc/natd.conf запишем следующее:

same_ports      yes
use_sockets     yes

redirect_port   tcp 192.168.1.5:25 25
redirect_port   tcp 192.168.1.6:80 80

Первая строка указывает natd по возможности не менять номер порта. Вторая позволяет работать такими долбанутым протоколам, как FTP и IRC DCC. Две последние строки даны в качестве примера того, как пробрасывать входящие соединения для определённых портов на другие компьютеры. В нашем случае, почтовые соединения будут уходить на 192.168.1.5, а HTTP — на 192.168.1.6.

И опять нам необходимо изменить файл /etc/rc.conf, теперь уже для запуска natd:

natd_enable="YES"
natd_interface="ppp0"
natd_flags="-f /etc/natd.conf"

После этого можно перегрузить компьютер. При старте системы /etc/rc.network запустит natd следующим образом:

natd -f /etc/natd.conf -n ppp0

Поскольку natd указан интерфейс ppp0, то адреса всех пакетов, приходящих с других интерфейсов, он будет транслировать в адрес интерфейса ppp0, то есть, 10.0.0.1.

Если провайдер выделил динамический адрес, то в файл /etc/natd.conf добавим параметр dynamic:

dynamic              yes
same_ports      yes
use_sockets     yes

redirect_port   tcp 192.168.1.5:25 25
redirect_port   tcp 192.168.1.6:80 80
и natd будет отслеживать адрес, назначаемый интерфейсу ppp0 и менять трансляцию.

(C) Игорь Сысоев
http://sysoev.ru