看板FreeBSD
标 题Re: [问题]有关natd
发信站虫之家 (Thu May 9 10:23:22 2002)
转信站Ptt!news.ntu!freebsd.ntu!ctu-peer!ctu-gate!news.nctu!netnews.bbs99.com
正确是要撷取因开启gateway而forward到外面介面的封包喔,
所以你要给natd的应该是*[1;33mtunX*[m这个介面...^^b
rl1本身定不定IP无所谓, 反正实际上他也只能跟ATU-R传送封包..^^b
另外给你一些小秘方:
1.在ppp拨号时用以下参数比较好控制:
ppp -ddial -unit 0 pppoe
ddial是发现断线就自动重连, 可於ppp.conf中用 set cd 5! 代表五秒没
载波讯号就重连.
unit 0 就是让拨接介面永远都会是 tun0, 不会跑去tun1 tun2....
这样你的firewall rule才好设定, natd也好设定.
2.透过firewall的nat可以用firewall去管理频宽限制, QoS喔~
只要在divert给natd之前管理, 就可以了~~
最後, 转给你小弟的拙作, 有关用ipfw+natd的封包传送详细说明.
先来解释NAT的运作....
首先, 请man natd, 会看到这麽一段...
2. Ensure that your machine is acting as a gateway. This can be done
by specifying the line
gateway_enable=YES
in the /etc/rc.conf file or using the command
sysctl -w net.inet.ip.forwarding=1
意思就是说, rc.conf中开启gateway, 就等於开启ip forwarding,
那开启这东西是干麽用的呢? 这就要提到什麽叫做gateway了.
gateway原意并不是default gateway, 不是代表IP, 而是通讯闸而已,
用途我相信修过计网的应该就会知道他原本的作用是在於连接两种
不同媒介的网路, 因此, 开启gateway就是要系统把收到的封包都根据
routing table 丢到指定的位置, 如此一来, 从LAN中收到的封包都会
被转送到default gateway去, 以我的例子来说就是从rl0收到的封包
只要不是连到本机的都会转送到tun0, 想要观察的人可以删除掉ipfw 中的
divert那条, 然後用tcpdump去看tun0, 就会看到一堆LAN中要出去的封包...:P
然後, 再来解释divert是啥~
divert就是把收到的封包当作资料转给特定的port, 例如常见的
divert 8668 ip from any to any via tun0 就是把tun0所有进出的封包
都转送给 port 8668(可自由指定, -p port), 这是干麽用的呢? 这就是
接下来要说的natd了~
natd就是处理封包的程式, 他会把封包的source更换成指定的IP, 把source
的 port 更换成另一个 port(或尽量不动, 要看给natd的参数), 所以,
natd就是listen port 8668(可自由指定), 然後把收到的封包资料改一改,
再送出去.
但是这里有一个很特殊的地方就是, natd并不是经由socket, bind等等手续
送出处理过的封包, 而是直接丢给IP packet stream, 当然natd也可以设定
用socket连线.([-use_sockets | -s])
另外一点就是natd送出的封包仍会回ipfw rule, 但是会从divert那条的数字
的下一个开始检查, 而不是同号码的下一条, 也不是再次从第一条检查,
这点可以man natd中得到以下说明:
After translation by natd, packets re-enter the firewall at the rule
number following the rule number that caused the diversion (not the
next rule if there are several at the same number).
另外, natd送出的封包, 仍会根据routing table决定送往哪, 这点是我後来
因为要做分流才发现的, 因此请特别留意这点.
因此, 整个运作就变成如下:
client送出封包
rl0收到封包
因为default gateway是tun0上的gateway, 因此转送一份往tun0
被ipfw rule拦截送往 port 8668
8668由natd收到
natd纪录下来src的IP与port, 并改变IP为对外IP, port为server上可用port
natd送出封包, 再度因为default gateway而送往tun0
继续根据ipfw rule的下一条处理(通常是限频宽, 优先权等等), 总之会正确出去.
封包回来, tun0收到封包
被ipfw rule转往 port 8668
natd处理, 修改destion IP与port为之前的src IP与port
natd送出封包
根据routing table得知可直接touch, 也就是所谓在同一个subnet中, 因此直接送往rl0
继续根据ipfw rule的後面的规则处理
送回client
ok, 以上应该对於使用divert与natd的运作做了很详细的说明了,
对於本文章有问题的请reply, 并请只留下不懂的部分,
全部reply的直接删除当作没看到~ 嘿嘿~
--
※ Origin: 虫 之 家 <pcbug.twbbs.org>
◆ From: freebsd.private-ip