The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Маршрутизатор на FreeBSD: не форвардятся пакеты"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Информационная безопасность (BSD ipfw, ipf, ip-filter / FreeBSD)
Изначальное сообщение [ Отслеживать ]

"Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 26-Окт-13, 19:02 
Прошу у знающих помощи — пилю маршрутизатор на фряхе и столкнулся с тем, что все находящиеся за моим шлюзом клиенты не могут никуда выйти.

Итак, дано:
1. Сервер с двумя интерфейсами — bge0 (в интернет), bge1 (в сеть, с NAT'ом).
2. 3Комовский управляемый свитч с двумя настроенными VLAN'ами — vlan 1 (10.0.2.1/22) и vlan 10 (10.0.1.1/22). Первый vlan обслуживает DHCP-сервер.
3. Стоит и настроен ipfw0.
4. Сервер даёт на себя зайти и снаружи и изнутри, сам спокойно пингует интернет, но подключающиеся к нему по bge1 клиенты интернета не имеют.

Конфигурации такие:
/etc/rc.conf: http://pastebin.com/DEZq6JFA
/etc/rc.firewall_r: http://pastebin.com/acLPXrmZ
/usr/local/etc/dhcpd.conf: http://pastebin.com/a0c0XxXd

Система говорит следующие гадости:
ifconfig: http://pastebin.com/849Tpiuf
netstat -nr: http://pastebin.com/qA9fCWXB

Мануалы курил, гугл молчит. Подскажите, в какую сторону рыть, и как правильно оформить данную коммутацию. Спасибо.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 26-Окт-13, 19:48 
У вас косяк с определением интерфейса natd
Противоречие

/etc/rc.conf
#NAT
natd_enable="YES"
natd_interface="bge1"
natd_flags="-dynamic -m -f /etc/natd.conf"      # nat.conf пуст


/etc/rc.firewall_r
pif=bge0
$cmd 100 divert natd ip from any to any in via $pif

Исправьте в /etc/rc.conf на natd_interface="bge0"

После этого проверьте, я подробно не смотрел.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 26-Окт-13, 20:56 
> Исправьте в /etc/rc.conf на natd_interface="bge0"
> После этого проверьте, я подробно не смотрел.

Исправил, ничего не изменилось. netstat -nr пишет следующее:

Destination        Gateway            Flags    Refs      Use  Netif Expire
default            192.168.1.1        UGS         0      890   bge0
10.0.0.0/22        link#9             U           1      173  vlan1
10.0.1.1           link#10            UHS         0        0    lo0
10.0.2.1           link#9             UHS         0        0    lo0
127.0.0.1          link#8             UH          0        0    lo0
192.168.1.0/24     link#1             U           0       44   bge0
192.168.1.110      link#1             UHS         0        0    lo0


Затем попытался сделать наоборот — поставил
> natd_interface="bge0"
> $cmd 100 divert natd ip from any to any in via bge1

Интересно, что netstat ни на йоту не изменился. Интернета у клиента всё также не было.

Кроме того, заметил, что во время загрузки OpenRC пишет следующие интересные вещи:

### опознание устройств ###
bge0: link state changed to DOWN
bge1: link state changed to DOWN
bge0: link state changed to UP
Starting Network: lo0 bge0 bge1 ipfw0.
### дальше принт ifconfig ###
bge1: link state changed to UP
vlan1: link state changed to UP
vlan2: link state changed to UP
add net default: gateway 192.168.1.1           # взял настройки из моего rc.conf
Additional inet routing options: gateway=YES.  # включил шлюз.
add net fe80::: gateway ::1                    # похоже на настройки IPv6,
add net ff02::: gateway ::1                    # только непонятно, где они указаны.
add net ::ffff:0.0.0.0: gateway ::1
add net ::0.0.0.0: gateway ::1
Flushed all rules.                             # сброс правил (?).
00100 allow ip from any to any via lo0         # проблема в том, что этих правил я не задавал
00200 allow ip from 127.0.0.1/8
00300 deny ip from any to ::1
00400 deny ip from any to ::1
00500 deny ip from ::1 to any
### дальше прогружались IPv6 ###
Line 3: bad command 'ipfw'                     # а вот это как раз сигнал из моего rc.firewall_r
Firewall rules loaded.                         # вот, собственно, теперь мой файл с правилами прогрузился.
## et cetera ##

Вопрос только в том, откуда эти правила прописываются при загрузке ОС?

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 27-Окт-13, 14:16 
> Затем попытался сделать наоборот

Не надо делать наоборот.

> Интернета у клиента всё также не было.

И не будет. Пока не исправите свои косяки.

> # похоже на настройки IPv6

Если IPv6 не нужен или сильно раздражает, пересоберите ядро и исключите из него поддержку IPv6

> # сброс правил

Всё верно.

> # проблема в том, что этих правил я не задавал

Точно так.

> Line 3: bad command 'ipfw' # а вот это как раз сигнал из моего rc.firewall_r

А вы ошибку видите? Откуда она взялась и почему?

> Firewall rules loaded. # вот, собственно, теперь мой файл с правилами прогрузился.

Да ни хрена он не прогрузился.

Подытожим.
Вам надо разобраться с firewall_script vs firewall_type
Для этого читать до просветления => http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/firew...

Если в двух словах:
firewall_type - это файл с набором правил для ipfw
firewall_script - это исполняемый скрипт, загружающий правила ipfw

То есть в файле firewall_type не должно быть каких-либо параметров командной строки для самого ipfw
Строки должны начинаться с add

А в файле firewall_script как раз таки наоборот, строки начинаются с ipfw add

Короче, исправьте у себя firewall_type="/etc/rc.firewall_r" на
firewall_script="/etc/rc.firewall_r"

И читайте документацию, много вопросов отпадёт => http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/index...

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Сергей (??) on 27-Окт-13, 17:36 
> Короче, исправьте у себя firewall_type="/etc/rc.firewall_r" на
> firewall_script="/etc/rc.firewall_r"
> И читайте документацию, много вопросов отпадёт => http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/index...

  Ну-ну, я всегда считал, что переменная firewall_type опеределяет секцию в скрипте, определяемом в переменнной firewall_script, а если там нет выбора, то нафиг она и нужна...


Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 27-Окт-13, 17:56 
> Ну-ну, я всегда считал, что переменная firewall_type опеределяет секцию в
> скрипте, определяемом в переменнной firewall_script, а если там нет выбора, то
> нафиг она и нужна...

Правильно считали. Есть там выбор. Но только в штатном файле /etc/rc.firewall
Если вы пишите свой набор в отдельном файле, то разумеется, там будут только ваши правила.
А вы пользуетесь только готовыми, clent, open, simple, workstation ?
Свои не пишите?

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 27-Окт-13, 19:22 
Премного благодарю, действительно помогло и заработало.

Единственное, в чём я не совсем разобрался, почему NAT должен стоять на интерфейсе bge0, если ретрансляция IP-шников как раз осуществляется на внутренней сети (bge1)?

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

7. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 28-Окт-13, 05:59 
> Премного благодарю, действительно помогло и заработало.
> Единственное, в чём я не совсем разобрался, почему NAT должен стоять на
> интерфейсе bge0, если ретрансляция IP-шников как раз осуществляется на внутренней сети
> (bge1)?

Здесь ответы:
=> http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/netwo...
=> http://www.openbsd.org/faq/pf/ru/nat.html
=> http://ru.wikipedia.org/wiki/NAT

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 30-Окт-13, 06:43 
Спасибо, стало намного понятнее.

Сейчас усложнил задачу, и подцепил к bge0 соединение по PPPoE. После небольших танцев с бубном интернет заработал, но только на самом маршрутизаторе. На клиентах ничего дальше внешнего IP-шника сервера не пингуется. Это может быть проблема несогласованности pppd и natd? Есть ли смысл его отключить и врубить стандартный ppp-nat?

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 30-Окт-13, 11:32 
> Спасибо, стало намного понятнее.
> Сейчас усложнил задачу, и подцепил к bge0 соединение по PPPoE. После небольших
> танцев с бубном интернет заработал, но только на самом маршрутизаторе. На
> клиентах ничего дальше внешнего IP-шника сервера не пингуется. Это может быть
> проблема несогласованности pppd и natd? Есть ли смысл его отключить и
> врубить стандартный ppp-nat?

Да, конечно.
http://myfreebsd.ru/network/pppoe-klient-user-level
http://wiki-freebsd.tushinec.ru/index.php/PPPoE-%D0...
http://nix-sa.blogspot.ru/2011/03/pppoe-client-freebsd.html

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

10. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 02-Ноя-13, 10:20 
Спасибо, Вы настоящий друг!

Остался лишь последний вопрос, и опять же связанный с ppp-nat: он не воспринимает форвардинг портов, записанных в ppp.conf —
>  nat port tcp 10.0.1.10:80 80

При этом через костыль под названием portfwd всё работает. В связи с этим у меня вопрос, как настроить это дело хотя бы через ipfw, потому как portfwd с ранжированием работать не умеет, а вручную вбивать весь массив 30000-35000 для работы FTP в конфиг-файл я сойду с ума.

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

11. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 02-Ноя-13, 16:58 
> Спасибо, Вы настоящий друг!

Да ладно!

> Остался лишь последний вопрос, и опять же связанный с ppp-nat: он не
> воспринимает форвардинг портов, записанных в ppp.conf —
>>  nat port tcp 10.0.1.10:80 80

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

> При этом через костыль под названием portfwd всё работает. В связи с
> этим у меня вопрос, как настроить это дело хотя бы через
> ipfw, потому как portfwd с ранжированием работать не умеет, а вручную
> вбивать весь массив 30000-35000 для работы FTP в конфиг-файл я сойду
> с ума.

Да не вопрос! Легко!
Хоть во двор, хоть в коридор, тьфу ты, хотел сказать, хоть через ipfw, хоть через pf
Там в конфигах диапазон портов можно задать.
А с ума сходить не надо. Успеете. ))

