squid透明代理的安裝和實現

環境描述:centos 5.4 雙網路卡,內網地址:192.168.1.1 公網靜態地址 a.b.c.d ,squid版本:squid-3.0.STABLE25

(1)執行如下命令,並將其加入/etc/rc.d/rc.local
/bin/echo “1024 40000” > /proc/sys/net/ipv4/ip_local_port_range
/bin/echo “1” > /proc/sys/net/ipv4/ip_forward
(2)使用如下命令安裝相關軟體包。當然可以用rpm -qa|grep 軟體包名稱 進行檢視是否安裝了下面的軟體
yum -y install imake autoconf automake
(3)安裝squid 3.0
cd /back
tar -zxvf squid-3.0.STABLE25.tar.gz
cd squid-3.0.STABLE25
./configure –prefix=/usr/local/squid –enable-dlmalloc –enable-removal-policies=heap,lru –enable-default-err-language=Simplify_Chinese –enable-cpu-profiling –enable-storeio=ufs,aufs,null –enable-snmp –enable-stacktrace –disable-ident-lookups –with-large-files –enable-linux-netfilter –enable-linux-tproxy –disable-epoll –with-pthreads –enable-delay-pools –enable-icmp –enable-htcp –enable-forw-via-db –enable-cache-digests –disable-optimizations –disable-select –enable-auth-basic –disable-wccp –with-filedescriptors=65536 –enable-arp-acl –enable-icap-client

說明:–enable-linux-tproxy 和–enable-linux-netfilter是實現透明代理的關鍵

在此執行過程中如果出現如下錯誤:
  checking if TPROXY header files are installed… no
> WARNING: Cannot find TPROXY headers, you need to install the
> tproxy package from:
>  – lynx http://www.balabit.com/downloads/tproxy/
> Searching in the above url I can`t find the headers (my kernel is compiled
> with tproxy suport already).
這是缺少一個標頭檔案,名字叫做ip_tproxy.h 我這裡提供了這個標頭檔案。將其複製到這個目錄: /usr/include/linux/netfilter_ipv4/(51cto不允許傳這種.h的檔案 我將副檔名更改為.txt 下載下來記得將下載下來的檔名字更改為 ip_tproxy.h  再複製到指定目錄)
如果configure出錯,我經常是刪除解壓縮的檔案,重新解壓縮配置
rm -rf squid-3.0.STABLE25
tar -zxvf squid-3.0.STABLE25.tar.gz
cd squid-3.0.STABLE25
./configure –prefix=/usr/local/squid –enable-dlmalloc –enable-removal-policies=heap,lru –enable-default-err-language=Simplify_Chinese –enable-cpu-profiling –enable-storeio=ufs,aufs,null –enable-snmp –enable-stacktrace –disable-ident-lookups –with-large-files –enable-linux-netfilter –enable-linux-tproxy –disable-epoll –with-pthreads –enable-delay-pools –enable-icmp –enable-htcp –enable-forw-via-db –enable-cache-digests –disable-optimizations –disable-select –enable-auth-basic –disable-wccp –with-filedescriptors=65536 –enable-arp-acl –enable-icap-client
make&& make install
(4)修改/usr/local/squid/etc/squid.conf ,內容如下
http_port 192.168.1.1:3128 transparent 
dns_nameservers 8.8.8.8 211.99.25.1
visible_hostname 192.168.1.1
cache_dir ufs /var/spool/squid 8000 16 256
cache_mem 400 MB
acl lanclient src 192.168.1.0/24 a.b.c.d/32
http_access allow lanclient
cache_mgr 706501330@qq.com
redirect_children 30
fqdncache_size 1024
cache_swap_low 90
cache_swap_high 95
maximum_object_size 20 MB
minimum_object_size  0 MB
maximum_object_size_in_memory 5 MB
access_log /usr/local/squid/var/logs/access.log
cache_log /usr/local/squid/var/logs/cache.log
cache_store_log /usr/local/squid/var/logs/store.log
ipcache_size 1024
ipcache_low 90
dns_testnames server
ipcache_high 95
cache_effective_user squid
cache_effective_group squid

說明:1.transparent 是透明代理的意思 squid預設埠號為3128
     2.此線路為電信線路 如果是網通線路 建議將dns_nameserver 更改如下,或者填寫自己本地運營商的dns地址 dns_nameservers 8.8.8.8 202.106.0.20
     3.當squid 遇到問題聯絡的管理員郵箱:cache_mgr 706501330@qq.com 更改為自己的郵箱
     4.將上文中的a.b.c.d換成自己公司的公網靜態ip
     5. dns_testnames server 將server換成linux主機名
 
(5)使用如下命令建立squid需要的使用者和組
 useradd squid -s /sbin/nologin
(6) 建立squid日誌檔案及修改相關許可權及所有者
 touch /usr/local/squid/var/logs/cache.log
 chmod 755 /usr/local/squid/var/logs/cache.log
 touch /usr/local/squid/var/logs/access.log
 chmod 755 /usr/local/squid/var/logs/access.log
 touch /usr/local/squid/var/logs/store.log
 chmod 755  /usr/local/squid/var/logs/store.log
 chown -R squid:squid /usr/local/squid/var
 mkdir /var/spool/squid
 chown squid:squid /var/spool/squid
(7)使用如下命令初始化squid快取目錄
/usr/local/squid/sbin/squid -z 建立時會出現下面的文字
[root@localhost etc]# /usr/local/squid/sbin/squid -z
2011/03/29 07:41:54| Creating Swap Directories
2011/03/29 07:41:54| /var/spool/squid exists
2011/03/29 07:41:54| Making directories in /var/spool/squid/00
2011/03/29 07:41:54| Making directories in /var/spool/squid/01
2011/03/29 07:41:54| Making directories in /var/spool/squid/02
2011/03/29 07:41:54| Making directories in /var/spool/squid/03
2011/03/29 07:41:55| Making directories in /var/spool/squid/04
2011/03/29 07:41:55| Making directories in /var/spool/squid/05
2011/03/29 07:41:55| Making directories in /var/spool/squid/06
2011/03/29 07:41:55| Making directories in /var/spool/squid/07
2011/03/29 07:41:55| Making directories in /var/spool/squid/08
2011/03/29 07:41:55| Making directories in /var/spool/squid/09
2011/03/29 07:41:55| Making directories in /var/spool/squid/0A
2011/03/29 07:41:55| Making directories in /var/spool/squid/0B
2011/03/29 07:41:55| Making directories in /var/spool/squid/0C
2011/03/29 07:41:55| Making directories in /var/spool/squid/0D
2011/03/29 07:41:55| Making directories in /var/spool/squid/0E
2011/03/29 07:41:55| Making directories in /var/spool/squid/0F

(8)執行如下命令啟動squid,並將squid新增到開機自啟動
/usr/local/squid/sbin/squid -s
echo “/usr/local/squid/sbin/squid -s ” >>/etc/rc.d/rc.local
要停止squid用 /usr/local/squid/sbin/squid  -k shutdown
 (9)檢視squid狀態
 lsof -i:3128
COMMAND   PID  USER   FD   TYPE  DEVICE SIZE NODE NAME
squid   24855 squid   14u  IPv4  323951       TCP localhost:squid (LISTEN)
##################################################################################
執行了上面的操作只是實現了squid代理功能 ,客戶端需要配置代理伺服器地址和埠號
##################################################################################
(10)使用iptables 做nat,並將所有的80請求重定向到本機的3128 以實現透明代理。
vi /data/myscripts/squid.firewall
指令碼如下

#!/bin/bash
echo “1” > /proc/sys/net/ipv4/ip_forward
echo “starting iptables rules”
/sbin/iptables -t filter -F
/sbin/iptables -t filter -Z
/sbin/iptables -t filter -X
/sbin/iptables -t nat -F
/sbin/iptables -t nat -Z
/sbin/iptables -t nat -X
/sbin/modprobe ip_tables
/sbin/modprobe iptable_nat
/sbin/modprobe iptable_filter
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/iptables -t filter -P INPUT ACCEPT
/sbin/iptables -t filter -P OUTPUT ACCEPT
/sbin/iptables -t filter -P  FORWARD ACCEPT
/sbin/iptables -t nat -A  POSTROUTING -s 192.168.1.0/24 -j SNAT –to-source a.b.c.d
/sbin/iptables -t nat -A  PREROUTING  -s 192.168.1.0/24 -p tcp –dport 80 -j REDIRECT –to-ports  3128

執行指令碼並將其加入到開機自啟動,注意將指令碼中的a.b.c.d換成自己公司的公網靜態ip
sh /data/myscripts/squid.firewall
echo “/data/myscripts/squid.firewall” >>/etc/rc.d/rc.local
#######################################################################################
至此squid+iptables已經實現了透明代理
#######################################################################################
(11)測試

客戶機將閘道器指向192.168.1.1 填寫上dns,測試能否上網。ssh登陸到192.168.1.1

tail -f /usr/local/squid/var/logs/access.log 看日誌是否有記錄測試機的上網記錄 如果有就搭建成功了,恭喜!

附上常用除錯方法以及遇到的問題
 
1、在開啟squid之前,你應該驗證其配置檔案是否正確。執行如下命令即可:

# /usr/local/squid/sbin/squid -k parse

2011/05/18 11:22:12| Processing Configuration File: /usr/local/squid/etc/squid.conf (depth 0)
2011/05/18 11:22:12| Starting Authentication on port 192.168.1.2:14348
2011/05/18 11:22:12| Disabling Authentication on port 192.168.1.2:14348 (interception enabled)
沒有提示錯誤,代表配置正確

2、重配置執行中的squid程式

在你瞭解了更多關於squid的知識後,你會發現對squid.conf檔案做了許多改動。為了讓新設定生效,你可以關閉和重啟squid,或者在squid執行時,重配置它。

重配置執行中的squid最好的方法是使用squid -k reconfigure命令:

# /usr/local/squid/sbin/squid -k reconfigure

3、上線的squid有同事訪問無法訪問wenku.baidu.com 經測試顯示該頁無法顯示。
 解決辦法 更改了dns  dns_nameservers 8.8.8.8 211.99.25.1