Next Previous Contents

10. Netfilter 與 iproute - 封包標識 (Netfilter & iproute - marking packets)

到目前為止﹐我們已經打通 iproute 的任督二脈了﹐而 netfilter 也曾數度提及。現在是要好好的苦練 Rusty's Remarkably Unreliable Guides 心法的時候了。而 netfilter 秘笈所在﹐可以循 這裡 覓得。

Netfilter 可以讓我們過濾封包﹐或是修改它們的標頭(headers)。其中一絕是我們可以用號碼將封包標識起來﹐用 --set-mark 就可以做到。

舉個例子﹐下面的命令將所有送給 port 25 的封包標﹐也就是外送郵件﹐給識起來﹕

# iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 25 \
 -j MARK --set-mark 1

讓我們假設有多條連線﹐其中一個比較快(當然每一 magabyte 也較貴)﹐而另一個比較慢﹐但使用固定價格。我們理所當然想把外送郵件走那個較便宜的 router 。

我們已經將封包標識為 '1' 了﹐現在就指引路由原則資料庫做如下事情﹕

# echo 201 mail.out >> /etc/iproute2/rt_tables
# ip rule add fwmark 1 table mail.out
# ip rule ls
0:      from all lookup local 
32764:  from all fwmark        1 lookup mail.out 
32766:  from all lookup main 
32767:  from all lookup default 

現在我們產生 mail.out 表格﹐將個路由指向較慢但也較便宜的線路﹕

# /sbin/ip route add default via 195.96.98.253 dev ppp0 table mail.out

大功告成﹗假如我們想要網開一面﹐有很多辦法可以做到的。我們可以修改 netfilter 的敘述﹐將某些特定主機豁免出來﹐或是為那些豁免主機插入一條規則﹐使用較低的優先值指向 main 表格。

我們還可以運用此一絕技來實踐 TOS 位元(bits)﹐只需將封包以不同數字標識為不同的服務類型﹐同時建立規則將之跑起來即可。用此辦法﹐我們甚至可以指定一條 ISDN 線路給互動連線呢。

值得一提的是﹐此法在 NAT('masquerading') 主機上也同具功效哦。

請留意﹕您需要將某些核心選項打開才行﹕

IP: advanced router (CONFIG_IP_ADVANCED_ROUTER) [Y/n/?]
 IP: policy routing (CONFIG_IP_MULTIPLE_TABLES) [Y/n/?]
  IP: use netfilter MARK value as routing key (CONFIG_IP_ROUTE_FWMARK) [Y/n/?]

另外﹐還請看看 Cookbook 中的 Transparent web-caching using netfilter, iproute2, ipchains and squid


Next Previous Contents