摘要
該文討論了如何在Linux2.4環境下如何通過iptables和squid實現透明代理。(2002-06-24 12:55:35)
By 處處
摘要:該文討論了如何在Linux2.4環境下如何通過iptables和squid實現透明代理。
硬件環境:聯想奔月 雙網卡
軟件環境:kernel 2.4.7 squid-2.4.STABLE1
1.什麼是代理服務器?
所謂代理服務器是指代表內部私有網中的客戶連接互聯網www資源的外部服務器的程序。客戶與代理服務器對話,它們接收客戶請求,然後連接真實的服務器,請求得到數據並將響應數據返回給客戶。代理服務器發揮了中間轉接作用。
在代理方式下,私有網絡的數據包從來不能直接進入互聯網,而是需要經過代理的處理。同樣,外部網的數據也不能直接進入私有網,而是要經過代理處理以後才能到達私有網,因此在代理上就可以進行訪問控制,地址轉換等功能。目前,代理服務器軟件有很多,如Netscape Suit Proxy,MS Proxy,Wingate,squid等。這些代理服務器不僅能起到防火牆的作用,而且還可以加速局域網用戶對INTERNET的訪問,因為代理服務器有一個大的緩沖器,將每次浏覽的網頁都保存起來,在下一次訪問該頁時就直接從緩沖器裡調出,而無需再次訪問原始服務器。
2.什麼是透明代理?
透明代理技術中的透明是指客戶端感覺不到代理的存在,不需要在浏覽器中設置任何代理,客戶只需要設置缺省網關,客戶的訪問外部網絡的數據包被發送到缺省網關,而這時缺省網關運行有一個代理服務器,數據實際上被被重定向到代理服務器的代理端口(如8080),即由本地代理服務器向外請求所需數據然後拷貝給客戶端。理論上透明代理可以對任何協議通用。
但是在這種情況下客戶端必須正確設置DNS服務器。因為現在浏覽器不設置任何代理。則DNS查詢必須由browser來解析,也就是要由客戶端必須在TCP/IP中設置的正確的DNS服務器,其完成dns解析。
例如: 從私有網絡上訪問因特網上的 web 站點。
私有網地址為192.168.1.*, 其中客戶機是192.168.1.100,防火牆機器網卡是192.168.1.1。透明web代理被安裝在防火牆機器上並配置端口為8080。內核使用 iptables把與防火牆端口80的連接重定向到代理服務。私有網上的Netscape被配置為直接連接方式。私有網絡的客戶機需要設置DNS服務器。私有網絡上機器的默認路由(別名網關)指向防火牆機器。客戶機機器上的 Netscape 訪問 http://slashdot.org。
1.Netscape通過查找"slashdot.org", 得到它的地址為207.218.152.131. 然後它使用端口1050與此地址建立一個連接,並向web站點發出請求。
2.當包由客戶機 (port 1050)通過防火牆送往slashdot.org(port 80)時, 它們重定向到代理服務重定的8080端口。透明代理使用端口1025與207.218.152.131的端口80(這是原始包的目的地址)建立一個連接。
3. 當代理服務收到從 web 站點傳來的頁面後, 通過已經建立的連接把它復制給 Netscape。
4. Netscape 顯示此頁面。
5. 從slashdot.org 的角度來看,連接是由1.2.3.4(防火牆的撥號連接IP地址)的端口1025到 207.218.152.131的端口80。從客戶機的角度來看,連接是從192.168.1.100(客戶機)端口1050連接到 207.218.152.131(slashdot.org)的端口80, 但是, 它實際是在與透明代理服務器對話。
這就是透明代理的操作流程。
3.內核編譯
一般來講,透明代理所在機器往往是帶動整個局域網聯入互聯網的入口,因此該機器往往需要配置防火牆規則以對內部網絡進行防護。因此在編譯內核時也許要考慮將防火牆支持選項編譯進去。一般來說需要在使用make menUConfig命令配置時打開如下選項:
[*]Networking support
[*]Sysctl support
[*]Network packet filtering
[*]TCP/IP networking
[*]/proc filesystem support
[*] Kernel/User netlink socket
[*] Netlink device emulation
[*] Connection tracking (required for masq/NAT)
[*] FTP protocol support
[*] IP tables support (required for filtering/masq/NAT)
<*> limit match support
[*] MAC address match support
[*] Netfilter MARK match support
[*] Multiple port match support
[*] TOS match support
[*] Connection state match support
[*] Packet filtering
[*] REJECT target support
[*] Full NAT
[*] MASQUERADE target support
[*] REDIRECT target support
[*] Packet mangling
[*] TOS target support
[*] MARK target support
[*] LOG target support
然後make dep ; make clean ;make bzImage命令來編譯內核。如果使用到了模塊,還需要使用下面命令生成和安裝模塊make modules;make modules-install。
將System.map復制到/boot目錄中,將 /usr/src/linux/arch/i386/boot/bzImage復制到 /boot目錄中並改名為 vmlinuz-2.4.7。最後安裝新內核並重新起動:lilo;shutdown -r now即可。
4.squid的安裝配置
下載:
可以從squid主網站下載:
http://www.squid-cache.org/Versions/v2/2.4/squid-2.4.STABLE1-src.tar.gz
也可以從本地下載:
http://www.linuxaid.com.cn/download/solution/squid-2.4.STABLE1-src.tar.gz
編輯安裝:
[root@proxy src]# tar xvfz squid-2.4.STABLE1-src.tar.gz
[root@proxy src]# cd squid-2.4.STABLE1
[root@proxy src]# ./configure
[root@proxy src]# make all
[root@proxy src]# make install
配置:
編輯/usr/local/squid/etc/squid.conf,修改以下內容,確保以下配置:
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
cache_effective_user nobody
cache_effective_group nobody
http_Access allow all
(所有的http_access命令都注釋掉,只留下這條,其實嚴格上來說應該限制只允許局域網用戶使用代理,具體可以參考squid手冊中關於Access Control Lists的內容來限制訪問代理)
cache_dir ufs /usr/local/squid/cache 100 16 256
cache_dir type Directory-Name Mbytes Level-1 Level2
(說明:指定squid用來存儲對象的交換空間的大小及其目錄結構。可以用多個cache_dir命令來定義多個這樣的交換空間,並且這些交換空間可以分布不同的磁盤分區。"directory "指明了該交換空間的頂級目錄。如果你想用整個磁盤來作為交換空間,那麼你可以將該目錄作為裝載點將整個磁盤mount上去。缺省值為 /var/spool/squid。"Mbytes"定義了可用的空間總量。需要注意的是,squid進程必須擁有對該目錄的讀寫權力。"Level- 1"是可以在該頂級目錄下建立的第一級子目錄的數目,缺省值為16。同理,"Level-2"是可以建立的第二級子目錄的數目,缺省值為256。為什麼要定義這麼多子目錄呢?這是因為如果子目錄太少,則存儲在一個子目錄下的文件數目將大大增加,這也會導致系統尋找某一個文件的時間大大增加,從而使系統的整體性能急劇降低。所以,為了減少每個目錄下的文件數量,我們必須增加所使用的目錄的數量。如果僅僅使用一級子目錄則頂級目錄下的子目錄數目太大了,所以我們使用兩級子目錄結構。
那麼,怎麼來確定你的系統所需要的子目錄數目呢?我們可以用下面的公式來估算。
已知量:
DS = 可用交換空間總量(單位KB)/ 交換空間數目
OS = 平均每個對象的大小= 20k
NO = 平均每個二級子目錄所存儲的對象數目 = 256
未知量:
L1 = 一級子目錄的數量
L2 = 二級子目錄的數量
計算公式:
L1 x L2 = DS / OS / NO
(注意這是個不定方程,可以有多個解)
然後創建cache子目錄,並修改該目錄所有者為nobody:
[root@proxy squid]# /usr/local/squid/cache
[root@proxy squid]# chown nobody:nobody /usr/local/squid/cache
修改squid記錄目錄的所有者以允許squid訪問:
[root@proxy squid]# chown nobody:nobody /usr/local/squid/logs
最後啟動squid:
[root@iptable logs]# /usr/local/squid/bin/RunCache &
查看進程列表:
[root@iptable logs]# ps ax
應該出現如下幾個進程:
1372 pts/0 S 0:00 /bin/sh /usr/local/squid/bin/RunCache
1375 pts/0 S 0:00 squid -NsY
1376 ? S 0:00 (unlinkd)
並且系統中應該有如下幾個端口被監聽:
[root@proxy logs]# netstat -ln
tcp 0 0 0.0.0.0:3128 0.0.0.0:* LISTEN
udp 0 0 0.0.0.0:3130 0.0.0.0:*
這些說明squid已經正常啟動了。
然後/etc/rc.d/rc.local文件最後添加 /usr/local/squid/bin/RunCache & 以使得系統啟動時自動啟動squid服務器。
5.iptables的設置
在/etc/rc.d/目錄下用touch命令建立firewall文件,執行chmod u+x firewll以更改文件屬性,編輯/etc/rc.d/rc.local文件,在末尾加上/etc/rc.d/firewall以確保開機時能自動執行該腳本。
firewall文件內容為:
#!/bin/sh
echo "Enabling IP Forwarding..."
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "Starting iptables rules..."
#Refresh all chains
/sbin/iptables -F -t nat
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp
--dport 80 -j REDIRECT --to-ports 3128
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o
eth1 -j SNAT --to-source 200.200.200.200
如果需要還可以添加一些防火牆規則以增強安全性,具體參考:
http://www.linuxaid.com.cn/engineer/bye2000/doc/iptables1.htm
http://www.linuxaid.com.cn/engineer/bye2000/doc/iptables2.htm
5.iptables的設置
在/etc/rc.d/目錄下用touch命令建立firewall文件,執行chmod u+x firewll以更改文件屬性,編輯/etc/rc.d/rc.local文件,在末尾加上/etc/rc.d/firewall以確保開機時能自動執行該腳本。
firewall文件內容為:
#!/bin/sh
echo "Enabling IP Forwarding..."
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "Starting iptables rules..."
#Refresh all chains
/sbin/iptables -F -t nat
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp
--dport 80 -j REDIRECT --to-ports 3128
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o
eth1 -j SNAT --to-source 200.200.200.200
如果需要還可以添加一些防火牆規則以增強安全性,具體參考:
http://www.linuxaid.com.cn/engineer/bye2000/doc/iptables1.htm
http://www.linuxaid.com.cn/engineer/bye2000/doc/iptables2.htm
http://www.linuxaid.com.cn/engineer/bye2000/doc/iptables1.htm
http://www.linuxaid.com.cn/engineer/bye2000/doc/iptables2.htm