Настройка роутера (Интернет-шлюза) на ОС FreeBSD 10.0 с помощью ipfw kernel NAT и dhcpd | OS CONFIG

Настройка роутера (Интернет-шлюза) на ОС FreeBSD 10.0 с помощью ipfw kernel NAT и dhcpd

Исходные данные

На машине имеем 2 сетевых интерфейса:

Внешняя сеть (em1) — 192.168.0.0/24

Внутренняя сеть (em0) — 192.168.10.0/24 (сделаем так)

Шлюз во внешней сети — маршрутизатор с IP адресом 192.168.0.1

Систему устанавливаем с исходными текстами, то есть папка /usr/src не должна быть пустая. Если всё же исходные файлы отстутствуют, то читаем здесь, как их выкачать и установить.

Задача такова: настроить доступ в Интернет во внутренней сети средствами данной операционной системы.



Решение.

1. Настроим сетевые интерфейсы

Открываем файл /etc/rc.conf

vi /etc/rc.conf

и пропишем (или исправим) в нём такие строки:

hostname=″router″

defaultrouter=″192.168.0.1″

gateway_enable=″YES″

ifconfig_em0=″inet 192.168.10.1 netmask 255.255.255.0″

ifconfig_em1=″inet 192.168.0.110 netmask 255.255.255.0″

Я использовал IP 192.168.0.110, так как он у меня свободен и в диапазон DHCP он не входит.

Если IP-адрес с внешнего интерфейса необходимо получить автоматически, то вместо строки

ifconfig_em1=″inet 192.168.0.110 netmask 255.255.255.0″

напишем 2 такие строчки:

ifconfig_em1=″DHCP″

ifconfig_em1=″SYNCDHCP″

Теперь открываем /etc/resolv.conf и впишем DNS-сервера.

nameserver 192.168.0.1

2. Соберём и установим ядро нашей системы

Переходим в папку /sys/i386/conf

cd /sys/i386/conf/

в этой же папке сделаем копию файла GENERIC и назовём её ROUTER

cp GENERIC ROUTER

Открываем файл ROUTER

vi ROUTER

исправим строчку

ident GERERIC

на

ident ROUTER

и добавим такие строки (опции):

options IPFIREWALL

options IPDIVERT

options IPFIREWALL_VERBOSE

options IPFIREWALL_VERBOSE_LIMIT=5

options IPFIREWALL_NAT

options LIBALIAS

options ROUTETABLES=2

options DUMMYNET

options HZ=″1000″

IPFIREWALL — для включения ipfw

IPDIVERT — необходимо для работы NAT

IPFIREWALL_VERBOSE — для включения логирования работы ipfw

IPFIREWALL_VERBOSE_LIMIT=5 — для ограничения на количество одинаковых логов — защита против атак

IPFIREWALL_NAT — для включения ipfw NAT

LIBALIAS — для включения в ядро необходимых библиотек libalias

ROUTETABLES=2 — чтобы сделать две таблицы маршрутизации

DUMMYNET — для включения функции шейпера трафика

HZ=″1000″ — для ускорения работы гигабитного сетевого адаптера

Соберём ядро

cd /usr/src

make buildkernel KERNCONF=ROUTER

и установим его

make installkernel KERNCONF=ROUTER

После этого перезагрузим систему

shutdown -r now

3. Включаем файрволл в автозагрузку и создадим скрипт с правилами ipfw

Открываем файл /etc/rc.conf и пропишем в него следующие строчки:

firewall_enable=″YES″

firewall_nat_enable=″YES″

firewall_script=″/etc/ipfw.conf″

Теперь открываем файл /etc/sysctl.conf и пропишем в него:

для работы ipfw NAT

net.inet.ip.fw.one_pass=1

и для ведения логов ipfw

net.inet.ip.fw.verbose=1

net.inet.ip.fw.verbose_limit=5

Создадим скрипт с правилами ipfw:

touch /etc/ipfw.conf

Открываем его

vi /etc/ipfw.conf

и пропишем в него такие строчки:

exface=″em1″

inface=″em0″

in_ip=″192.168.10.1″

 

cmd=″ipfw -q″

 

$cmd -f flush

$cmd add 100 allow ip from any to any via lo0

$cmd add 200 deny ip from any to 127.0.0.0/8

$cmd add 300 deny ip from 127.0.0.0/8 to any

$cmd add 400 allow all from any to any via $inface

$cmd nat 1 config log if $exface reset same_ports deny_in

$cmd add 1030 nat 1 ip from any to any via $exface

 

exface и inface — внешний и внутренний интерфейсы шлюза

in_ip — IP адрес внутреннего интерфейсам

cmd — префикс команды ipfw -q

$cmd -f flush — удаляет все существующие правила

$cmd add 100 allow ip from any to any via lo0 — разрешение трафика на петлевом интерфейсе – необходимо для внутренних нужд ОС

$cmd add 200 deny ip from any to 127.0.0.0/8 — запрещает ip трафик от любого источника на всю сеть loopback интерфейса

