- 論壇徽章:
- 0
|
構(gòu)建一臺(tái)大容量的NAT服務(wù)器
Ippen Yang
(ippen@21cn.com)
1.前言
本文檔主要描述如何利用Linux構(gòu)建一臺(tái)能力比較強(qiáng)的NAT服務(wù)器,并發(fā)連接數(shù)大約16萬,流量200M-300M,如果你需要一個(gè)流量更高的NAT設(shè)備,請考慮購買專業(yè)廠商的設(shè)備。
2.許可協(xié)議
本文的許可協(xié)議遵循GNU Free Document License。協(xié)議的具體內(nèi)容請參見http://www.gnu.org/copyleft/fdl.html。在遵循GNU Free Document License的基礎(chǔ)上,可以自由地轉(zhuǎn)載或發(fā)行本文,但請保留本文的完整性。
3.準(zhǔn)備工作
CentOS 4.6光盤一套(4張CD)
PC服務(wù)器一臺(tái),P4 CPU,速度越快越好,256M內(nèi)存(有沒聽錯(cuò)?沒錯(cuò)! 256M內(nèi)存就夠了,如果資金充裕,可以用512M;如果你用1G內(nèi)存,那叫浪費(fèi)),2G或以上的硬盤(可以用CF電子盤)
兩個(gè)高性能千兆網(wǎng)卡,到目前為止,我測試過幾種網(wǎng)卡,Intel的PCI-X服務(wù)器網(wǎng)卡,Intel的PCI服務(wù)器網(wǎng)卡,Marvell PCI-E,3COM,前面三種網(wǎng)卡都不錯(cuò),反而是3COM的網(wǎng)卡不行。
網(wǎng)卡最好用兩個(gè)不同的接口,我現(xiàn)在用的主板,通常都是一張PCI-X網(wǎng)卡,一張PCI-E網(wǎng)卡,這樣能避免內(nèi)部接口速度影響轉(zhuǎn)發(fā)效率
4.安裝
首先安裝CentOS,如果考慮編譯內(nèi)核,安裝時(shí)記住要安裝開發(fā)工具,因?yàn)橐{(diào)整系統(tǒng)內(nèi)核模塊的一些參數(shù),要編譯系統(tǒng)模塊。安裝時(shí)要注意,不要建立交換區(qū),切記!。≡蚝竺娼忉
安裝完成后,運(yùn)行setup,在system service中將不需要用的程序全部停止,基本上只需要保留ssh,iptables,network,snmpd,syslog幾個(gè),設(shè)置完后重新啟動(dòng)服務(wù)器。
編輯/etc/sysctl.conf,查找行“net.ipv4.ip_forward = 0”,然后將這行按下面的內(nèi)容進(jìn)行更改,原文件中沒有的內(nèi)容請自己添加
# Controls IP packet forwarding
net.ipv4.ip_forward = 1
net.ipv4.netfilter.ip_conntrack_max = 262144
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.route.max_size=2097152
net.ipv4.tcp_window_scaling=1
kernel.shmmax=268435456
kernel.shmall=268435456
|
編輯/etc/rc.local如下:
#!/bin/sh
touch /var/lock/subsys/local
/root/nat
|
編輯/root/nat如下:
# eth0 is internet interface
# eth1 is intranet interface
INCOMING=eth0
OUTGOING=eth1
ip addr add 222.222.222.8 dev $OUTGOING
ip addr add 222.222.222.9 dev $OUTGOING
ip addr add 222.222.222.10 dev $OUTGOING
ip addr add 222.222.222.11 dev $OUTGOING
IPPOOL=222.222.222.8-222.222.222.11
iptables -t nat -F
iptables -t nat -A POSTROUTING -s 內(nèi)部IP地址/子網(wǎng) -o $OUTGOING -j SNAT --to $IPPOOL
iptables-save -c >/etc/sysconfig/iptables
|
注意,這里假定互聯(lián)網(wǎng)IP是222.222.222.8-222.222.222.11(上面黑色字體),請用真正使用的IP范圍將黑色字體替換。內(nèi)網(wǎng)地址也請根據(jù)實(shí)際環(huán)境變更。這個(gè)腳本只是NAT用,如果需要增加安全策略,請參考其它的iptables的腳本。
如果服務(wù)器的CPU是雙核的,編輯/etc/grub.conf
#boot=/dev/sda1
default=1
timeout=1
#splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS-4 i386 (2.6.9-34.ELsmp)
root (hd0,0)
kernel /boot/vmlinuz-2.6.9-34.ELsmp ro root=LABEL=/
initrd /boot/initrd-2.6.9-34.ELsmp.img
title CentOS-4 i386-up (2.6.9-34.EL)
root (hd0,0)
kernel /boot/vmlinuz-2.6.9-34.EL ro root=LABEL=/
initrd /boot/initrd-2.6.9-34.EL.img
|
將服務(wù)器調(diào)整為單核方式運(yùn)作,為什么?之前與CU的高手討論過這個(gè)問題,也進(jìn)行過測試,單核方式下運(yùn)行的NAT效率的確比雙核高,也更穩(wěn)定,所以只用單核,不過現(xiàn)在只能買到雙核的CPU,只好浪費(fèi)一點(diǎn)了。
5.高級(jí)配置
由于linux系統(tǒng)內(nèi)部的一些參數(shù)在NAT環(huán)境中并不合理,因此在一些情況下需要作些修改,由于涉及內(nèi)核,建議不熟悉的朋友忽略這個(gè)部分。
這部分的調(diào)整對系統(tǒng)的優(yōu)化有限,如果你的并發(fā)連接數(shù)不是非常高,也可以忽略這個(gè)部分。
首先下載linux的內(nèi)核源文件,請上http://mirror.be10.com下載,下載后解包到硬盤中。
系統(tǒng)調(diào)整主要是三個(gè)默認(rèn)的參數(shù),參數(shù)buckets、ip_conntrack_max和tcp_timeout_established。
參數(shù)tcp_timeout_established 位于文件net/ipv4/netfilter/ip_conntrack_proto_tcp.c中,用vi打開文件,查找
unsigned long ip_ct_tcp_timeout_established = 5 DAYS; |
原來的tcp_timeout_established是5天,這個(gè)數(shù)值太大了,很容易造成內(nèi)存過度占用,導(dǎo)致系統(tǒng)死機(jī),將其改為如下,
unsigned long ip_ct_tcp_timeout_established = 5 MINS; |
參數(shù)buckets、ip_conntrack_max位于文件net/ipv4/netfilter/ip_conntrack_core.c中,用vi打開文件,查找如下的一段代碼,可以看出,系統(tǒng)默認(rèn)的buckets數(shù)值是內(nèi)存數(shù)的1/16384,ip_conntrack_max是buckets的8倍,即時(shí)你有大于1G的內(nèi)存,buckets也只是8192。
/* Idea from tcp.c: use 1/16384 of memory.
On i386: 32MB
* machine has 256 buckets.
>= 1GB machines have 8192 buckets. */
if (hashsize) {
ip_conntrack_htable_size = hashsize;
} else {
ip_conntrack_htable_size
= (((num_physpages << PAGE_SHIFT) / 16384)
/ sizeof(struct list_head));
if (num_physpages > (1024 * 1024 * 1024 / PAGE_SIZE))
ip_conntrack_htable_size = 8192;
if (ip_conntrack_htable_size < 16)
ip_conntrack_htable_size = 16;
}
|
調(diào)整可以在這段代碼后面直接對buckets和ip_conntrack_max賦值即可
/* Idea from tcp.c: use 1/16384 of memory.
On i386: 32MB
* machine has 256 buckets.
>= 1GB machines have 8192 buckets. */
if (hashsize) {
ip_conntrack_htable_size = hashsize;
} else {
ip_conntrack_htable_size
= (((num_physpages << PAGE_SHIFT) / 16384)
/ sizeof(struct list_head));
if (num_physpages > (1024 * 1024 * 1024 / PAGE_SIZE))
ip_conntrack_htable_size = 8192;
if (ip_conntrack_htable_size < 16)
ip_conntrack_htable_size = 16;
}
ip_conntrack_htable_size = 32768;
ip_conntrack_max = 8 * ip_conntrack_htable_size;
|
參數(shù)改好后,編譯modules,然后用編譯后產(chǎn)生的文件ip_conntrack.ko代替系統(tǒng)中的同名文件(位于/lib/modules/2.6.9……),重新啟動(dòng)即可。
調(diào)整內(nèi)核參數(shù)buckets的效果不是特別明顯,在初始測試中,使用默認(rèn)的buckets數(shù)值,但并發(fā)連接數(shù)到12.8萬時(shí),CPU的使用率有明顯上升,穩(wěn)定性變差,調(diào)整buckets數(shù)值后并發(fā)連接數(shù)能到16萬,但流量上升不多,所以對系統(tǒng)編譯不熟悉的朋友不必考慮這個(gè)方法,增加一臺(tái)服務(wù)器就是了。
常見問題
Q.服務(wù)器空載時(shí)速度很快,但一加載流量就有明顯的丟包,并且只有幾兆流量,但實(shí)際流量遠(yuǎn)遠(yuǎn)不止幾兆
A.請檢查網(wǎng)線以及交換機(jī)端口、linux服務(wù)器網(wǎng)卡端口的全雙工、半雙工狀態(tài),用ethertool,這個(gè)現(xiàn)象非常明顯和常見,通常都是全雙工、半雙工匹配問題。
Q.我的網(wǎng)內(nèi)有2千用戶,要什么樣的服務(wù)器才能正常運(yùn)作?
A.其實(shí)完全不必關(guān)心又多少用戶,關(guān)鍵是系統(tǒng)的并發(fā)連接數(shù),系統(tǒng)并發(fā)連接數(shù)最好不要超過16萬并發(fā)連接數(shù),超過了系統(tǒng)會(huì)有些不穩(wěn)定,所以建議連接數(shù)高的用戶采用增加服務(wù)器的方式。
目前的優(yōu)化只能到這個(gè)程度了,如果有更好的優(yōu)化方案,我會(huì)第一時(shí)間高訴各位的。
Q.使用更快的CPU和更大的內(nèi)存能否提高并發(fā)連接數(shù)?
A.開始我也這樣認(rèn)為,但實(shí)際測試中,發(fā)現(xiàn)這個(gè)觀點(diǎn)完全錯(cuò)誤,NAT使用的內(nèi)存量比較固定,我監(jiān)測的結(jié)果,基本上在200M左右,所以在開始建議大家買的內(nèi)存也是256M而已,更快的CPU對NAT是有幫助,但隨著并發(fā)連接數(shù)的增加,NAT的效率越來越低,反而效果更差。
Q.是否一定要將互聯(lián)網(wǎng)IP設(shè)置到OUT網(wǎng)卡上?
A.不一定,但這樣設(shè)置,NAT服務(wù)器的CPU利用率會(huì)明顯降低,強(qiáng)烈建議這樣配置。
Q.為什么不使用交換區(qū)?
A.這個(gè)服務(wù)器只是用于NAT,不是代理服務(wù)器,為了提高NAT轉(zhuǎn)發(fā)速率,就要完全避免讀寫硬盤,而物理內(nèi)存使用完了后,系統(tǒng)就會(huì)使用交換區(qū)來存儲(chǔ)數(shù)據(jù),整個(gè)服務(wù)器速度就會(huì)被拖慢,直至死機(jī)。因此在這里完全不要使用交換區(qū)。
Q.其他linux版本能否使用?
A.Sure,推薦CentOS主要是方便不熟悉Linux系統(tǒng)的朋友,避免朋友們盲目地找不同的linux版本測試。這里仍然強(qiáng)調(diào)一下,使用2.6的內(nèi)核,不要使用2.4內(nèi)核,2.6的內(nèi)核能查看并發(fā)連接數(shù),并且NAT效率比2.4高。
Q.為什么我的NAT服務(wù)器不行?
A.這個(gè)問題很復(fù)雜,我現(xiàn)在回答不了^_^,請上CU的論壇(http://www.72891.cn)發(fā)帖子。發(fā)郵件給我的話,就要有點(diǎn)耐心等回復(fù)了
感謝
所有在CU的朋友,特別是Platinum和JohnBull,給我提出很多有用的參考意見。
[ 本帖最后由 ippen 于 2008-7-7 23:38 編輯 ] |
|