歡迎您光臨本站 註冊首頁

基於Linux2.4內核的透明代理解決方案

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  摘要:該文討論了如何在Linux2.4環境下如何通過iptables和squid實現透明代理。

硬體環境:聯想奔月 雙網卡

軟體環境:kernel 2.4.7 squid-2.4.STABLE1

一、什麼是代理伺服器?

所謂代理伺服器是指代表內部私有網中的客戶連接互聯網www資源的外部伺服器的程序。客戶與代理伺服器對話,它們接收客戶請求,然後連接真實的伺服器,請求得到數據並將響應數據返回給客戶。代理伺服器發揮了中間轉接作用。

在代理方式下,私有網路的數據包從來不能直接進入互聯網,而是需要經過代理的處理。同樣,外部網的數據也不能直接進入私有網,而是要經過代理處理以後才能到達私有網,因此在代理上就可以進行訪問控制,地址轉換等功能。目前,代理伺服器軟體有很多,如Netscape Suit Proxy,MS Proxy,Wingate,squid等。這些代理伺服器不僅能起到防火牆的作用,而且還可以加速區域網用戶對INTERNET的訪問,因為代理伺服器有一個大的緩衝器,將每次瀏覽的網頁都保存起來,在下一次訪問該頁時就直接從緩衝器里調出,而無需再次訪問原始伺服器。

二、什麼是透明代理?

透明代理技術中的透明是指客戶端感覺不到代理的存在,不需要在瀏覽器中設置任何代理,客戶只需要設置預設網關,客戶的訪問外部網路的數據包被發送到預設網關,而這時預設網關運行有一個代理伺服器,數據實際上被被重定向到代理伺服器的代理埠(如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, 但是, 它實際是在與透明代理伺服器對話。

這就是透明代理的操作流程。

三、內核編譯

一般來講,透明代理所在機器往往是帶動整個區域網聯入互聯網的入口,因此該機器往往需要配置防火牆規則以對內部網路進行防護。因此在編譯內核時也許要考慮將防火牆支持選項編譯進去。一般來說需要在使用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即可。

四、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伺服器。

五、iptables的設置

在/etc/rc.d/目錄下用touch命令建立firewall文件,執行chmod u+x firewll以更改文件屬性,編輯/etc/rc.d/rc.local文件,在末尾加上/etc/rc.d/firewall以確保開機時能自動執行該腳本。

firewall文件內容為:

#!/bin/sh

echo "Starting iptables rules..."

#Refresh all chains

/sbin/iptables -F

iptables -t -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128

iptables -t -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


[火星人 ] 基於Linux2.4內核的透明代理解決方案已經有591次圍觀

http://coctec.com/docs/net/show-post-68500.html