CentOS+iptables+squid透明代理+防火墻設(shè)置
#p#CentOS+iptables+squid透明代理+防火墻設(shè)置問題困擾許多人們,我在這里幫大家集體解決下!
=====================================================================
相關(guān)資源:
man.chinaunix.net,左下角有iptables的man,仔細(xì)看看。
系統(tǒng):
CentOS4.2,三塊網(wǎng)卡,兩個(gè)內(nèi)網(wǎng),一個(gè)外網(wǎng)。雙至強(qiáng),2GHz,2GB內(nèi)存。服務(wù)器主要開了squid,sshd,其他的一律閉掉了。
eth0:192.168.100.1
eth1:192.168.168.12
eth2:A.B.C.D ?? 外網(wǎng)地址
=====================================================================
squid設(shè)定能根據(jù)自己的情況來,我們假設(shè)其端口為3128,在三塊網(wǎng)卡上都有監(jiān)聽(不要綁定某一個(gè)IP或網(wǎng)卡)。
/etc/squid/squid.conf
http_port 3128
cache_mem 1000 MB
cache_swap_low 90
cache_swap_high 95
cache_dir ufs /opt/cache/squid 8000 16 256
cache_access_log /var/log/squid/access.log
cache_store_log /var/log/squid/store.log
dns_nameservers 210.77.192.88
maximum_object_size 409600 KB
maximum_object_size_in_memory 64000 KB
emulate_httpd_log on
ipcache_size 1024
ipcache_low 90
ipcache_high 95
fqdncache_size 1024
forwarded_for off
coredump_dir /opt/cache/squid/coredump
httpd_accel_port 80
httpd_accel_host virtual
httpd_accel_with_proxy on
httpd_accel_single_host off
httpd_accel_uses_host_header on
acl all src 0.0.0.0/0
acl lixiaedu100 src 192.168.100.0/24
acl lixiaedu168 src 192.168.168.0/24
http_access allow lixiaedu100
http_access allow lixiaedu168
http_access deny all
cache_effective_user squid
cache_effective_group squid
cache_mgr
zhaobing8181@163.com
visible_hostname lixiaedu
#p#
iptables設(shè)定。iptables的設(shè)定分為兩部分,一是怎么進(jìn)行SNAT,二是在開設(shè)了squid的情況下怎么進(jìn)行安全防護(hù)的問題。
一、SNAT
modprobe ip_tables
modprobe iptable_nat
modprobe iptable_filter
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
加掛一些iptables的必要的模塊,以便調(diào)用。
echo 1 > /proc/sys/net/ipv4/ip_forward
打開“轉(zhuǎn)發(fā)”功能。讓數(shù)據(jù)包能在不同的網(wǎng)卡間“流動(dòng)”。
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth2 -j SNAT --to A.B.C.D
iptables -t nat -A POSTROUTING -s 192.168.168.0/24 -o eth2 -j SNAT --to A.B.C.D
iptables -t nat -A PREROUTING -s 192.168.100.0/24 -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -s 192.168.168.0/24 -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
上面這四句比較重要,是進(jìn)行透明代理的關(guān)鍵。前兩句的作用是進(jìn)行“源地址轉(zhuǎn)換”,也就是說要進(jìn)行內(nèi)網(wǎng)地址到外網(wǎng)地址的轉(zhuǎn)換。執(zhí)行了這兩句,即使沒有squid,內(nèi)網(wǎng)機(jī)器也能上網(wǎng)了。
后面兩句是對(duì)從兩個(gè)內(nèi)網(wǎng)網(wǎng)卡進(jìn)入的、tcp協(xié)議的、目的端口號(hào)是80的,做“端口重定向”。重定向到3128端口。這樣,squid就能接到這個(gè)數(shù)據(jù)包了。
OK!如果你的squid沒有問題,而且你也執(zhí)行了上面的語句,并且沒有報(bào)錯(cuò)。那就恭喜你,一個(gè)iptables+squid的透明代理做成了。如果你不相信,有兩個(gè)方法能測(cè)試:一是登錄:
http://ipid.shat.net
,這是個(gè)國(guó)外網(wǎng)站,能顯示你的外網(wǎng)ip地址,更有是否被代理過。二是在一臺(tái)內(nèi)網(wǎng)機(jī)器上下載一個(gè)文件,或看一頁圖片非常多而且較慢的網(wǎng)頁,然后轉(zhuǎn)到另一臺(tái)內(nèi)網(wǎng)機(jī)器上下載同樣的文件或看剛才的圖片網(wǎng)頁。比
較一下速度,就能感覺出來了。
二、firewall
如果你把這樣一臺(tái)服務(wù)器放到internet上,無異于是想“自殺”。防火墻沒有所有的保護(hù)機(jī)制和過濾功能。非常容易被各種攻擊所擊破。不要迷
信Linux的安全性,網(wǎng)管員的安全意識(shí)要比空喊Linux安全重要得多。
iptables -F
iptables -X
iptables -F -t mangle
iptables -t mangle -X
iptables -F -t nat
iptables -t nat -X
首先,把三個(gè)表清空,把自建的規(guī)則清空。
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
設(shè)定INPUT、OUTPUT的默認(rèn)策略為DROP,F(xiàn)ORWARD為ACCEPT。
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
先把“回環(huán)”打開,以免有不必要的麻煩。
iptables -A INPUT -i eth+ -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -o eth+ -p icmp --icmp-type 0 -j ACCEPT
在所有網(wǎng)卡上打開ping功能,便于維護(hù)和檢測(cè)。
iptables -A INPUT -i eth0 -s 192.168.100.250 -d 192.168.100.1 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.100.250 -s 192.168.100.1 -p tcp --sport 22 -j ACCEPT
打開22端口,允許遠(yuǎn)程管理。(設(shè)定了非常多的附加條件:管理機(jī)器IP必須是250,并且必須從eth0網(wǎng)卡進(jìn)入)
iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.100.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth1 -s 192.168.168.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth1 -d 192.168.168.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth2 -p tcp --dport 32768:61000 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth2 -p tcp --sport 32768:61000 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth2 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth2 -p udp --sport 53 -j ACCEPT
上面這幾句是比較頭痛的,我做逐一解釋。
#p#
iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT
允許192.168.100.0/24網(wǎng)段的機(jī)器發(fā)送數(shù)據(jù)包從eth0網(wǎng)卡進(jìn)入。如果數(shù)據(jù)包是tcp協(xié)議,而且目的端口是3128(因?yàn)镽EDIRECT已把80改為3128了。nat表的PREROUTING是在filter表的INPUT前面的。)的,再而且,數(shù)據(jù)包的狀態(tài)必須是NEW或ESTABLISHED的(NEW代表tcp三段式握手的“第一握”,換句話說就是,允許客戶端機(jī)器向服務(wù)器發(fā)出鏈接申請(qǐng)。ESTABLISHED表示通過握手已建立起鏈接),通過。
iptables -A OUTPUT -o eth2 -p tcp --sport 32768:61000 -m state --state NEW,ESTABLISHED -j ACCEPT
我們先來看這一句。目前你的數(shù)據(jù)包已進(jìn)入到linux服務(wù)器防火墻上來了。squid需要代替你去訪問,所以這時(shí),服務(wù)器就成了客戶端的角色,所以他要使用32768到61000的私有端口進(jìn)行訪問。(大家會(huì)奇怪應(yīng)該是1024到65535吧。其實(shí)CentOS版的linux所定義的私有端口是32768到61000的,你能通過cat /proc/sys/net/ipv4/ip_local_port_range,查看一下。)再次聲明:這里是squid以客戶端的身份去訪問其他的服務(wù)器,所以這里的源端口是32768:61000,而不是3128!
iptables -A INPUT -i eth2 -p tcp --dport 32768:61000 -m state --state ESTABLISHED -j ACCEPT
當(dāng)然了,數(shù)據(jù)有去就有回。
iptables -A OUTPUT -o eth0 -d 192.168.100.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT
數(shù)據(jù)包還得通過服務(wù)器,轉(zhuǎn)到內(nèi)網(wǎng)網(wǎng)卡上。請(qǐng)注意,這里,是squid幫你去訪問了你想要訪問的網(wǎng)站。所以在內(nèi)網(wǎng)中,你的機(jī)器是客戶端角色,而squid是服務(wù)器角色。這和剛才對(duì)外訪問的過程是不同的。所以在這里,源端口是3128,而不是32768:61000。
iptables -A OUTPUT -o eth2 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth2 -p udp --sport 53 -j ACCEPT
當(dāng)然,DNS是不可缺少的。
iptables -A INPUT -i eth+ -p tcp --dport 80 -j LOG --log-prefix "iptables_80_alert" --log-level info
iptables -A INPUT -i eth+ -p tcp --dport 21 -j LOG --log-prefix "iptables_21_alert" --log-level info
iptables -A INPUT -i eth+ -p tcp --dport 22 -j LOG --log-prefix "iptables_22_alert" --log-level info
iptables -A INPUT -i eth+ -p tcp --dport 25 -j LOG --log-prefix "iptables_25_alert" --log-level info
iptables -A INPUT -i eth+ -p icmp --icmp-type 8 -j LOG --log-prefix "iptables_icmp8_alert" --log-level info
當(dāng)然了,來點(diǎn)日志記錄會(huì)對(duì)網(wǎng)管員有所幫助。
至此,一個(gè)完整的訪問過程就被我們分析過了。本篇中最主要的就是要說明squid在對(duì)內(nèi)網(wǎng)機(jī)器和外網(wǎng)服務(wù)器中扮演了兩種截然相反的角色。
這對(duì)大家來說不太好理解。我也是摸索了一段時(shí)間才成功的。愿我的文章拋磚引玉,能引起大家的共鳴和思索。
一點(diǎn)說明:最近見到過一種情況,就是squid無法啟動(dòng),或說起動(dòng)起來幾秒鐘就自動(dòng)停掉。messages中說有squid遇見了signal 25,所以停止。遇見這種問題,要查看squid的日志是不是太大了。我看了一下,access.log有1.6GB,store.log有2GB大小??磥硎侨罩廖募?。把兩個(gè)文件轉(zhuǎn)移或改名后就能了
通過文章大量的介紹,相信大家心中的困惑都得到解決了,還有什么不懂的問題,歡迎留言!
【編輯推薦】