Прошу у знающих помощи — пилю маршрутизатор на фряхе и столкнулся с тем, что все находящиеся за моим шлюзом клиенты не могут никуда выйти.Итак, дано:
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Мануалы курил, гугл молчит. Подскажите, в какую сторону рыть, и как правильно оформить данную коммутацию. Спасибо.
У вас косяк с определением интерфейса 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"
После этого проверьте, я подробно не смотрел.
> Исправьте в /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 ##Вопрос только в том, откуда эти правила прописываются при загрузке ОС?
> Затем попытался сделать наоборотНе надо делать наоборот.
> Интернета у клиента всё также не было.
И не будет. Пока не исправите свои косяки.
> # похоже на настройки 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...
> Короче, исправьте у себя 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, а если там нет выбора, то нафиг она и нужна...
> Ну-ну, я всегда считал, что переменная firewall_type опеределяет секцию в
> скрипте, определяемом в переменнной firewall_script, а если там нет выбора, то
> нафиг она и нужна...Правильно считали. Есть там выбор. Но только в штатном файле /etc/rc.firewall
Если вы пишите свой набор в отдельном файле, то разумеется, там будут только ваши правила.
А вы пользуетесь только готовыми, clent, open, simple, workstation ?
Свои не пишите?
Премного благодарю, действительно помогло и заработало.Единственное, в чём я не совсем разобрался, почему NAT должен стоять на интерфейсе bge0, если ретрансляция IP-шников как раз осуществляется на внутренней сети (bge1)?
> Премного благодарю, действительно помогло и заработало.
> Единственное, в чём я не совсем разобрался, почему 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
Спасибо, стало намного понятнее.Сейчас усложнил задачу, и подцепил к bge0 соединение по PPPoE. После небольших танцев с бубном интернет заработал, но только на самом маршрутизаторе. На клиентах ничего дальше внешнего IP-шника сервера не пингуется. Это может быть проблема несогласованности pppd и natd? Есть ли смысл его отключить и врубить стандартный ppp-nat?
> Спасибо, стало намного понятнее.
> Сейчас усложнил задачу, и подцепил к 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
Спасибо, Вы настоящий друг!Остался лишь последний вопрос, и опять же связанный с ppp-nat: он не воспринимает форвардинг портов, записанных в ppp.conf —
> nat port tcp 10.0.1.10:80 80При этом через костыль под названием portfwd всё работает. В связи с этим у меня вопрос, как настроить это дело хотя бы через ipfw, потому как portfwd с ранжированием работать не умеет, а вручную вбивать весь массив 30000-35000 для работы FTP в конфиг-файл я сойду с ума.
> Спасибо, Вы настоящий друг!Да ладно!
> Остался лишь последний вопрос, и опять же связанный с 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.confstartup:
# 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 opendefault:
# MY PPPOE
load pppoe0pppoe0:
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/0create 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
opencat /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-35000cat /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
Так, файл сгенерировал, в процессе поправив ошибочку с отсутствием двойных пробелов в принтах (о чём мне долго и настойчиво говорил логгер rc при загрузке -), и оно прогрузилось.Вот только не форвардит ничорта, пока свой конфиг portfwd не запущу. ЧЯДНТ?
> Так, файл сгенерировал, в процессе поправив ошибочку с отсутствием двойных пробелов в
> принтах (о чём мне долго и настойчиво говорил логгер rc при
> загрузке -), и оно прогрузилось.Не очень понял, какие пробелы?
Если перловую команду скопировать и запустить, то всё ок отрабатывает.
Проверил, файл создаётся.
Инклюд прописать в конец конфига ppp.conf
Что там в rc.conf ?
Попробуйте для проверки только 1 порт прописать в ppp.port и запустить с ним.> Вот только не форвардит ничорта, пока свой конфиг portfwd не запущу. ЧЯДНТ?
Я бы смотрел в сторону mpd
> Не очень понял, какие пробелы?Вот такие:
> строка с командой должна содержать вначале минимум один пробел или символ табуляции.
> Что там в rc.conf ?
> Попробуйте для проверки только 1 порт прописать в ppp.port и запустить с
> ним.Так я и в сам ppp.conf прописывал — ноль реакции.
>> Вот только не форвардит ничорта, пока свой конфиг portfwd не запущу. ЧЯДНТ?
> Я бы смотрел в сторону mpdБольше вариантов совсем нет?
>> Не очень понял, какие пробелы?
>Вот такие:
>> строка с командой должна содержать вначале минимум один пробел или символ табуляции.Блин, сам по этим граблям потоптался. ))
Ну да, конечно, нужно так, добавить хотя бы один пробел перед 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
тут что-то аналогичное решается
http://www.opennet.me/openforum/vsluhforumID1/95129.html
Последняя попытка перед переходом на mpd+nat. Конфиг нарисовал следующий:
/etc/pf.conf:
ext_if="bge0"
int_if="bge1"
server = 10.0.1.10rdr 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 на конфиг не ругается.
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 statePPP разумеется должен работать! Причём без поддержки nat!
> pf есть в ядре? Если нет, то надо подгрузить соответствующий модуль при
> загрузке системы.Да я его сразу в ядро вкомпилировал.
> ipfw отключён? Если нет, отключите в /etc/rc.conf установив firewall_enable="NO"
> В противном случае, вы получаете два активных брандмауэра со всеми вытекающими отсюда
> дополнительными сложностями.Блин, а вот об этом я и не знал. Для кого, получается, я писал столько сложных правил для ipfw...
> Попробуйте следующий pf.conf
Попробую.
> PPP разумеется должен работать! Причём без поддержки nat!
Так, то есть, помимо ipfw, ещё и ppp-nat теперь отключить? Что же случится с моей чудесной безопасностью...
> Для кого, получается, я писал столько сложных правил для ipfw...А для себя! Скилл прокачивали.))
> Что же случится с моей чудесной безопасностью...
А проброс в локалку действительно считается небезопасным.
Ещё вариант для изврата.Отключить 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, но суть дела не меняет)
http://www.opennet.me/base/net/pppoe_freebsd_server.txt.htmlРазвлекайтесь.
Но как по мне, использовать нужно mpd, nat, pf. А ppp, natd становятся не актуальны.
Лучше полчаса потерять, потом за пять минут долететь.
Итак, решился таки перейти на 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.
Э-э-э!..
В ядре ipfw не надо отключать, коли уж вкомпилировали однажды.
Просто в rc.conf при старте системы можно указать его НЕ ВКЛЮЧАТЬ.
А то вдруг, в следующий раз захочется ipfw настроить, снова будете ядро пересобирать?Лично я его собираю сразу с ipfw, netgraph, pf и то что ещё потребуется.
> Э-э-э!..
> В ядре ipfw не надо отключать, коли уж вкомпилировали однажды.
> Просто в rc.conf при старте системы можно указать его НЕ ВКЛЮЧАТЬ.
> А то вдруг, в следующий раз захочется ipfw настроить, снова будете ядро
> пересобирать?
> Лично я его собираю сразу с ipfw, netgraph, pf и то что
> ещё потребуется.Хорошо, с pf всё в порядке?
> Хорошо, с pf всё в порядке?Попробуйте ваши правила, попробуйте правила предложенные мною из поста 18.
> Попробуйте ваши правила, попробуйте правила предложенные мною из поста 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 } # Разрешаем пинги
>> Попробуйте ваши правила, попробуйте правила предложенные мною из поста 18.
> Ни ваши, ни мои правила до конца рабочими не оказались. Пришлось переделывать.
> Заодно перелез c pppd на mpd. Заработало. Но теперь вновь всплыла
> старая проблема — не могут выйти в сеть все, кто стоит за
> NAT, кроме самого маршрутизатора.Поменяйте tun на ng(интерфейсы в mpd называются по другому - сокр. от NetGraph)
> Поменяйте tun на ng(интерфейсы в mpd называются по другому - сокр. от
> NetGraph)Так это я в значении уже поменял, см. начало вырезки.
Меня ещё вот что смущает. Какое значение должен принимать net.inet.ip.forwarding в связке pf+mpd? Сейчас (pppd+ipfw) он =1.
> Так это я в значении уже поменял, см. начало вырезки.Да, я пропустил.
Не стремитесь сразу написать всеобъемлющий и всеохватывающий конфигурационный файл.
Легко ошибиться и запутаться.Начните с малого, усложняйте постепенно, добавляя дополнительные правила.
Вот проверьте это.
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
Если заработает, после надо добавить редирект, после фильтрацию, и т.д.
> nat on $ext_if from from any -> ($ext_if)Опечатался
nat on $ext_if from !($ext_if) -> ($ext_if:0)
Забавно, вся морока была банально в том, что по умолчанию отключался форвардинг в системе с отключённым ipfw, соответственно с
net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1всё заработало. Однако, встала ещё одна (когда они уже закончатся?) проблема — даже в самой простой конфигурации открыт почему-то только 22 порт (который я нигде не указывал). Остальные, включая 80ый, закрыты, так что интернет еле работает.
Никакие попытки манипулировать файлом /etc/pf.conf не дали вообще никаких результатов. В чём может быть косяк?
> Забавно, вся морока была банально в том, что по умолчанию отключался форвардинг
> в системе с отключённым ipfw, соответственно с
>net.inet.ip.forwarding=1
> net.inet6.ip6.forwarding=1
> всё заработало. Однако, встала ещё одна (когда они уже закончатся?) проблема — даже
> в самой простой конфигурации открыт почему-то только 22 порт (который я
> нигде не указывал). Остальные, включая 80ый, закрыты, так что интернет еле
> работает.
> Никакие попытки манипулировать файлом /etc/pf.conf не дали вообще никаких результатов.
> В чём может быть косяк?Что в вашем понимании "открыт порт" ?
netstat смотрите?
Так у вас sshd запущен? 22 порт и открыт.
httpd не запущен? 80 порт закрыт.
А инет медленно работает - так тут тысячи причин может быть.
> А инет медленно работает - так тут тысячи причин может быть.Выяснилось, он не медленно работает, он вообще ничего кроме двух поисковиков открывать не хочет.
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».
Похоже, понял, в чём дело.options NETGRAPH_NAT
Зачем я это дописал к модулям mpd, ума не приложу. Но, судя по всему, из-за этой чудной строчки у меня загружалось сразу два NAT'a со всеми вытекающими.
Хм, теперь NAT совсем перестал работать. Все соединения закрытые. ЧЯДНТ?
> Хм, теперь NAT совсем перестал работать. Все соединения закрытые. ЧЯДНТ?Да что ж такое? Ну как вы умудряетесь в трёх соснах заблудиться!?
Невероятно. Разблудился. 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 # testpass 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 всё работает.
>[оверквотинг удален]
> 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
tcpdump -n port 80 с обоих интерфейсов при обращении с 37.190.56.42