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

18.11.1999, © Igor Sysoev, igor@nitek.ru
 

Это делается с помощью трансляции сетевых адресов - 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. Мы остановимся на первом, поскольку он входит в дистрибутив FreeBSD. Для работы natd необходим файрволл, но эта статья не ставит своей целью описание установки файрволла. Поэтому, если у Вас уже стоит файрволл, то здесь Вы найдете инструкции, как прикрутить к нему natd. Если же до Вас еще не дошло, зачем нужен файрволл, то здесь Вы найдете инструкции, как установить файрволл в режиме, когда он ничего не защищает. Сначала необходимо собрать ядро со следующими параметрами:

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

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

 
firewall_enable="YES"    # Set to YES to enable firewall functionality
firewall_type="open"     # Firewall type (see /etc/rc.firewall)

Теперь можно приступить к конфигурации 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"                # Enable natd if firewall_enable.
natd_interface="ppp0"            # Public interface to use with
                                 # natd if natd_enable.
natd_flags="-f /etc/natd.conf"   # Additional flags for natd.

После этого можно перегрузить компьютер. При старте системы /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 и менять трансляцию.

 


Наш баннер
Вы можете установить наш баннер на своем сайте или блоге, скопировав этот код:
RSS новости