iptables+squid透明代理+防火牆終極配置

系統:
CentOS4.2,三塊網卡,兩個內網,一個外網。雙至強,2GHz,2GB內存。服務器主要開了squid,sshd,其他的一律閉掉了。
eth0:192.168.100.1
eth1:192.168.168.12
eth2:A.B.C.D —— 外網地址
================================================
squid設定可以根據自己的情況來,我們假設其端口爲3128,在三塊網卡上都有監聽(不要綁定某一個IP或網卡)。
/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 [email][email protected][/email]
visible_hostname lixiaedu
==================================================
iptables設定。iptables的設定分爲兩部分,一是如何進行SNAT,二是在開設了squid的情況下如何進行安全防護的問題。
一、SNAT
modprobe ip_tables
modprobe iptable_nat
modprobe iptable_filter
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
加掛一些iptables的必要的模塊,以便調用。
echo 1 > /proc/sys/net/ipv4/ip_forward
打開“轉發”功能。讓數據包可以在不同的網卡間“流動”。
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
上面這四句比較重要,是進行透明代理的關鍵。前兩句的作用是進行“源地址轉換”,也就是說要進行內網地址到外網地址的轉換。執行了這兩句,即使沒有squid,內網機器也可以上網了。
後面兩句是對從兩個內網網卡進入的、tcp協議的、目的端口號是80的,做“端口重定向”。重定向到3128端口。這樣,squid就可以接到這個數據包了。
OK!如果你的squid沒有問題,而且你也執行了上面的語句,並且沒有報錯。那就恭喜你,一個iptables+squid的透明代理做成了。如果你不相信,有兩個方法可以測試:一是登錄:[url]http://ipid.shat.net[/url] ,這是一個國外網站,可以顯示你的外網ip地址,還有是否被代理過。二是在一臺內網機器上下載一個文件,或者看一頁圖片很多而且較慢的網頁,然後轉到另一臺內網機器上下載同樣的文件或看剛纔的圖片網頁。比較一下速度,就能感覺出來了。
二、firewall
如果你把這樣一臺服務器放到internet上,無異於是想“自殺”。防火牆沒有任何的保護機制和過濾功能。很容易被各種***所擊破。不要迷信Linux的安全性,網管員的安全意識要比空喊Linux安全重要得多。
iptables -F
iptables -X
iptables -F -t mangle
iptables -t mangle -X
iptables -F -t nat
iptables -t nat -X
首先,把三個表清空,把自建的規則清空。
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
設定INPUT、OUTPUT的默認策略爲DROP,FORWARD爲ACCEPT。
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
先把“迴環”打開,以免有不必要的麻煩。
iptables -A INPUT -i eth+ -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -o eth+ -p icmp --icmp-type 0 -j ACCEPT
在所有網卡上打開ping功能,便於維護和檢測。
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端口,允許遠程管理。(設定了很多的附加條件:管理機器IP必須是250,並且必須從eth0網卡進入)
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
上面這幾句是比較頭痛的,我做逐一解釋。
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網段的機器發送數據包從eth0網卡進入。如果數據包是tcp協議,而且目的端口是3128(因爲REDIRECT已經把80改爲3128了。nat表的PREROUTING是在filter表的INPUT前面的。)的,再而且,數據包的狀態必須是NEW或者ESTABLISHED的(NEW代表tcp三段式握手的“第一握”,換句話說就是,允許客戶端機器向服務器發出鏈接申請。ESTABLISHED表示通過握手已經建立起鏈接),通過。
iptables -A OUTPUT -o eth2 -p tcp --sport 32768:61000 -m state --state NEW,ESTABLISHED -j ACCEPT
我們先來看這一句。現在你的數據包已經進入到linux服務器防火牆上來了。squid需要代替你去訪問,所以這時,服務器就成了客戶端的角色,所以它要使用32768到61000的私有端口進行訪問。(大家會奇怪應該是1024到65535吧。其實CentOS版的linux所定義的私有端口是32768到61000的,你可以通過cat /proc/sys/net/ipv4/ip_local_port_range,查看一下。)再次聲明:這裏是squid以客戶端的身份去訪問其他的服務器,所以這裏的源端口是32768:61000,而不是3128!
iptables -A INPUT -i eth2 -p tcp --dport 32768:61000 -m state --state ESTABLISHED -j ACCEPT
當然了,數據有去就有回。
iptables -A OUTPUT -o eth0 -d 192.168.100.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT
數據包還得通過服務器,轉到內網網卡上。請注意,這裏,是squid幫你去訪問了你想要訪問的網站。所以在內網中,你的機器是客戶端角色,而squid是服務器角色。這與剛纔對外訪問的過程是不同的。所以在這裏,源端口是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
當然,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
當然了,來點日誌記錄會對網管員有所幫助。
至此,一個完整的訪問過程就被我們分析過了。本篇中最主要的就是要說明squid在對內網機器和外網服務器中扮演了兩種截然相反的角色。
這對大家來說不太好理解。我也是摸索了一段時間才成功的。願我的文章拋磚引玉,能引起大家的共鳴和思索。
本篇文章歡迎大家轉載,請保留作者信息。

一點說明:最近見到過一種情況,就是squid無法啓動,或者說起動起來幾秒鐘就自動停掉。messages中說有squid遇到了signal 25,所以停止。遇到這種問題,要查看squid的日誌是不是太大了。我看了一下,access.log有1.6GB,store.log有2GB大小。看來是日至文件偏大。把兩個文件轉移或者改名後就可以了。
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章