Меню

Настройка ipnat во freebsd



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_enabled=»YES» : включаем NAT
  • natd_flags=»-f /usr/local/etc/natd.conf» : откуда брать конфиг-файл для NATd
  • natd_interface=»xl0″ : здесь вместо xl0 указывайте имя интерфейса, смотрящего наружу

2) Создаем сам файл natd.conf

Переходим в /usr/local/etc и создаем файл с именем natd.conf и следующим содержимым:

Обратите внимание — пустая строка в конце файла обязательна!

В этом файле ничего особенного NATd не говорится — только то, что он должен пытаться использовать те же исходящие порты, что и от серого клиента, а так-же то, что он должен использовать сокеты.

3) Правила в ipfw

Теперь нам нужно прописать в ipfw задачу перенаправлять все пакеты, выходящие через внешний интерфейс на адрес интернет и входящие на внешний интерфейс на адрес самого роутера — на демон natd.

Вот необходимый кусок кода:

### NAT
# Исходящий трафик в интернет — пропускаем через NAT
$ add divert natd ip from $ to any out via $

# Входящий трафик на $ — т.е. на IP адрес самого маршрутизатора
# тоже загоняем в NATD — для демаскировки
$ add divert natd ip from any to $ in via $

Здесь требуется определить следующие переменные:

  • oif : название сетевой карты во FreeBSD, которая «смотрит» наружу — в интернет. В наше примере это «xl0»;
  • inet : определение внутренней (серой) адресации сети. Т.е. той сети, которая находится за NAT в Вашей организации. В нашем примере: 192.168.0.0/16, т.е. все, что имеет IP, начинающийся с 192.168.
  • oip : IP-адрес «внешнего» сетевого интерфейса (oif который, который в нашем примере xl0). Т.е. это «белый» адрес Вашего роутера. В нашем примере — от балды — «11.22.33.44»

Этот кусок кода нужно вставлять перед определением всех разрешений и ограничений для внутренней сети. Вот этот же кусок, только «вырванный» из дефолтного конгифа — видно, где нужно прописывать.

# Команда для общения с 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″

# Очищаем текущий набор правил
$ -f flush

# Через eth1 не может быть трафика с серыми IP
$ add deny all from 10.0.0.0/8 to any in via $
$ add deny all from 192.168.0.0/16 to any in via $

$ add deny all from any to 10.0.0.0/8 via $
$ add deny all from any to 172.16.0.0/12 via $
$ add deny all from any to 192.168.0.0/16 via $

$ add deny all from any to 0.0.0.0/8 via $
$ add deny all from any to 169.254.0.0/16 via $
$ add deny all from any to 192.0.2.0/24 via $
$ add deny all from any to 224.0.0.0/4 via $
$ add deny all from any to 240.0.0.0/4 via $

# Ну и на внутреннем интерфейсе — откуда взяться внешнему трафику
$ add deny all from $:$ to any in via $

Читайте также:  Настройка микротик режим моста

# Позволяем ходить трафику внутри наших сетей
$ add allow all from $:$ to $:$

### NAT
# Исходящий трафик в интернет — пропускаем через NAT
$ add divert natd ip from $:$ to any out via $

# Входящий трафик на $ — т.е. на IP адрес самого маршрутизатора
# тоже загоняем в NATD — для демаскировки
$ add divert natd ip from any to $ in via $

### Правила после NAT

# Весь трафик, исходящий с этого роутера — разрешен. Это же правило
# срабатывает при маскировке — если его отключить, что в интернет после
# NAT ничего улетать не будет
$ add allow all from me to any

# Не проверяем пакеты, проходящие по уже установленному, соответственно,
# проверенному соединению TCP
$ add allow all from any to any established

# Запрещаем длинные фрагментированые эхо-запросы
$ add deny icmp from any to any frag

# Разрешаем проходить вторым и более частям фрагментированных пакетов
# (их заголовки мы уже проверили)
$ add allow all from any to any frag

4) Перезагружаем роутер и получаем работающий NAT, который благополучно маскирует внутренние подсети, выдавая их за свой белый IP адрес при трафике с интернет.

ВНИМАНИЕ! Будьте очень внимательны с IPFW (файерволом) — идеально вообще в момент таких действий находится перед консолью роутера. Ибо если Вы где-то накосячите — имеете все шансы потерять возможность подцепиться к роутеру для исправления косяков.

Источник

FreeBSD tips: использование ipnat

СЕРГЕЙ СУПРУНОВ

FreeBSD tips: использование ipnat

В одной из предыдущих статей [1] было рассмотрено построение сервера NAT на основе FreeBSD и natd. Данная статья будет посвящена другому средству – модулю ipnat, входящему в пакет IPFilter. Сам IPFilter уже рассматривался на страницах журнала [2].

Некоторые основополагающие моменты я повторю, чтобы сохранить целостность и самодостаточность этого материала, а сосредоточимся мы именно на построении сервера NAT.