Лезем в man ppp или смотрим /usr/share/examples/ppp/ppp.conf.sample
man ppp

секция AUTOMATIC DIALING
Смотрите пример определений в
/usr/share/examples/ppp/ppp.conf.sample (формат файла /etc/ppp/ppp.conf довольно простой).
Каждая строка содержит один комментарий, включение, метку или команду:


    строка, начинающаяся с символа "#", рассматривается как строка комментарий.
    Ведущие пробелы игнорируются при определении строки как строки комментария.


    включение представляет собой строку, начинающуюся со слова "!include".
    Она должна иметь один аргумент - включаемый в него файл.
    Вы, возможно, захотите прописать и установить "!include ~/.ppp.conf" для
    совместимости со старыми версиями ppp.


    имя метки начинается с самого начала строки, затем следует двоеточие (":").


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


Смотрим /usr/share/examples/ppp/ppp.conf.sample

Если мы с помощью nat перенаправляем ftp и http на внутреннюю машину:


nat port tcp 10.0.0.2:ftp ftp
nat port tcp 10.0.0.2:http http

То есть, повторюсь, пример перенаправления вы привели правильно.
А 5 тысяч строк в /etc/ppp/ppp.conf прописывать вручную, действительно, тяжело. ))

Поэтому сделаем так.
Сгенерируем файл ppp.port в котором и укажем все ваши перенаправления и порты.

