FreeBSD: включаем (поднимаем) NAT (natd) кратко

Практика



Итак, у нас задача включить т.н. маскарадинг (или 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 и выше
создано: 2017-05-09
обновлено: 2021-03-13
1571



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Компьютерные сети

Термины: Компьютерные сети