歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> 基於Linux2.4內核的透明代理解決方案之二

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

日期:2017/2/27 9:48:06   编辑:更多Linux
  摘要 該文討論了如何在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



Copyright © Linux教程網 All Rights Reserved