perl -le 'for (30000..35000){print "nat port tcp 10.0.1.10:$_ $_"}' >/etc/ppp/ppp.port

Прописываем включение этого файла в основном кофигурационном файле ppp.conf
Пробела или tab вначале быть не должно! Это важно.
!include /etc/ppp/ppp.port

А можно поступить по другому, использовать для поднятия pppoe не ppp а mpd установив его предварительно из портов.
Это будет лучше.

Устанавливаем mpd
cd /usr/ports/net/mpd5/
make install clean
rehash
cd /usr/local/etc/mpd5/
ee mpd.conf

startup:
        # configure mpd users
        set user foo bar admin
        set user foo bar
        # configure the console
        set console self 127.0.0.1 5005
        set console open
        # configure the web server
        set web self 0.0.0.0 5006
        set web open

default:
        # MY PPPOE
        load pppoe0

pppoe0:
        create bundle static B1
        set iface route default
        set iface up-script "/usr/local/etc/mpd5/ng0_up.sh"
        set iface down-script "/usr/local/etc/mpd5/ng0_down.sh"
        set ipcp ranges 0.0.0.0/0 0.0.0.0/0

        create link static L1 pppoe
        set link action bundle B1

        # username and password for pppoe
        set auth authname "username"
        set auth password "password"

        set link max-redial 0
        set link mtu 1492
        set link keep-alive 5 15
        set pppoe iface bge0
        open

cat /usr/local/etc/mpd5/ng0_up.sh

#!/bin/sh


/sbin/ipfw -q add 50 nat 1 all from any to any via ng0
/sbin/ipfw -q nat 1 config log if ng0 redirect_port tcp 10.0.1.10:30000-35000 30000-35000

cat /usr/local/etc/mpd5/ng0_down.sh

#!/bin/sh


/sbin/ipfw -q delete 50
/sbin/ipfw -q nat 1 delete

Здесь используется nat (!не natd)
Если будете пробовать по этому варианту, то вам надо убрать правила, относящиеся к natd
Если в ядре нет поддержки nat, обеспечить загрузку необходимых модулей.
Но лучше вкомпилить в ядро NAT и NETGRAPH

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

12. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 02-Ноя-13, 18:56 
Так, файл сгенерировал, в процессе поправив ошибочку с отсутствием двойных пробелов в принтах (о чём мне долго и настойчиво говорил логгер rc при загрузке -), и оно прогрузилось.

Вот только не форвардит ничорта, пока свой конфиг portfwd не запущу. ЧЯДНТ?

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

13. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 02-Ноя-13, 19:11 
> Так, файл сгенерировал, в процессе поправив ошибочку с отсутствием двойных пробелов в
> принтах (о чём мне долго и настойчиво говорил логгер rc при
> загрузке -), и оно прогрузилось.

Не очень понял, какие пробелы?
Если перловую команду скопировать и запустить, то всё ок отрабатывает.
Проверил, файл создаётся.
Инклюд прописать в конец конфига ppp.conf
Что там в rc.conf ?
Попробуйте для проверки только 1 порт прописать в ppp.port и запустить с ним.

> Вот только не форвардит ничорта, пока свой конфиг portfwd не запущу. ЧЯДНТ?

Я бы смотрел в сторону mpd

Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

14. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 02-Ноя-13, 19:24 
> Не очень понял, какие пробелы?

Вот такие:
> строка с командой должна содержать вначале минимум один пробел или символ табуляции.
> Что там в rc.conf ?
> Попробуйте для проверки только 1 порт прописать в ppp.port и запустить с
> ним.

Так я и в сам ppp.conf прописывал — ноль реакции.

>> Вот только не форвардит ничорта, пока свой конфиг portfwd не запущу. ЧЯДНТ?
> Я бы смотрел в сторону mpd

Больше вариантов совсем нет?

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

15. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 02-Ноя-13, 19:30 
>> Не очень понял, какие пробелы?
>Вот такие:
>> строка с командой должна содержать вначале минимум один пробел или символ табуляции.

Блин, сам по этим граблям потоптался. ))
Ну да, конечно, нужно так, добавить хотя бы один пробел перед nat
perl -le 'for (30000..35000){print " nat port tcp 10.0.1.10:$_ $_"}' > /etc/ppp/ppp.port

А потом, открыть его и добавить в самое начало метку ports:
чтобы было типа так

ports:
nat port tcp 10.0.1.10:30000 30000
nat port tcp 10.0.1.10:30001 30001
.....
nat port tcp 10.0.1.10:34999 34999
nat port tcp 10.0.1.10:35000 35000

> Больше вариантов совсем нет?

Есть. На pf
Плюнуть на прописывание портов в ppp.conf и инклюд.

Указать диапазон в pf.conf
http://www.openbsd.org/faq/pf/ru/rdr.html
пример оттуда
Диапазон портов также может быть перенаправлен:

rdr on tl0 proto tcp from any to any port 5000:5500 -> 192.168.1.20

тут что-то аналогичное решается
https://www.opennet.ru/openforum/vsluhforumID1/95129.html

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

17. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 03-Ноя-13, 09:45 
Последняя попытка перед переходом на mpd+nat. Конфиг нарисовал следующий:

/etc/pf.conf:
ext_if="bge0"
int_if="bge1"
server = 10.0.1.10

rdr on $ext_if proto tcp from any to any port 80 -> $server port 80
rdr on $ext_if proto tcp from any to any port 20 -> $server port 20
rdr on $ext_if proto tcp from any to any port 21 -> $server port 21
rdr on $ext_if proto tcp from any to any port 3000:3500 -> $server

/etc/rc.conf:
pf_enable="YES"
pflog_enable="YES"
pf_rules="/etc/pf.conf"
pf_program="/sbin/pfctl"
pf_flags=""

Также не работает. pfctl на конфиг не ругается.

Ответить | Правка | ^ к родителю #15 | Наверх | Cообщить модератору

18. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 03-Ноя-13, 12:15 
pf есть в ядре? Если нет, то надо подгрузить соответствующий модуль при загрузке системы.
Для этого в файле /boot/loader.conf добавить строку
pf_load="YES"

ipfw отключён? Если нет, отключите в /etc/rc.conf установив firewall_enable="NO"
В противном случае, вы получаете два активных брандмауэра со всеми вытекающими отсюда дополнительными сложностями.

Попробуйте следующий pf.conf

ext_if="bge0"
int_if="bge1"
tun_if="tun0"
lo0="127.0.0.1"
lan="10.0.0.0/22"
server="10.0.1.10"
set block-policy return
set skip on lo0
scrub in all
nat on $tun_if from !($tun_if) -> ($tun_if:0)
pass rdr on $tun_if proto tcp from any to any port 80 -> $server port 80
pass rdr on $tun_if proto tcp from any to any port 20 -> $server port 20
pass rdr on $tun_if proto tcp from any to any port 21 -> $server port 21
pass rdr on $tun_if proto tcp from any to any port 3000:3500 -> $server
# Тестовый полный выход для отладки
#pass quick from any to any
pass in on $int_if from $lan to any
pass out on { $ext_if $tun_if } proto { tcp udp icmp } all modulate state

PPP разумеется должен работать! Причём без поддержки nat!

Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

19. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 03-Ноя-13, 13:18 
> pf есть в ядре? Если нет, то надо подгрузить соответствующий модуль при
> загрузке системы.

Да я его сразу в ядро вкомпилировал.

> ipfw отключён? Если нет, отключите в /etc/rc.conf установив firewall_enable="NO"
> В противном случае, вы получаете два активных брандмауэра со всеми вытекающими отсюда
> дополнительными сложностями.

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

> Попробуйте следующий pf.conf

Попробую.

> PPP разумеется должен работать! Причём без поддержки nat!

Так, то есть, помимо ipfw, ещё и ppp-nat теперь отключить? Что же случится с моей чудесной безопасностью...

Ответить | Правка | ^ к родителю #18 | Наверх | Cообщить модератору

20. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 03-Ноя-13, 13:34 
> Для кого, получается, я писал столько сложных правил для ipfw...

А для себя! Скилл прокачивали.))

