看板 FreeBSD 關於我們 聯絡資訊
正確是要擷取因開啟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