智能CDN安裝和維護手冊
一. 系統安裝
1. 系統選用
系統:CentOS5.5以上,原則上使用64位系統!
2. 系統分區
/boot 100M
/ 5-10G
Swap 4-8G
/mynet/logs 20G
/mynet 第一塊盤剩餘空間
別的盤根據系統的不同掛載不同目錄
3. 軟件選擇
爲了保證系統最大穩定性,只選擇基本系統和開發工具包
Editors, development-tools, development-libs
4. 目錄規範,所有後裝軟件放在/mynet目錄下
/mynet/app
|
軟件安裝目錄
|
/mynet/logs
|
日誌目錄,最好獨立分區,防止撐爆
|
/mynet/soft
|
軟件源代碼編譯目錄
|
/mynet/cache
|
緩存目錄
|
/mynet/webroot
|
網站文件
|
/mynet/bin
|
腳本目錄
|
/mynet/backup
|
備份目錄
|
5. 其餘路徑說明
/etc/init.d 系統啓動腳本的目錄
/etc/rc.local 跟隨系統啓動的腳本添加在裏面
Crontab -e 添加定時執行的任務
二. 安全設置
1. BIOS安全
設置BIOS密碼且修改引導次序禁止從軟盤啓動系統
2. 口令文件
chattr命令給帳戶文件加上不可更改屬性,從而防止非授權用戶獲得權限
chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow
可以更改屬性
可以更改屬性
chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow
3.禁止Ctrl+Alt+Delete重新啓動機器命令
修改/etc/inittab文件,將"ca::ctrlaltdel:/sbin/shutdown -t3 -r now"一行註釋掉
3. 限制Root登陸
修改/etc/ssh/sshd_conf,把PermitRootLogin修改爲no 。
4. 添加允許sudo的用戶
Vim /etc/sudoers ,添加幾行
wenyj ALL=(ALL) NOPASSWD: ALL
liuzx ALL=(ALL) NOPASSWD: ALL
lianqf ALL=(ALL) NOPASSWD: ALL
這樣執行程序需要用root權限時候,在前面添加sudo即可。比如:sudo /mynet/bin/apache start
如果需要全部進入root權限:sudo su -
5. 防止IP欺騙
編輯/etc/host.conf文件並增加如下幾行來防止IP欺騙***。
order bind,hosts
multi off
nospoof on
order bind,hosts
multi off
nospoof on
6. 防止DoS***
對系統所有的用戶設置資源限制可以防止DoS類型***。如最大進程數和內存使用數量等。在/etc/security/limits.conf中添加如下幾行:
* hard core 0
* hard rss 5000
* hard nproc 20
編輯/etc/pam.d/login文件檢查下面一行是否存在。
session required /lib/security/pam_limits.so
* hard core 0
* hard rss 5000
* hard nproc 20
編輯/etc/pam.d/login文件檢查下面一行是否存在。
session required /lib/security/pam_limits.so
7. 防止syn-flood***
將下邊的設置加到/etc/sysctl.conf中,防止syn-flood***,現在的服務器進行syn-flood***時會拒絕服務
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syncookies = 1
8. 修改防火牆
Vi /etc/sysconfig/iptables
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
# Note: ifup-post will punch the current nameservers through the
# firewall; such entries will *not* be listed here.
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth1 -j ACCEPT
-A INPUT -p tcp ! --syn -j ACCEPT
-A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW -j ACCEPT
COMMIT
9. .安裝安全嗅探器chkrootkit
到http://www.chkrootkit.org/ 下載最新版本的 chkrootkit
cd /mynet/soft/
wget "ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz"
tar xzvf chkrootkit.tar.gz
cd chkrootkit-0.40
make sense
./chkrootkit -q檢查系統是否被人放了後門程序
但是如果發現了執行結果中發現了"INFECTED"信息的話。那可能表示已經"中彈"被感染了!
10. 用setup去掉無用服務,如以下:
acpid anacron apmd atd auditd autofs bluetooth cups dc_client dc_server dund firstboot haldaemon hidd ip6tables ipmi irda irqbalance lm_sensors lvm2-monitor mdmonitor mdmpd messagebus netfs netplugd nscd pcscd psacct rdisc readahead_early readahead_later restorecond rhnsd rpcgssd rpcid mapd rpcsvcgssd saslauthd smartd snmptrapd wpa_supplicant ypbind yum-updatesd xfs
三. 智能DNS安裝
1. 軟件選擇: BIND 9.6-ESV-R3
2. 編譯安裝
#./configure --prefix=/mynet/app/named --enable-threads --enable-largefile --with-libxml2 --disable-openssl-version-check --disable-ipv6
#make && make install
大概解析如下:
enable-threads //打開多線程處理
enable-largefile //打開大文件支持,必須打開
with-libxml2,disable-ipv6 //打開xml支持和關閉ipv6,可以不管
3. 添加配置文件etc/named.conf
options {
directory "/mynet/app/named/etc/"; // 配置文件路徑
pid-file "/mynet/app/named/var/run/named.pid";
version "0.0.0"; //隱藏版本號
allow-query-cache{ “192.168.100.0/24”}; //允許解析公網域名
allow-notify { “192.168.100.0/24”}; //允許查看服務器配置
forwarders {
219.141.140.10;203.196.0.6;219.141.136.10;202.106.148.1;
}; //用於轉發的上層DNS
};
logging {
channel query_log {
file "/mynet/app/named/logs/query.log" versions 3 size 20m;
severity info;
print-time yes;
print-category yes;
};
category default {
query_log;
};
category queries {
query_log;
};
}; //系統
4. 配置IP庫文件,在name.conf添加以下內容,如果有多個就添加多個配置文件。
include "cnc.list";
view "view_cnc" {
match-clients {
CNC;
};
include "master/etc/cnc.conf";
};
IP的列表文件如下:cnc.list
acl "CNC" {
110.228.0.0/14;
110.240.0.0/12;
}
5. 生成rndc控制命令的key文件
sbin/rndc-confgen > etc/rndc.conf
cd etc
tail -10 rndc.conf | head -9 | sed s/# //g >; named.conf
6. 生成根名文件
dig > named.root
7. 生成自己的域名文件:test.com
$TTL 300 //更新時間
@ IN SOA test.com. root.test.com. (
2010101201 ; Serial //時間戳
300 ; Refresh
3600 ; Retry
360000 ; Expire
300 ) ; Minimum
NS ns1.netnet.com. //NS記錄
NS ns2.netnet.com.
MX 10 mail.test.com. //MX記錄
@ A 127.0.0.1
ns1 A 127.0.0.1
ns2 A 127.0.0.1
www A 127.0.0.1
man A 11.11.11.11
mail A 11.11.11.11
8. 配置named.conf加如以下代碼:
zone "." IN {
type hint;
file "named.root";
};
zone "test.com" IN {
type master;
file "master/any/test.com";
};
9. 啓動域名服務器:
/mynet/app/named/sbin/named -u named -c /mynet/app/named/etc/named.conf
10. 使用腳本獲取最新的IP庫
#!/bin/sh
FILE=./ip_apnic
wget http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest -O $FILE
grep 'apnic|CN|ipv4|' $FILE | awk -F '|' '{print $4,$5}' | while read ip cnt
do
echo $ip:$cnt
mask=$(cat << EOF | bc | tail -1
pow=32;
define log2(x) {
if (x<=1) return (pow);
pow--;
return(log2(x/2));
}
log2($cnt)
EOF)
echo $ip/$mask>> cn_ip.list
NETNAME=`whois $ip | sed -e '/./{H;$!d;}' -e 'x;/netnum/!d' |grep ^netname | sed -e 's/.*: \(.*\)/\1/g' | sed -e 's/-
.*//g'`
echo $NETNAME >> cn_id.list
done
|
11. 用命令將不同區域的IP分離出來,下面以CNC爲例:
#paste cn_ip.list cn_id.list >> all.list //讓IP和註冊ID一一對應
#cat all.txt | awk '/CNC/ {print $1}' >> nCNC.list //把註冊ID中包含有cnc的IP分離給cnc段
#cat all.txt | awk '/UNICOM/ {print $1}' >> cnc.list
#vim -c ':%s/$/\;/g' cnc.list //給ip表中每行後面添加分號
修改cnc.list給IP段前後加上頭和大擴號,讓其符合named的規則:
acl "CNC" {
IP
};
|
四. Squid安裝:
1. 軟件下載:選擇squid2.6系列最穩定版本
到官方網站下載:http://www.squid-cache.org
2. 解壓,修改源代碼,註釋掉一些信息泄露: vim src/errorpage.c
/* "<HR noshade size=\"1px\">\n"
"<ADDRESS>\n"
"Generated %T by %h (%s)\n"
"</ADDRESS>\n"
*/
|
3. 編譯安裝:
CHOST="x86_64-pc-linux-gnu" CFLAGS="-march=nocona -O2 -pipe" CXXFLAGS="${CFLAGS}" ./configure --prefix=/mynet/app/squid1 --enable-async-io=3200 --enable-storeio=ufs,aufs --disable-icmp --enable-snmp --enable-kill-parent-hack --enable-epoll --enable-removal-policies=heap,lru --disable-delay-pools --with-large-files --with-maxfd=65535 --enable-useragent-log --enable-referer-log --enable-follow-x-forwarded-for --enable-err-languages="English Simplify_Chinese"
大概解釋如下:
CHOST 開頭的是GCC的優化參數,一般默認即可,不同的CPU有不同的參數列表,具體可到http://en.gentoo-wiki.com/wiki/Safe_Cflags查看。
--prefix //安裝路徑
--enable-async-io=3200 //打開IO進程數
--enable-storeio=ufs,aufs //磁盤IO輪詢方式
--enable-removal-policies=heap,lru //緩存文件散列的哈希值
--with-large-files --with-maxfd=65535 //打開大文件支持,最大文件讀取65535,這兩個參數必須打開。
--enable-follow-x-forwarded-for //打開IP轉讓,讓後端獲取到真實IP
--enable-err-languages="English Simplify_Chinese" //安裝的幫助文件,默認把所有語言安裝進去,目錄太大。
4. 修改配置文件: etc/squid.conf ,主要修改以下項目:
http_port 80 vhost vport defaultsite=cache001 //主機名和端口
cache_effective_user squid //運行使用的用戶
cache_effective_group squid //運行使用的組
cache_mgr [email protected] //管理員的郵箱地址
icp_port 3333 //提供給鄰居的UDP端口
acl QUERY urlpath_regex cgi-bin admin \.php \.cgi //不能緩存的文件路徑或者後綴名
cache_mem 4 GB //使用內存大小
cache_dir aufs /mynet/cache 80000 16 256 //使用硬盤大小M,第一層目錄數,第二層目錄數
maximum_object_size 204800 KB //硬盤緩存的最大文件
maximum_object_size_in_memory 2048 KB //內存緩存的最大文件
access_log /mynet/logs/access-4.log //訪問日誌
cache_log /mynet/app/squid4/var/logs/cache.log //系統日誌
cache_peer 192.168.100.103 parent 80 0 no-query no-digest originserver name=web103 //前段主機名稱
cache_peer 192.168.100.42 sibling 8084 3334 name=cache-yh002 //鄰居主機名稱
refresh_pattern ^http 1440 20% 14400 override-expire override-lastmod ignore-reload ignore-no-cache ignore-private ignore-auth //緩存規則,就是http開頭的全部緩存,最小緩存時間1440分鐘,最大14400分鐘。
error_directory /mynet/app/squid4/share/errors/Simplify_Chinese //頁面錯誤幫助文件
5. 啓動緩存服務器和一些常用命令:
/mynet/app/squid4/sbin/squid -z //程序啓動之前必須要執行此命令,建立緩存目錄。/mynet/cache必須要有squid的讀寫權限。
/mynet/app/squid4/sbin/squid -k parse //檢查配置文件是否正確
/mynet/app/squid4/sbin/squid -s //啓動squid服務
/mynet/app/squid4/sbin/squid -k reconfigure //重載配置文件
/mynet/app/squid/bin/squidclient –p8081 mgr:info //查詢命中率
五. 維護和排錯
1. DNS的更新
如果需要更新和修改DNS的域名信息,請添加host
121.199.64.91 name.mynet.cn
聯通的訪問在雅虎機房,電信的訪問在佛山機房,其它的訪問都在鐵通機房
域名生效查詢命令:
Dig @202.106.0.20 1001.cache.mynet.cn //網通
Dig @219.141.136.10 1001.cache.mynet.cn //電信
Dig @8.8.8.8 1001.cache.mynet.cn //海外
dig @127.0.0.1 1001.cache.mynet.cn //查詢本機是否已經正常
如果一直不能生效,可以到121.199.64.91, 121.199.64.92,119.145.145.40這三臺機器上,手動執行/root/bin/named_update.sh看是否有什麼報錯。
2. DNS修改配置
修改配置文件:/mynet/app/named/etc/named.conf
修改域文件: /mynet/app/named/etc/master , 在這個目錄下面的子目錄裏面,根據區域不同,子目錄就不同。
區域對應:cnc-聯通,tel-電信, mob-移動鐵通,edu-教育網,any-海外
增加不同區域的域名: /mynet/app/named/etc/master/etc
3. DNS的重啓和加載
/mynet/bin/named start //啓動named程序
/mynet/bin/named stop
/mynet/bin/named reload //重新加載配置文件
/mynet/app/squid/bin/squidclient –p8081 mgr:info //查詢命中率
4. DNS的日誌文件
/var/log/message //程序啓動日誌
/mynet/app/named/logs/query.log //運行狀態的解析日誌
5. Squid對應端口和產品
Squid1—8081—超級戰車
Squid2—8082—淘裏淘外
Squid3—8083—hichina組
Squid4—8084—淘裏淘外CDN
Squid5—8085—阿里阿外CDN
6. Squid的配置文件修改
不同產品線的squid不一樣,請根據產品線到/mynet/app修改不同的配置文件,文件名都是squid.conf
7. Squid的重啓和加載
/mynet/bin/squid1 start //啓動squid1,如果是其他產品線,請修改最後一個腳本命令的數字,比如/mynet/bin/squid2
/mynet/bin/squid1 stop //停止squid1
/mynet/bin/squid1 reload //重新加載配置文件
8. 常見問題解決:
Squid無法提供服務,排查步驟如下:
Ps aux | grep squid //查看squid進程是否啓動了
Netstat –lnt | grep 80 //查看對應的端口是否已經打開
Df –h //查看磁盤是否已經爆滿
之前遇到過一次日誌磁盤爆滿的現象,如果發現/mynet/logs空間已經是100%,請到改目錄下面對所有日誌文件進行清理,清理命令如下:
#> /mynet/logs/access-1.log
|
9. Squid一切正常,但是負載均衡獲取不到數據,這個是防火牆和負載均衡不兼容,暫時解決方法就是關閉防火牆
/etc/init.d/iptables stop