> Что же случится с моей чудесной безопасностью...

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

Ответить | Правка | ^ к родителю #19 | Наверх | Cообщить модератору

16. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 03-Ноя-13, 09:24 
Ещё вариант для изврата.

Отключить natd в /etc/rc.conf (закомментировать строки относящиеся к natd)
Отключить nat на ppp (убрать(закомментировать), если есть в /etc/ppp/ppp.conf строку nat enable yes)
Отключить nat на ppp в /etc/rc.conf прописав ppp_nat="NO"

создать файлы ppp.linkup и ppp.linkdown
touch /etc/ppp/ppp.linkup
touch /etc/ppp/ppp.linkdown

создать файлы tun0_up.sh и tun0_down.sh
touch /etc/ppp/tun0_up.sh
touch /etc/ppp/tun0_down.sh

файлы tun0_up.sh и tun0_down.sh сделать исполняемыми
chmod 555 /etc/ppp/tun0_up.sh
chmod 555 /etc/ppp/tun0_down.sh

Пишем в ppp.linkup
pppoe:
  ! sh -c "/etc/ppp/tun0_up.sh"

Пишем в ppp.linkdown
pppoe:
  ! sh -c "/etc/ppp/tun0_down.sh"

Пишем в tun0_up.sh
#!/bin/sh
natd -n tun0 -dynamic -redirect_port tcp 10.0.1.10:30000-35000 30000-35000
ipfw add 50 divert natd all from any to any via tun0

Пишем в tun0_down.sh
#!/bin/sh
killall -9 natd
ipfw delete 50

Кусок файла ppp.conf

pppoe:
  ..............................
  ..............................
  set ifaddr 0.0.0.0/0 0.0.0.0/0
  add default HISADDR

Важно!
В этом файле, метка label: (в данном случае - pppoe:) должна совпадать с названием метки в файлах ppp.linkup и ppp.linkdown

Вот ещё:
http://savio.km.ua/2009/06/09/vpn-%D0%BA%D0&#.../ (там про vpn, а не про pppoe, но суть дела не меняет)
https://www.opennet.ru/base/net/pppoe_freebsd_server.txt.html

Развлекайтесь.
Но как по мне, использовать нужно mpd, nat, pf. А ppp, natd становятся не актуальны.
Лучше полчаса потерять, потом за пять минут долететь.

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

21. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 04-Ноя-13, 07:58 
Итак, решился таки перейти на pf, используя его firewall, nat и portfwd функционал.

Собрал из нескольких мануалов сборную солянку, так что поправляйте меня, если я неправильно что-то буду делать.

Для начала в ядре подрубаем следующее:

# pf
device          pf
device          pflog
device          pfsync
options         ALTQ
options         ALTQ_CBQ        # Class Bases Queuing (CBQ)
options         ALTQ_RED        # Random Early Detection (RED)
options         ALTQ_RIO        # RED In/Out
options         ALTQ_HFSC       # Hierarchical Packet Scheduler (HFSC)
options         ALTQ_PRIQ       # Priority Queuing (PRIQ)
options         ALTQ_NOPCC      # Required for SMP build

Отключаем ipfw:

#options                IPDIVERT
#options                IPFIREWALL_VERBOSE
#options                IPFIREWALL_VERBOSE_LIMIT=10

В /etc/sysctl.conf:

net.inet.ip.fw.enable=0
net.inet6.ip6.fw.enable=0

В /etc/rc.conf:

ppp_nat="NO"
firewall_enable="NO"
gateway_enable="NO"
natd_enable="NO"

# PF
pf_enable="YES"
pflog_enable="YES"
pf_rules="/etc/pf.conf"
pf_program="/sbin/pfctl"
pf_flags=""

Теперь непосредственно курочим в самом pf.conf:

ext_if="bge0"             # интерфейс на выход
int_if="bge1"                   # интерфейс на вход
tun_if="tun0"                   # PPPD-интерфейс
lo0="127.0.0.1"                 # Loopback
vlan1="192.168.2.0/24"         # на всякий случай описываем сеть VLAN 1  (1)
vlan2="192.168.1.0/24"         # на всякий случай описываем сеть VLAN 10 (2)
wserver="192.168.1.100"         # Наш сервер, нуждающийся в пробросе портов

# Settings
set debug urgent                # Выводим только серьёзные ошибки
set block-policy return         # Возвращаем плохие пакеты
set state-policy floating       # Развязка пакета от интерфейса
set limit { states 250000, frags 175000 } # А чего мелочиться?
set optimization normal         # Обыкновенная оптимизация
set ruleset-optimization none   # Не будем оптимизировать правила
set skip on lo0                 # Пропускаем все попытки обработать loopback
scrub in all                    # Отсылаем только собранные пакеты

tcp_services="{ 22, 25, 37, 43, 53, 80, 443, 110, 119 }"  # Открытые порты для всех
icmp_types="{ echoreq, unreach}"         # какие типы icmp запросов можно использовать

