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 [email protected]
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 [email protected] 更改为自己的邮箱
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