Во FreeBSD 5.3 IPFilter (ipf), входящий в состав системы, может быть встроен в ядро, для чего ядро нужно пересобрать с опциями IPFILTER и IPFILTER_LOG. Так же ipf может быть запущен как модуль. Я воспользуюсь второй возможностью.

Итак, ядро трогать не будем. Для работы ipnat фильтр ipf должен быть настроен и запущен. В простейшем случае достаточно запустить его с парой правил, разрешающих прохождение любых пакетов, что может быть оправдано в том случае, если регулирование пакетов вы уже осуществляете другим фильтром. Правила заносятся по умолчанию в /etc/ipf.rules:

pass in from any to any

pass out from any to any

Запуск фильтра можно выполнить из командной строки:

# ipf -Fa -f /etc/ipf.rules

Ключ -Fa очищает все ранее заданные правила и загружает те, которые перечислены в конфигурационном файле. Для автоматического запуска фильтра при перезагрузке добавьте опцию «ipfilter_enable = “YES”» в /etc/rc.conf. Если поддержка фильтра не включалась в ядро, в списке подгруженных модулей появится модуль ipl.ko.

Аналогично правила трансляции адресов записываются по умолчанию в файл /etc/ipnat.rules. Запуск ipnat выполняется командой:

# ipnat -CF -f /etc/ipnat.rules

Ключ -C очищает таблицу правил, ключ -F удаляет записи из таблицы трансляций. Поскольку ipnat является, по сути, частью пакетного фильтра, то никакого перенаправления трафика на вход этого NAT-сервера не требуется. Входящие пакеты сначала будут подвергаться трансляции (пройдут через правила ipnat), затем поступят на вход ipf. Исходящие пакеты, наоборот, сначала фильтруются на ipf, а что будет пропущено, подвергается трансляции в соответствии с правилами ipnat.

Для автоматического запуска при перезагрузке в /etc/rc.conf добавьте строчку «ipnat_enable = “YES”».

Итак, приступим к рассмотрению правил трансляции. Замечу, что, в отличие от ipfw, в ipf и ipnat, правила не нумеруются, и их порядок определяется последовательностью загрузки, то есть местом в конфигурационном файле.

Собственно трансляция пакетов, исходящих с машин локальной сети в Интернет (маскарадинг), осуществляется правилом map:

map rl0 from 192.168.0.0/24 to any -> 100.100.100.101/32

Читать его очень просто, почти как на естественном языке: преобразовывать пакеты, проходящие через интерфейс rl0, с адресов, принадлежащих указанной подсети, на любые адреса, заменив адрес отправителя указанным реальным. Если конкретизация адресов назначения не требуется, можно использовать и упрощенный синтаксис:

map rl0 192.168.0.0/24 -> 100.100.100.101/32

Правило может быть дополнено некоторыми опциями, из которых наиболее часто используется portmap. Она конкретизирует, на какие номера портов отображать пакеты. Диапазон портов, которые разрешается использовать для целей трансляции, задается в виде begin:endN. Например, следующее правило позволяет использовать только TCP-порты с 10000 по 10999:

map rl0 192.168.0.0/24 -> 100.100.100.101/32 portmap tcp 10000:10999

После символов «–>» может быть указан не только один адрес, но и подсеть внешних адресов. В этом случае правило map сможет использовать любой свободный адрес из указанной подсети.

Для безусловной двунаправленной трансляции между внутренним и внешним адресами используется правило bimap:

bimap rl0 192.168.0.125/32 -> 100.100.100.125/32

Помимо трансляции исходящих пакетов все входящие пакеты, адресованные хосту 100.100.100.125, будут перенаправляться на «внутреннюю» машину. Это правило позволит машине с адресом 192.168.0.125 выглядеть снаружи так, как будто она имеет реальный адрес 100.100.100.125.

Если нужно пропускать пакеты, приходящие на определенные порты, внутрь локальной сети, например, если там размещен Web- или FTP-сервер, используются правила перенаправления:

rdr rl0 100.100.100.180/32 port 80 -> 192.168.0.80 port 8080 tcp

В этом случае TCP-пакеты, адресованные на 80-й порт хоста 100.100.100.125, будут транслироваться на порт 8080 машины, расположенной внутри локальной сети.

Одним из интересных свойств редиректа является возможность создавать балансировщик нагрузки между несколькими серверами, хотя и довольно примитивный. Например, следующие правила будут поочередно перенаправлять входящие запросы то на один, то на другой сервер:

rdr rl0 100.100.100.180/32 port 80 -> 192.168.0.80 port 8080 tcp round-robin

rdr rl0 100.100.100.180/32 port 80 -> 192.168.0.81 port 8080 tcp round-robin

Опция round-robin заставляет динамически менять порядок правил таким образом, что эти правила срабатывают по очереди.

Для контроля за работой ipnat используются два ключа: -s и -l. Первый выдает общую статистику работы NAT-сервера:

mapped in 476 out 460

added 29 expired 27

no memory 0 bad nat 0

Ipnat со вторым ключом выводит список активных правил и список активных в данный момент сеансов:

List of active MAP/Redirect filters:

map rl0 from 192.168.0.100/32 to any -> 100.100.100.100/32

List of active sessions:

MAP 192.168.0.100 1035 100.100.100.100 1035 [64.12.26.148 443]

Дополнительные сведения можно, как обычно, получить на страницах справочного руководства man ipnat(5), ipnat(1).

Замечу, что ipfw, natd, ipf, ipnat отлично уживаются вместе. Нужно только не забывать про особенности фильтров: ipfw срабатывает по первому совпадению, а ipf (без опции quick в правиле) – по последнему. Ну и всегда следует иметь в виду порядок прохождения пакета через фильтры. Так, если поддержка ipf собрана в ядре, то независимо от того, как запущен ipfw, в первую очередь пакеты будут проходить через правила ipf, а ipfw получит на вход только то, что будет им пропущено. Если же ipfw собран в ядре, а ipf подгружен как модуль, то правом первенства будет пользоваться ipfw.

Как natd, так и ipnat, отлично справляются с типовыми задачами трансляции адресов, и выбор между ними – скорее дело вкуса. В «экзотических» случаях могут понадобиться уникальные свойства того или иного сервера. Например, средства проксирования у natd более развиты, чем у ipnat, зато с помощью ipnat намного проще реализовать трансляцию различных групп адресов по разным правилам. Если ipnat способен решать те задачи, которые вам требуются, то, учитывая его «близость» к ядру и, следовательно, лучшее быстродействие, рекомендуется использовать этот сервер NAT. К тому же его конфигурация выглядит немного более удобной.

  1. Супрунов С. FreeBSD tips: NAT по старинке. – журнал «Системный администратор» №2, 2005 г.
  2. Ильченко Т. IPFilter с самого начала. – журнал «Системный администратор» №5, 2004 г.

Источник

Выполняю установку, настройку, сопровождение серверов. Для уточнения деталей используйте форму обратной связи

1) rc.conf

Добавляем такие строчки в /etc/rc.conf

2) ipnat.rules

Для транслирования адресов вносим такие строчки:

map fxp0 10.10.10.0/24 -> XX.XX.XX.XX/32 proxy port ftp ftp/tcp
map fxp0 10.10.10.0/24 -> XX.XX.XX.XX/32 portmap tcp/udp 40000:65000
map fxp0 from 10.10.10.0/24 ! to XX.XX.XX.XX/32 -> XX.XX.XX.XX/32

fxp0 — внешний интерфейс
XX.XX.XX.XX — внешний IP-адрес
10.10.10.0 — внутрення подсеть.

3) ipnat и динамический внешний адрес

Если у вас внешний адрес динамический (получаете от провайдера), то правила будут выглядеть вот так:

map fxp0 10.10.10.0/24 -> 0.0.0.0/32 proxy port ftp ftp/tcp
map fxp0 10.10.10.0/24 -> 0.0.0.0/32 portmap tcp/udp 40000:65000
map fxp0 10.10.10.0/24 -> 0.0.0.0/32

4) Перечитывание правил.

При обычном перечитывании, то есть через

выполняется обрыв текущих сессий. Что бы не обрывать сессии, можно использовать такую конструкцию:

# ipnat -f /etc/ipnat.conf

При этом будут сыпаться ошибки, но их можно игнорировать.

Добавить правило налету:

#echo «map dmfe0 192.168.1.0/24 -> 20.20.20.1/32» | ipnat -f —

Удалить налету: (под Solaris почему-то не работает)

Если вдруг не сработало, то можно применить перечитывание ТОЛЬКО правил из конфига БЕЗ удаления текущих сессий NAT:

# ipnat -C -f /etc/ipf/ipnat.conf

— вводим полностью правило, точно так, как оно выводится через ipnat -l:

rdr igb1 XX.XX.XX.XX/32 port 12380 -> 10.5.0.252 port 80 tcp

Примечание.

Не используйте FastForwarding (sysctl net.inet.ip.fastforwarding) вместе с ipnat — NAT не будет работать.

Для более подробного изучения ipfilter можно так же использовать это руководство.

NAT с помощью ipnat : 2 комментария

Вопрос
Пробрасываю порт
В ipnat
rdr ale0 from xxx.xxx.xxx.xxx/32 to yyy.yyy.yyy.yyy/32 port = 2223 -> 192.168.1.2 port 2223

в ipf
block in on ale0 all
pass in quick proto tcp from xxx.xxx.xxx.xxx to yyy.yyy.yyy.yyy port = 2223
пакеты не ходят
Подскажите пожалуйста где проблема?

Возможно, нужно ещё добавить pass out. Или смотреть через tcpdump, где уходят а где — не приходят.

Источник

Adblock
detector
Рубрика: Администрирование / Продукты и решения