# NAT
nat on $tun_if from !($tun_if) -> ($tun_if:0) # NAT'им всё, что за PPP, так?

# Фильтрация
antispoof quick for $ext_if              # Антиспуфинг для внешнего интерфейса bge0

# Сами правила
pass out on $ext_if from $ext_if to any  # разрешаем серверу доступ в интернет
pass in on $int_if from any to $ext_if   # в одностороннем порядке разрешаем всё, что лезет из локальной сети
pass in on $vlan1 proto tcp from $ext_if to $vlan1 port tcp_services # взаимно разрешаем все хорошие порты на первом vlan
pass in on $ext_if proto tcp from any to $ext_if port ssh # разрешаем стучаться откуда-либо до SSH на маршрутизаторе

# Форвардим
rdr on $ext_if proto tcp from any to any port 80 -> $server port 80
rdr on $ext_if proto tcp from any to any port 20 -> $server port 20
rdr on $ext_if proto tcp from any to any port 21 -> $server port 21
rdr on $ext_if proto tcp from any to any port 135 -> $server port 22
rdr on $ext_if proto tcp from any to any port 3000:3500 -> $server

Меньше всего уверен насчёт правил и NAT'a.

Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

22. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 04-Ноя-13, 09:16 
Э-э-э!..
В ядре ipfw не надо отключать, коли уж вкомпилировали однажды.
Просто в rc.conf при старте системы можно указать его НЕ ВКЛЮЧАТЬ.
А то вдруг, в следующий раз захочется ipfw настроить, снова будете ядро пересобирать?

Лично я его собираю сразу с ipfw, netgraph, pf и то что ещё потребуется.

Ответить | Правка | ^ к родителю #21 | Наверх | Cообщить модератору

23. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 04-Ноя-13, 13:01 
> Э-э-э!..
> В ядре ipfw не надо отключать, коли уж вкомпилировали однажды.
> Просто в rc.conf при старте системы можно указать его НЕ ВКЛЮЧАТЬ.
> А то вдруг, в следующий раз захочется ipfw настроить, снова будете ядро
> пересобирать?
> Лично я его собираю сразу с ipfw, netgraph, pf и то что
> ещё потребуется.

Хорошо, с pf всё в порядке?

Ответить | Правка | ^ к родителю #22 | Наверх | Cообщить модератору

24. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 04-Ноя-13, 14:44 
> Хорошо, с pf всё в порядке?

Попробуйте ваши правила, попробуйте правила предложенные мною из поста 18.

Ответить | Правка | ^ к родителю #23 | Наверх | Cообщить модератору

25. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 06-Ноя-13, 05:53 
> Попробуйте ваши правила, попробуйте правила предложенные мною из поста 18.

Ни ваши, ни мои правила до конца рабочими не оказались. Пришлось переделывать. Заодно перелез c pppd на mpd. Заработало. Но теперь вновь всплыла старая проблема — не могут выйти в сеть все, кто стоит за NAT, кроме самого маршрутизатора.

/etc/pf.conf:

ext_if="bge0"             # интерфейс на выход
int_if="bge1"                   # интерфейс на вход
tun_if="ng0"                    # PPPD-интерфейс
lo0="127.0.0.1"                 # Loopback
vlan1="192.168.2.0/24"         # на всякий случай описываем сеть VLAN 1  (1)
vlan2="192.168.1.0/24"         # на всякий случай описываем сеть VLAN 10 (2)
wserver="192.168.1.100"         # Наш сервер, нуждающийся в пробросе портов

# Settings
set debug urgent                # Выводим только серьёзные ошибки
set block-policy return         # Возвращаем плохие пакеты
set state-policy floating       # Развязка пакета от интерфейса
set limit { states 250000, frags 175000 } # А чего мелочиться?
set optimization normal         # Обыкновенная оптимизация
set ruleset-optimization none   # Не будем оптимизировать правила
set skip on lo0                 # Пропускаем все попытки обработать loopback
set skip on $int_if             # on bge1
scrub in all                    # Отсылаем только собранные пакеты

tcp_services="{ 22, 25, 37, 43, 53, 80, 443, 110, 119 }"  # Открытые порты для всех
tcpo_services="{ 20, 21, 22, 25, 80 }"                    # Открытые порты для серверов
icmp_types="{ echoreq, unreach }"         # какие типы icmp запросов можно использовать

# NAT
#nat on $tun_if from !($tun_if) -> ($tun_if:0) # Не работает
nat on $tun_if from {$vlan1 $vlan2} -> {$tun_if} # попытка переделать правило

# Форвардим
rdr on $ext_if proto tcp from any to any port 80 -> $wserver port 80
rdr on $ext_if proto tcp from any to any port 20 -> $wserver port 20
rdr on $ext_if proto tcp from any to any port 21 -> $wserver port 21
rdr on $ext_if proto tcp from any to any port 135 -> $wserver port 22
rdr on $ext_if proto tcp from any to any port 3000:3500 -> $wserver