$cmd add 300 deny ip from 127.0.0.0/8 to any — запрещает ip трафик со всей сети loopback интерфейса на любой источник

$cmd add 400 allow all from any to any via $inface — разрешает беспрепятственному прохождению трафика внутри созданной нами локальной сети

$cmd nat 1 config log if $exface reset same_ports deny_in — включает kernel NAT на интерфейсе em0 с параметрами, сбрасывает таблицу соединений при смене ip-адреса сетевого интерфейса, пытается сохранить порты, по-умолчанию запрещает входящие подключения

$cmd add 1030 nat 1 ip from any to any via $exface — перенаправляет в NAT всё, что проходит через внешний интерфейс

Скрипт можно дописать под определённые нужды сети.

Сделаем скрипт исполняемым

chmod u+x /etc/ipfw.conf

и перезагрузим систему

shutdown -r now

4. Устанавливаем и конфигурируем ISC DHCP server 4.2.

Для начала необходимо построить дерево портов:

portsnap fetch && portsnap extract

Если оно было построено ранее, обновляем его:

portsnap fetch update

Устанавливаем из портов DHCP-сервер:

cd /usr/ports/net/isc-dhcp42-server

make all install clean

будут вываливаться окошки с выбором компонентов… оставляем всё по умолчанию.

После установки открываем файл /etc/rc.conf и в нём допишем:

dhcpd_enable=″YES″

dhcpd_flags=″-q″

dhcpd_ifaces=″em0″

Затем открываем файл /usr/local/etc/dhcpd.conf и в нём:

раскомментируем

authoritative;

после строчки

log-facility local7;

стираем все (которые ниже)

и пропишем такие:

subnet 192.168.10.0 netmask 255.255.255.0 {

range 192.168.10.21 192.168.10.151;

option routers 192.168.10.1;

option domain-name-servers 8.8.8.8,8.8.4.4;

}

Стартуем службу dhcpd

service isc-dhcpd start

или перезагружаем машину

shutdown -r now

Проверяем на другой машине, например с установленной Windows XP. В настройках сети должно быть отмечено «Получить IP-адрес автоматически» и «Получить адрес DNS-сервера автоматически». Когда XP поймает себе настройки сети, можно будет увидеть:

xp_dhcp_client_1

 

xp_dhcp_client_2

Готово.


Если Вам помогла статья, вы можете отблагодарить автора:
перечислить на WMR кошелёк (WebMoney): R301575071888
перечислить на Яндекс.Кошелёк: 410011003938168
или на PayPal:

Вы можете оставить комментарий, или ссылку на Ваш сайт.
  • Ubhra

    Спасибо.
    А можете подсказать как быть если нужен vpn l2tp?

    • OSC_Evgeny

      для начала, думаю, необходимо поднять OpenVPN сервер.

      честно говоря, пока не разбирался. как разберусь — отпишусь…

      • Nikita

        Класс! Будем ждать.

  • Art

    Уберите IPDIVERT. вы его не используете, это для другого.

    • OSC_Evgeny

      ага, но это может понадобиться в будущем 🙂

  • Sergey Vorobyov

    Не все получилось.
    Действуя пошагово после создания скрипта ipfw.conf и перезагрузки пропадает интернет. Пришлось добавить строчку $cmd add 500 allow all from any to any via $exface. После этого можно скачать и обновить дерево портов.

    • OSC_Evgeny

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

      • Sergey Vorobyov

        ))
        Следуя дальше пошагово, установил и запустил демона dhcpd.
        Ноутбук получил свой IP и адреса DNS серверов. Но вот мой ROUTER не пропускает пакеты за пределы внутр сети. Не могли бы вы «внести корректировку» так сказать, чтобы проверить каждый шаг? Хотя бы как посмотреть логи? Спасибо.

        • OSC_Evgeny

          хорошо, что у вас всё получилось.

          насчет логов: я не разбирался с этим, но вроде как в файле /etc/syslog.conf должен быть прописан путь к лог-файлу (я точно не помню). посмотрите!

          • Sergey Vorobyov

            Спасибо! Получилось и это. (там все написано)
            1. ee /etc/syslog.conf убрать # console.info
            2. touch /var/log/console.log
            3. chmod -R 600 /var/log/console.log
            после перезапуска машины можно смотреть, что там «показывала» консоль, а то не видно ))

  • Seltsam

    Это правило у Вас никогда не сработает:
    $cmd add 200 deny ip from any to 127.0.0.0/8
    т.к. все пакеты пройдут через это правило:

    $cmd add 100 allow ip from any to any via lo0
    т.о. вы всё равно открываете доступ к своему lo0

  • Роман Дорофеев

    А если фряха на в виртуалбоксе, для обоих вирт. интерфейсов подойдет тип мост?

    • OSC_Evgeny

      главное, чтобы один мост был привязан к одному интерфейсу, а другой — к другому

  • Алексей

    Спасибо вам огромное!

  • Алексей

    Вы прописали DNS 192.168.0.1 но он не где не поднят и ни кому не присваиваеться



Яндекс.Метрика
Проверка ТИЦ Яндекс цитирования