Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Общий по FreeBSD (http://forum.oszone.net/forumdisplay.php?f=10)
-   -   Проброс портов Freebsd 9, mpd, pf (http://forum.oszone.net/showthread.php?t=243386)

Abadd0N 25-09-2012 23:08 1994786

Проброс портов Freebsd 9, mpd, pf
 
Ситуация такая:
Провайдер билайн, в качестве впн клиента (L2TP) использую mpd, собственно его же использую и в качестве ната на внешний интерфейс, а проброс портов возложил на pf.
Проблема 1: (по сути не столь критичная, но если кто сталкивался, был бы не прочь услышать мнение): при использовании pf в качестве ната на внешний интерфейс (который создает mpd) постоянно дисконнектит инет, чуть ли не каждые 5 минут (хотя при использовании mpd всё работает и натится отлично).

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

На данный момент uname:
$ uname -a
FreeBSD serv 9.1-PRERELEASE FreeBSD 9.1-PRERELEASE #0: Sun Sep 23 16:02:34 NOVT 2012 adm@serv:/usr/obj/usr/src/sys/mykern120923 amd64

Те же проблемы испытывал и на stable ветке 9.0

rc.conf
Код:

keymap="ru.koi8-r.win.kbd"
dumpdev="AUTO"

synchronous_dhclient="YES"
defaultrouter="10.59.0.1"
ifconfig_em1="DHCP"
ifconfig_em0="inet 192.168.1.1 netmask 255.255.0.0"
hostname="serv"

pf_enable="YES"
pf_rules="/etc/pf.conf"
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pfsync_enable="NO"              # Expose pf state to other hosts for syncing
pfsync_syncdev=""              # Interface for pfsync to work through
pfsync_syncpeer=""              # IP address of pfsync peer host
pfsync_ifconfig=""
ftpproxy_enable="YES"
ftpproxy_flags="-D 0"
mpd_enable="YES"
mpd_flags="-b"

sshd_enable="YES"
apache22_enable="YES"
mysql_enable="YES"
mysql_limits="NO"
mysql_dbdir="/var/db/mysql"
mysql_args="--log"

linux_enable="YES"
accounting_enable="YES"

pf.conf
Код:

###########################
#        Variables        #
#+++++++++++++++++++++++++#
int_if="em0"
ext_if="em1"
vpn_if="ng0"
desk="192.168.1.2"
intnet="192.168.0.0/16"
#+++++++++++++++++++++++++#

#set block-policy return
set skip on lo
#scrub all
#set optimization aggressive
#scrub in all fragment reassemble
#scrub out all random-id max-mss 1400

nat on $ext_if from $int_if:network to $ext_if:network -> ($ext_if)  #проброс в локальную сеть провайдера
#nat on $vpn_if from $int_if:network to any -> ($vpn_if)


rdr pass log on $vpn_if proto tcp from any to any port 18888 -> 192.168.1.2 port 18888
rdr pass log on $vpn_if proto tcp from any to any port 80 -> 192.168.1.3 port 80
rdr pass log on $vpn_if proto tcp from any to ($vpn_if) port 81 -> 192.168.1.3 port 80

pass all

mpd5.conf
Код:

startup:
        #Log sobitiy
        log +ALL -EVENTS -FRAME

default:
        load L2TP
        #load PPTP

L2TP:
        create bundle static L2TP
        set ipcp no vjcomp
        set iface idle 0
        set iface enable nat
        set iface enable tcpmssfix
        set iface up-script /usr/local/etc/mpd5/up.sh
        set iface down-script /usr/local/etc/mpd5/down.sh
        create link static L2 l2tp
        set link action bundle L2TP
#        set link mtu 1400
        set link mtu 1460
        set link latency 0
        set link max-redial 0
        set link redial-delay 60
        set link accept chap
        set link keep-alive 10 75
        set l2tp peer tp.internet.beeline.ru
        set auth authname login
        set auth password passwd
        open


Abadd0N 28-09-2012 00:17 1995872

актуально

artem_ 01-10-2012 10:47 1997600

Abadd0N, вам по идее нужен NAT на интерфейсе ng0, т.к. он и является инерфейсом, через который ваша система взаимодействует с внешним миром.
Правила NAT применяются в PF по первому совпадению (не так как правила фильтрации).
Попробуйте привести свои правила трансляции к следующему виду:

Код:

nat on $vpn_if from $int_if:network to !($ext_if:network) -> ($vpn_if)
nat on $ext_if from $int_if:network to $ext_if:network -> ($ext_if)

P.S.
pass all - не есть хорошо, этим правилом вы разрешаете прохождение пакетов по всем возможным направлениям, включая доступ к внутренним ресурсам сети.

Abadd0N 22-10-2012 02:48 2009914

artem_, по поводу ната - нат на внешний интерфейс осуществляется с помощью mpd
Цитата:

set iface enable nat
т.к. при использовании ната pf, инет постоянно рвался.
по поводу pass all - установлено на время тестирования.

P.S. Есть идея, что mpd конфиктит с pf, вскоре попробую l2tpd в качестве vpn клиента

Smoke2k 07-11-2012 06:47 2020574

не знаю почему покеты застревают внутри хоста (проборос портов во внутрь), но по поводу l2tp выяснил такую фишку, мне очень долго не удавалось поднять l2tp клиен на линуксах/BSD, проблема оказалась в самом протоколе, он должен видеть vpn сервер всё время, решается статическим маршрутом к сети провайдера, а так же исключением в правиле NAT внутри pf. Сам так делал и работало стабильно без всяких проблем. Моё провило для нат выглядило так
Код:

nat on $vpn_if from $lan to !$isp_net -> $vpn_if
а следом правило для прова, тоже вроде как NAT (правда в моём случае второго NAT не было, потому что провайдер поставил свой Modem-router, который собственно и делал второй нат, который в моём случае и так не нужен был, но отключить возможности не было).
Код:

nat on $ext_if from $lan to $isp_net -> $ext_if
На самом деле я не знаю если сеть провайдера нужно натить...

Никакого нат в mpd я не использую, связка такая же FreeBSD90 +mpd5 + pf (w NAT) работает по сей день (правда по техническим причинам я сейчас на ADSL, но vpn клиен тот-же mpd5)
Мой mpd5.conf:
Код:

isp_l2tp:
        create bundle static L2TPNV
        set bundle disable compression round-robin encryption crypt-reqd bw-manage
        set bundle enable ipcp
        set iface disable proxy-arp
        set ipcp yes vjcomp req-pri-dns req-sec-dns
        set iface mtu 1492
        set iface enable tee on-demand
        set iface idle 0
        set iface enable tcpmssfix
        set iface up-script /usr/local/etc/mpd5/up.sh
        set iface down-script /usr/local/etc/mpd5/down.sh
#      set iface route 212.143.206.0/24

        create link static L2NV l2tp
        set link action bundle L2TPNV
        set link latency 0
        set link max-redial 0
        set link disable acfcomp check-magic protocomp shortseq
        set link deny chap-msv2 chap-msv1 eap acfcomp
        set link enable multilink passive
        set link mtu 1492
        set link keep-alive 60 180
        set l2tp peer "isp.vpn.server"
        set auth authname "username"
        set auth password "password"
        set l2tp enable length
        set l2tp self xl0
        open

Не могу сказать что слишком силён в настройках mpd и тонкостях l2tp тунеля, но конфиг в моём случае работал без проблем, кстати как видно я тут пытался добавлять статический маршрут в самом конфиге, но это либо не работало либо работало через раз и потом маршрут не удалялся, потому сделал отдельные скрипты. к тому же у меня была проблема с заменой default gateway mpd почему-то не хотел его менять, а в случае отключения тунеля возвращать обратно... статические маршруты я добавлял там же.

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

Надеюсь это немного поможет (хотя много времени прошло, может уже не актуально)

PS
я тут видел в некоторых манулах от pf: redirect указывают раньше правил NAT, не знаю если это может иметь значение, но попробуйте поменять (хотя наверное глупость)

и кстати я в редайректах указывал ещё и адрес на который приходит запрос
Код:

rdr on $vpn_if proto { tcp udp } from any to $wan_ip port { 6881:6889 } -> $nas
Да и вот, я сейчас вспомнил, я так же сталкнулся с тем что редайрект не работал на интерфейсе где не было NAT, пытался завернуть 80-ый порт на squid, но через pf, оно ни в какую нихотело работать, вернее работало, но только в одну сторону (т.е. пакеты доходили до squid, но обратной дороги не находили). Разруливал через ipfw... возможно что в этом и кроется причина ;-)

Abadd0N 19-12-2012 23:49 2049344

Всем спасибо, проблему таки решил, а была она в какомто косяке netgraph, убрал его из ядра, перекомпилил, теперь всё ок и пф норм работает и не дисконнектит и порты пробрасывает.
В ядре было:
Код:

# ================== Enable NETGRAPH =======================
options        NETGRAPH
options        NETGRAPH_ASYNC
options        NETGRAPH_BPF
options        NETGRAPH_BRIDGE
options        NETGRAPH_CISCO
options        NETGRAPH_DEFLATE
options        NETGRAPH_ECHO
options        NETGRAPH_ETHER
options        NETGRAPH_FRAME_RELAY
options        NETGRAPH_GIF
options        NETGRAPH_GIF_DEMUX
options        NETGRAPH_HOLE
options        NETGRAPH_IFACE
options        NETGRAPH_IP_INPUT
options        NETGRAPH_KSOCKET
options        NETGRAPH_L2TP
options        NETGRAPH_LMI
# MPPC Для MPPC компрессии требуются специальные лицензионные файлы, которые не прилагаются в ядро
#=== options NETGRAPH_MPPC_COMPRESSION
options        NETGRAPH_MPPC_ENCRYPTION
options        NETGRAPH_ONE2MANY
options        NETGRAPH_PPP
options        NETGRAPH_PPTPGRE
options        NETGRAPH_RFC1490
options        NETGRAPH_SOCKET
options        NETGRAPH_TCPMSS
options        NETGRAPH_TEE
options        NETGRAPH_TTY
options        NETGRAPH_UI
options        NETGRAPH_VJC
#===================================================



Время: 18:49.

Время: 18:49.
© OSzone.net 2001-