# Фильтрация
antispoof quick for $ext_if              # Антиспуфинг для внешнего интерфейса bge0

# Сами правила
# На выход
pass out on { $ext_if $tun_if } from $ext_if to any keep state # Разрешаем выход маршрутизатору
pass out on { $ext_if $tun_if } proto { tcp udp icmp } all modulate state # Разрешаем выход всем изнутри

# На вход
pass in log on $ext_if proto { tcp, udp } from any to $vlan2 port $tcp_services keep state # Открываем вход всем на втором влане
pass in log on $ext_if proto { tcp, udp } from any to $vlan1 port $tcpo_services keep state # Открываем вход всем на первом влане

# ICMP-секция
pass inet proto icmp icmp-type { echoreq, unreach } # Разрешаем пинги


Ответить | Правка | ^ к родителю #24 | Наверх | Cообщить модератору

26. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 06-Ноя-13, 05:58 
>> Попробуйте ваши правила, попробуйте правила предложенные мною из поста 18.
> Ни ваши, ни мои правила до конца рабочими не оказались. Пришлось переделывать.
> Заодно перелез c pppd на mpd. Заработало. Но теперь вновь всплыла
> старая проблема — не могут выйти в сеть все, кто стоит за
> NAT, кроме самого маршрутизатора.

Поменяйте tun на ng(интерфейсы в mpd называются по другому - сокр. от NetGraph)

Ответить | Правка | ^ к родителю #25 | Наверх | Cообщить модератору

27. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 06-Ноя-13, 06:04 
> Поменяйте tun на ng(интерфейсы в mpd называются по другому - сокр. от
> NetGraph)

Так это я в значении уже поменял, см. начало вырезки.
Меня ещё вот что смущает. Какое значение должен принимать net.inet.ip.forwarding в связке pf+mpd? Сейчас (pppd+ipfw) он =1.

Ответить | Правка | ^ к родителю #26 | Наверх | Cообщить модератору

28. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 06-Ноя-13, 12:53 
> Так это я в значении уже поменял, см. начало вырезки.

Да, я пропустил.

Не стремитесь сразу написать всеобъемлющий и всеохватывающий конфигурационный файл.
Легко ошибиться и запутаться.

Начните с малого, усложняйте постепенно, добавляя дополнительные правила.

Вот проверьте это.

ext_if="ng0"
int_if="bge1"

set skip on lo0

scrub in

nat on $ext_if from from any -> ($ext_if)

pass quick from any to any

Если заработает, после надо добавить редирект, после фильтрацию, и т.д.

Ответить | Правка | ^ к родителю #27 | Наверх | Cообщить модератору

29. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 06-Ноя-13, 18:01 
> nat on $ext_if from from any -> ($ext_if)

Опечатался
nat on $ext_if from !($ext_if) -> ($ext_if:0)

Ответить | Правка | ^ к родителю #28 | Наверх | Cообщить модератору

30. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 07-Ноя-13, 02:35 
Забавно, вся морока была банально в том, что по умолчанию отключался форвардинг в системе с отключённым ipfw, соответственно с

net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1

всё заработало. Однако, встала ещё одна (когда они уже закончатся?) проблема — даже в самой простой конфигурации открыт почему-то только 22 порт (который я нигде не указывал). Остальные, включая 80ый, закрыты, так что интернет еле работает.
Никакие попытки манипулировать файлом /etc/pf.conf не дали вообще никаких результатов. В чём может быть косяк?

Ответить | Правка | ^ к родителю #29 | Наверх | Cообщить модератору

31. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 07-Ноя-13, 16:38 
> Забавно, вся морока была банально в том, что по умолчанию отключался форвардинг
> в системе с отключённым ipfw, соответственно с
>
net.inet.ip.forwarding=1 
> net.inet6.ip6.forwarding=1

> всё заработало. Однако, встала ещё одна (когда они уже закончатся?) проблема — даже
> в самой простой конфигурации открыт почему-то только 22 порт (который я
> нигде не указывал). Остальные, включая 80ый, закрыты, так что интернет еле
> работает.
> Никакие попытки манипулировать файлом /etc/pf.conf не дали вообще никаких результатов.
> В чём может быть косяк?

Что в вашем понимании "открыт порт" ?
netstat смотрите?
Так у вас sshd запущен? 22 порт и открыт.
httpd не запущен? 80 порт закрыт.
А инет медленно работает - так тут тысячи причин может быть.

Ответить | Правка | ^ к родителю #30 | Наверх | Cообщить модератору

32. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 08-Ноя-13, 03:10 
> А инет медленно работает - так тут тысячи причин может быть.

Выяснилось, он не медленно работает, он вообще ничего кроме двух поисковиков открывать не хочет.

pfctl -s state показывает буквально следующее —

