Для начала хотелось бы выразить благодарность самому lissyara и всем здесь присутствующим за великолепный сборник статей. Ответы на очень многие вопросы были найдены именно здесь. Спасибо вам за ваш труд!
Теперь к делу:
У меня ADSL, раздаваемый компанией у которой "с октября месяца не было ни единого разрыва!!"
белый IP адрес, сессия поднимается, естественно, на фряхе. Разрыв

Сначал я работал через связку pppd+ipfw+natd, но при этом мой P233, служащий в качестве шлюза, загружался на 98-99 %. из них порядка 30% жрал pppd, еще 30% забирал natd, и еще 30% отбирала сетевая карточка (ISA 10 мбит/с, определилась как ed1).
Естественно скорость соединения нехило падала, особенно при включенных торрентах. Поэтому взялся за настройку mpd + ng_nat + IPFW. К сожалению при пробросе портов через ng_nat возникла проблема. Выдержка из мануала к ng_nat:
то есть получается, что внешний IP адрес также нужно прописать в конфиге mpd. Но на момент запуска mpd этот адрес неизвестен. Я пробовал писать конструкции типа:set nat red-port proto alias_addr alias_port local_addr local_port [ remote_addr remote_port ]
Redirect incoming connections arriving to given public (alias) address and port, (optionally from specified remote address)
to a host and port of a machine on the local network.
однако проброс портов не появился и вывод командыset nat red-port tcp <внешний порт> <внутренний IP> <внутренний порт>
set nat red-port tcp 0.0.0.0 <внешний порт> <внутренний IP> <внутренний порт>
set nat red-port tcp self <внешний порт> <внутренний IP> <внутренний порт>
Код: Выделить всё
# ngctl msg mpd`cat /var/run/mpd5.pid`-B1-nat: listredirects
Код: Выделить всё
# cat /usr/local/etc/mpd5/link-up
#!/bin/sh
MPD_PID=`cat /var/run/mpd5.pid`
#mpd передает link-up скрипту несколько параметров, среди них и ip адрес ...
ALIAS=$3
# ... и имя интерфейся
IFACE=$1
# соответствия протоколов (сугубо для личного удобства)
TCP=6
UDP=17
#собственно проброс портов:
ngctl msg mpd${MPD_PID}-B1-nat: redirectport { local_addr='<внутренний IP>' alias_addr=${ALIAS} local_port='<внутренний порт1>' alias_port='<внешний порт1>' proto=${TCP} }
ngctl msg mpd${MPD_PID}-B1-nat: redirectport { local_addr='<внутренний IP>' alias_addr=${ALIAS} local_port='<внутренний порт2>' alias_port='<внешний порт2>' proto=${TCP} }
ngctl msg mpd${MPD_PID}-B1-nat: redirectport { local_addr='<внутренний IP>' alias_addr=${ALIAS} local_port='<внутренний порт3>' alias_port='<внешний порт3>' proto=${TCP} }
#запуск ipfw и передача ему имени интерфейса
/usr/local/etc/firewall.sh.ng_nat $IFACE
# обновление записи dynamic dns
/usr/local/etc/rc.d/ddclient restart
Код: Выделить всё
# ngctl msg mpd`cat /var/run/mpd5.pid`-B1-nat: listredirects
Rec'd response "listredirects" (10) from "[e]:":
Args: { total_count=3 redirects=[ { id=1 local_addr=<внутренний адрес> alias_addr=<внешний адрес> local_port=<внутренний порт1> alias_port=<внешний порт1> proto=6 } { id=2 local_addr=<внутренний адрес> alias_addr=<внешний адрес> local_port=<внутренний порт2> alias_port=<внешний порт2> proto=6 } { id=3 local_addr=<внутренний адрес> alias_addr=<внешний адрес> local_port=<внутренний порт3> alias_port=<внешний порт3> proto=6 } ] }
Код: Выделить всё
# cat /usr/local/etc/mpd5/mpd.conf
startup:
set user <name> <password>
set console self 127.0.0.1 5005
set console open
set web self 192.168.72.1 5006
set web open
set log +*
default:
load adsl_stream
adsl_stream:
create bundle static B1
set iface route default
set iface up-script "/usr/local/etc/mpd5/link-up"
set iface enable nat
# вот тут должен идти блок редиректов
# set nat red-port tcp <внешний порт> <внутренний IP> <внутренний порт>
# set nat red-port tcp 0.0.0.0 <внешний порт> <внутренний IP> <внутренний порт>
# set nat red-port tcp self <внешний порт> <внутренний IP> <внутренний порт>
set nat enable same-ports
set nat enable incoming
set ipcp ranges 0.0.0.0/0 0.0.0.0/0
set ipcp enable req-pri-dns
set ipcp enable req-sec-dns
# set link disable multilink
# set link disable incoming
# set ipcp disable vjcomp
set iface enable tcpmssfix
create link static L1 pppoe
set link action bundle B1
set auth authname <stream_authname>
set auth password <stream_password>
set link max-redial 0
set link mtu 1492
# set link mru 1492
set link keep-alive 10 100
set pppoe iface ed1
set pppoe service "stream"
open
Код: Выделить всё
# uname -r
7.3-RELEASE
Код: Выделить всё
options IPFIREWALL
options IPFIREWALL_FORWARD
options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPDIVERT
options DUMMYNET
options NETGRAPH
options NETGRAPH_ETHER
options NETGRAPH_SOCKET
options NETGRAPH_PPP
options NETGRAPH_PPPOE
options NETGRAPH_ASYNC
options NETGRAPH_IFACE
options NETGRAPH_MPPC_COMPRESSION
options NETGRAPH_MPPC_ENCRYPTION
options NETGRAPH_TEE
options NETGRAPH_TCPMSS
options NETGRAPH_PPTPGRE
options NETGRAPH_KSOCKET
options NETGRAPH_NAT
Код: Выделить всё
# pkg_info | grep mpd
mpd-5.5 Multi-link PPP daemon based on netgraph(4)
Можно ли как-то настроить проброс портов на динамическом адресе через конфиги? Так как то, что получилось у меня - костыль еще тот. Заранее благодарю за помощь.