一、squid简介
当用户使用squid代理来访问web页面时,首先squid服务器会检查自己的cache查看是否有用户访问的web页面,如果有则squid服务器直接从cache中取出页面发送给用户的客户机,如果没有则squid服务器会代理客户机访问web页面,访问成功后将访问到的web页面发送给客户机并将web页面缓存到自己的服务器中。(注意:当squid代理服务器中cache中有客户机访问的页面时,squid也会去访问客户机访问的web页面去检查该页面是否过期。)
如下图所示:
1、代理的基本类型:
1)传统代理
传统代理也叫标准代理或普通代理,客户机如果要访问web服务器或QQ等应用程序必须在软件中设置代理服务器的IP地址和端口信息才能成功访问。对于域名的解析请求(DNS)也会发送给指定的代理服务器。(适用于internet上,需明确指定服务端IP和端口)
2)透明代理
与传统代理服务的功能基本相同,区别于传统服务器需要设置代理IP和端口信息,而透明代理是使用默认路由、防火墙策略或web访问重定向来实现的,则不需要用户有任何设置。对于用户来说透明代理是“透明”的。使用此代理时,对于域名的解析请求(DNS)由客户机本身设置的DNS地址来解析的。(适用于共享网关上,不需要明确指定服务端)
二、Centos6.5中安装与配置squid服务
代理软件squid版本:squid-3.4.6.tar.gz
代理服务器IP:
eth1:192.168.0.103 ##连接外网的IP地址(可以上网)
eth2:192.168.1.1 ##连接内网的IP地址,就是作为内网的网关(不能上网)
客户机IP地址:192.168.1.10
网关:192.168.1.1
1、使用源代码方式安装squid代理服务和基本配置
1)、解压squid软件包
tar zxf squid-3.4.6.tar.gz -C /usr/src ##将squid软件包解压到/usr/src目录下
cd /usr/src/squid-3.4.6 ##切换到squid软件包解压到的目录来进行一下操作
2)、configure配置
./configure --prefix=/usr/local/squid --sysconfdir=/etc --enable-arp-acl --enable-linux-netfilter --enable-linux-tproxy --enable-async-io=100 --enable-err-language="Simplify_Chinese" --enable-underscore --enable-poll --enable-gnuregex
configure的一些选项:
--prefix=/usr/local/squid ##指定安装目录
--sysconfdir=/etc ##单独指定配置文件的存放目录
--enable-arp-acl ##可以在规则中设置直接通过客户端MAC进行管理,防止客户端使用IP欺骗
--enable-linux-netfilter ##使用内核过滤(和iptables一起工作)
--enable-linux-tproxy ##支持透明模式
--enable-async-io=100 ##异步I/O,替身存储性能,相当于--enable-pthreads --enable- ##storeio=ufs,aufs --with-pthreads --with-aufs-thread=值
--enable-err-language="Simplify_Chinese" ##错误信息的显示语言
--enable-underscore ##允许URL中有下划线
--enable-poll ##使用Poll()模式,替身性能(并行)
--enable-gnuregex ##使用GNU正则表达式
3)、编译;编译安装
make && make install
验证安装是否成功:
ls /usr/local/squid/
bin libexec sbin share var
4)、安装完成后、创建链接文件、创建用户和组
ln -s /usr/local/squid/sbin/* /usr/local/sbin/ ##优化执行命令(可以再PATH路径中搜索到)
useradd -M -s /sbin/nologin squid ##创建运行squid服务的用户
chown -R squid:squid /usr/local/squid/var/ ##给squid用户有权限执行
5)、添加squid服务
vi /etc/init.d/squid ##创建并编写squid服务脚本
#!/bin/bash
# chkconfig: 2345 90 25
# config: /etc/squid.conf
# pidfile: /usr/local/squid/var/run/squid.pid
# Description: Squid - Internet Object Cache.
PID="/usr/local/squid/var/run/squid.pid"
CONF="/etc/squid.conf"
CMD="/usr/local/squid/sbin/squid"
case "$1" in
start)
netstat -anpt |grep squid &>/dev/null
if [ $? -eq 0 ];then
echo "squid is running"
else
echo "正在启动squid..."
$CMD
fi
;;
stop)
$CMD -k kill &>/dev/null
rm -rf $PID &>/dev/null
;;
status)
[ -f $PID ] &>/dev/null
if [ $? -eq 0 ];then
netstat -anpt |grep squid
else
echo "squid is not running."
fi
;;
restart)
$0 stop &>/dev/null
echo "正在关闭squid..."
$0 start &>/dev/null
echo "正在启动squid..."
;;
reload)
$CMD -k reconfigure
;;
check)
$CMD -k parse
;;
*)
echo "用法: $0 {start | stop | restart | reload | check | status}"
;;
esac
:wq ##在末行模式中输入代表保存退出
chmod +x /etc/init.d/squid ##给squid服务脚本加上执行权限
chkconfig --add squid ##添加squid为系统服务
chkconfig squid on ##设置squid服务在2345运行级别中开机自启
6)、修改/etc/squid.conf文件并初始化和启动squid服务
vi /etc/squid.conf ##在最后添加如下行
visible_hostname centos ##设置安装squid的主机名
cache_effective_user squid ##这一项指定squid的程序用户,用来设置初始化,运行时缓存的账号,否则启动不成功
cache_effective_group squid ##默认为cache_effective_user指定账号的基本组
:wq ##在末行模式中输入代表保存退出
squid -k parse ##检测/etc/squid.conf中语法是否正确
squid -z ##初始化缓存目录
squid ##启动squid服务命令(把squid添加为系统服务后可以使用service命令来管理)
netstat -utpln |grep 3128 ##查看squid是否启动并监听
2、配置传统模式的代理
1)、设置/etc/squid.conf文件
vi /etc/squid.conf
http_port 3128 ##此行默认配置中已经存在,如不存在则添加此行
http_access allow all ##在http_access deny all前添加此行
reply_body_max_size 10 MB ##允许下载的最大文件大小为10MB(在结尾添加)
2)、设置iptables防火墙和重新启动squid服务
iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
[root@centos logs]# iptables -L -n ##查看iptables防火墙中filter表中的规则
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3128
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@centos logs]#
重新启动squid服务并查看监听状态:
[root@centos ~]# service squid restart
正在关闭squid...
正在启动squid...
[root@centos ~]#
[root@centos ~]# netstat -utpln |grep 3128
tcp 0 0 :::3128 :::* LISTEN 5361/(squid-1)
[root@centos ~]#
3)、使用windows7客户端访问测试
使用客户机访问https://www.baidu.com和mirrors.aliyun.com网站测试:
查看access.log日志的变化:
使用squid做传统代理完成!!!
3、配置透明代理(在配置了squid传统代理基础上做配置)
注意:记着要把客户机中设置的代理取消,就是不适用任何代理来访问
centos这台服务器承担两个角色:①网关服务器 ②squid代理服务器
1)设置iptables防火墙配置SNAT使局域网可以访问internet(这里指192.168.1.0/24能够不使用代理服务器访问DNS,FTP,MAIL等;当局域网PC访问internet上的web站点(80端口)时自动使用代理,当然要进行以下的配置)
[root@centos ~]# iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -p tcp ! --dport 80 -j SNAT --to-source 192.168.0.103 ##配置SNAT转换除TCP的80端口外的所有端口都转
[root@centos ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -p udp --dport 53 -j SNAT --to-source 192.168.0.103 ##允许DNS请求转发
[root@centos ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp dpt:!80 to:192.168.0.103
SNAT udp -- 192.168.1.0/24 0.0.0.0/0 udp dpt:53 to:192.168.0.103
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@centos ~]#
在网关上开启路由功能并添加默认路由:
vi /etc/sysctl.conf ##修改此文件的如下行的最后一位为1
net.ipv4.ip_forward = 1 ##开启ipv4路由功能
:wq
sysctl -p ##重新载入/etc/sysctl.conf的配置
route add default gw 192.168.0.1 ##添加一条默认路由
使用客户端访问测试:
2)、修改/etc/squid.conf文件使其squid执行透明代理
vi /etc/squid.conf
http_port 192.168.1.1:3128 transparent ##修改http_port 3128行(注意http_port 192.168.1.1:3128 transparent和http_port 3128不能同时存在)
:wq
service squid restart
netstat -utpln |grep 3128 ##查看squid服务的端口是否监听
3)、当局域网PC的internet中的web站点(80)端口时,自动使用代理
[root@centos ~]# iptables -t nat -I PREROUTING -i eth2 -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to 3128 ##将80端口映射到目标端口3128上
[root@centos ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
REDIRECT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp dpt:80 redir ports 3128
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp dpt:!80 to:192.168.0.103
SNAT udp -- 192.168.1.0/24 0.0.0.0/0 udp dpt:53 to:192.168.0.103
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@centos ~]#
4)、使用客户机访问测试
5)、针对局域网PC的internet中的web站点(配置ACL),要求如下
①:禁止下载扩展名为.3gp,.mp4,.f4v,.mkv,.rmvb,.avi;
②:超过4MB大小的文件不进行缓存,禁止下载超过100MB的文件;
③:设置网站黑名单,进行访问位于.qq.com,.msn.com域下的wen站点;
④:允许在正常上班时间(周一至周五的8:30~17:30)使用代理服务;
⑤:默认策略设为禁止任何客户机使用代理服务;
①:
修改/etc/squid.conf文件:
vi /etc/squid.conf ##以下两行注意尽量添加在比其他http_access前(因为拒绝尽量添加再最前面,这样可以节省资源也可以防止有其他allow先匹配)
acl DOWNLOAD urlpath_regex -i \.3gp$ \.mp4$ \.f4v$ \.mkv$ \.rmvb$ \.avi$ ## 以.3gp,.mp4,.mkv,.rmvb,.avi结尾的url路径
http_access deny DOWNLOAD ##调用上面一条名为DOWNLOAD的ACL并设为deny
:wq
②:
vi /etc/squid.conf
maximum_object_size_in_memory 4 MB ##操作4MB大小的文件不进行缓存
reply_body_max_size 100 MB ##禁止下载操作100MB的文件
:wq
③:
vi /etc/squid.conf ##以下两行也是尽量在其他http_access前添加
acl DOMAIN dstdomain .qq.com .msn.com ##设置目标域.qq.com和.msn.com
http_access deny DOMAIN ##调用上一条ACL名为DOMAIN并设为deny
:wq
④:
vi /etc/squid.conf
acl TIME time MTWHF 8:30-17:30 ##设置星期一至星期5的8:30-17:30的时间段
http_access deny !TIME ##除了以上设置的时间段其他时间禁止使用代理(!表示取反)
⑤:
vi /etc/squid.conf ##以下一行添加在http_access中是最后一行
http_access deny all ##设置默认策略为禁止全部客户机使用代理服务器
:wq
service squid restart
netstat -utpln |grep 3128
6)、使用客户机访问测试
①:
②:在192.168.0.0/24这个网段上搭建一台http服务(在squid服务的外网卡网段上搭建),这里就不在演示;
[root@Wu-Centos-2 html]# pwd
/var/www/html ##当前路径(http服务的网页根目录)
[root@Wu-Centos-2 html]# dd if=/dev/zero of=./file1.tar bs=1M count=20 ##在网页根目录中生成一个20MB的名为fitl1.tar的文件
记录了20+0 的读入
记录了20+0 的写出
20971520字节(21 MB)已复制,0.108024 秒,194 MB/秒
[root@Wu-Centos-2 html]# dd if=/dev/zero of=./file1.tar bs=1M count=200 ##在网页根目录中生成一个200MB的名为file2.tar的文件
记录了200+0 的读入
记录了200+0 的写出
209715200字节(210 MB)已复制,24.6213 秒,8.5 MB/秒
[root@Wu-Centos-2 html]# du -sh file1.tar file2.tar ##查看两个文件的大小
20M file1.tar
200M file2.tar
[root@Wu-Centos-2 html]#
使用浏览器下载测试:
③:访问qq.com和msn.com测试
④和⑤在这里不太好演示,就不演示了
透明模式的代理就配置完成了!!!