...
all tcp xx.xx.xx.xx:80 <- 37.190.56.42:7963       TIME_WAIT:TIME_WAIT
all tcp xx.xx.xx.xx:80 <- 37.190.56.42:1364       TIME_WAIT:TIME_WAIT
all udp 4.2.2.4:53 <- 192.168.1.100:49322       NO_TRAFFIC:SINGLE
all udp 192.168.1.100:49322 -> 4.2.2.4:53       SINGLE:NO_TRAFFIC
all udp 4.2.2.4:53 <- 192.168.1.100:41397       NO_TRAFFIC:SINGLE
all udp 192.168.1.100:41397 -> 4.2.2.4:53       SINGLE:NO_TRAFFIC
all tcp xx.xx.xx.xx:80 <- 37.190.56.42:9648       TIME_WAIT:TIME_WAIT
all udp 4.2.2.4:53 <- 192.168.1.100:58515       NO_TRAFFIC:SINGLE
all udp 192.168.1.100:58515 -> 4.2.2.4:53       SINGLE:NO_TRAFFIC
all tcp xx.xx.xx.xx:80 <- 37.190.56.42:9651       TIME_WAIT:TIME_WAIT
all tcp xx.xx.xx.xx:80 <- 37.190.56.42:9662       TIME_WAIT:TIME_WAIT

Где xx.xx.xx.xx — внешний IP, 37.190.56.42 — попытка подсоединиться к хосту какого-нибудь сайта.
Как видно, NAT тупо ничего не пропускает (в списке ни единого established).

В правилах же один-единственный «pass all».

Ответить | Правка | ^ к родителю #31 | Наверх | Cообщить модератору

33. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 08-Ноя-13, 03:31 
Похоже, понял, в чём дело.
options                NETGRAPH_NAT

Зачем я это дописал к модулям mpd, ума не приложу. Но, судя по всему, из-за этой чудной строчки у меня загружалось сразу два NAT'a со всеми вытекающими.
Ответить | Правка | ^ к родителю #32 | Наверх | Cообщить модератору

34. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 10-Ноя-13, 03:13 
Хм, теперь NAT совсем перестал работать. Все соединения закрытые. ЧЯДНТ?
Ответить | Правка | ^ к родителю #33 | Наверх | Cообщить модератору

35. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от михалыч (ok) on 10-Ноя-13, 12:49 
> Хм, теперь NAT совсем перестал работать. Все соединения закрытые. ЧЯДНТ?

Да что ж такое? Ну как вы умудряетесь в трёх соснах заблудиться!?

Ответить | Правка | ^ к родителю #34 | Наверх | Cообщить модератору

37. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от Ex Nihilo (ok) on 03-Дек-13, 03:58 
Невероятно. Разблудился. pf.conf заработал только с такой строкой:

nat on ng0 inet from { $vlan1, $vlan2 } to any -> ng0

Запахало. Но встали следующие проблемы:

1) При загрузке не прогружаются правила, видимо, из-за того, что вланы не успевают подняться.

/etc/pf.conf:33: could not parse host specification

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

2) При попытке добавить block all перед правилами

pass out quick on $ext_if
pass in quick on $ext_if proto tcp from any to any port $tcp_services # keep state # test

pass in on $int_if from any to any
pass out on $ext_if from $ext_if to any
pass in inet proto icmp all icmp-type echoreq


Всё отваливается, будто этих правил и не существует вовсе.

3) Не пашет форвардинг через команду

rdr on $ext_if proto tcp from any to any port 80 -> $wserver

В то время как через portfwd всё работает.
Ответить | Правка | ^ к родителю #35 | Наверх | Cообщить модератору

36. "Маршрутизатор на FreeBSD: не форвардятся пакеты"  +/
Сообщение от reader (ok) on 11-Ноя-13, 10:55 
>[оверквотинг удален]
> all udp 192.168.1.100:41397 -> 4.2.2.4:53       SINGLE:NO_TRAFFIC
> all tcp xx.xx.xx.xx:80 <- 37.190.56.42:9648       TIME_WAIT:TIME_WAIT
> all udp 4.2.2.4:53 <- 192.168.1.100:58515       NO_TRAFFIC:SINGLE
> all udp 192.168.1.100:58515 -> 4.2.2.4:53       SINGLE:NO_TRAFFIC
> all tcp xx.xx.xx.xx:80 <- 37.190.56.42:9651       TIME_WAIT:TIME_WAIT
> all tcp xx.xx.xx.xx:80 <- 37.190.56.42:9662       TIME_WAIT:TIME_WAIT
> Где xx.xx.xx.xx — внешний IP, 37.190.56.42 — попытка подсоединиться к хосту
> какого-нибудь сайта.
> Как видно, NAT тупо ничего не пропускает (в списке ни единого established).
> В правилах же один-единственный «pass all».

tcpdump -n port 80 с обоих интерфейсов при обращении с 37.190.56.42

Ответить | Правка | ^ к родителю #32 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру