用squid+iptables实现http代理

来源:互联网 发布:人工智能简史 编辑:程序博客网 时间:2024/05/16 11:55

用squid+iptables实现http代理

分类: Apache 745人阅读 评论(0) 收藏 举报


squid简介
    squid是一缓存internet数据饿软件,它接受用户的瞎子申请,并自动处理所下载的数据
也就是说,当一个用户要下载一个主页时,它向squid发吹个申请,要qsuid替他下载,然后
squid链接所申请网站给in并请求该主页,接着把该主页传给用户的同时保留一个备份
当别的用户申请同样的页面时,squid把保留的备份立即传给用户,使用户觉得速度相当快
    对于Web用户来说,Squid是一个高性能的代理缓存服务器,可以加快内部网浏览Internet的速度,
提高客户机的访问命中率。Squid不仅支持HTTP协议,还支持FTP、gopher、SSL和WAIS等协议。
和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。
  Squid将数据元缓存在内存中,同时也缓存DNS查寻的结果,除此之外,它还支持非模块化的DNS查询,
对失败的请求进行消极缓存。Squid支持SSL,支持访问控制。由于使用了ICP,Squid能够实现重叠的代理
阵列,从而最大限度的节约带宽
  Squid由一个主要的服务程序Squid,一个DNS查询程序dnsserver,几个重写请求和执行认证的程序,
以及几个管理工具组成。当Squid启动以后,它可以派生出指定数目的dnsserver进程,而每一个dnsserver
进程都可以执行单独的DNS查询,这样一来就大大减少了服务器等待DNS查询的时间。
---------------------------------------------------------------------------------------------------------------------------

configure选项
--prefix=  安装位置   默认的是/usr/local/squid
--localstatedir =DIR        更改var的安装目录,默认的是/usr/local/squid/var
--sysconfdir =DIR           更改etc的安装位置,默认的是/usr/local/squid/etc

--enable-dlmalloc[=LIB]
在一些系统上,内建的内存分配机制(malloc)在使用squid时表现不尽人意。
使用--enable-dlmalloc选项将squid源代码包中的dlmalloc包编译和链接进来。
假如你的系统中已安装dlmalloc,你能使用=LIB参数指定库的路径

--enable-gnuregex
在访问控制列表和其他配置指令里,squid使用正则表达式作为匹配机制。
GNU的正则表达式库包含在squid的源代码包里;它可以在没有内建正则表达式的操作系统中使用
如果添加该选项,表示强制使用GNU正则表达式

--enable-async-io[=N_THREADS]
异步I/O是squid技术之一,用以提升存储性能。
该代码仅仅工作在linux和solaris系统中。
它等同于: 
--with-aufs-threads=N_THREADS    
--with-pthreads   
--enable-storeio=ufs,aufs

--enable-storeio=LIST
Squid支持大量的不同存储模块。
在squid-2.5中,支持ufs,aufs,diskd,和null模块。
例如: ./configure --enable-storeio=afus,diskd,ufs

--with-aufs-threads=N_THREAD
指定aufs存储机制使用的线程数量
aufs存储模块是squid中唯一需要使用线程的部分
squid默认根据缓存目录的数量,自动计算需要使用多少线程。


--enable-removal-policies=LIST
排除策略是squid需要腾出空间给新的cache目标时,用以排除旧目标的机制
LRU是默认的,它以双链表数据结构执行。GDS和LFU使用堆栈的数据结构。
最少近期使用(LRU),贪婪对偶大小(GDS),最少经常使用(LFU)
--enable-removal-policies=heap    --enable-removal-policies=heap,lru

--enable-icmp
squid能利用ICMP消息来确定回环时间尺寸,非常象ping程序

--enable-useragent-log
该选项激活来自客户请求的HTTP用户代理头的日志

--enable-snmp
简单网络管理协议(SNMP)是监视网络设备和服务器的流行方法。
该选项导致编译过程去编译所有的SNMP相关的代码

--enable-cachemgr -hostname[=hostname]
cachemgr是一个CGI程序,你能使用它来管理查询squid。
默认cachemgr的hostname值是空的,但你能使用该选项来指定一个默认值。
例如:
./configure --enable-cachemgr-hostname=mycache.myorg.net

--enable-htcp
HTCP是超文本缓存协议--类似于ICP的内部缓存协议

--enable-ssl
使用该选项赋予squid终止SSL/TLS连接的能力。注意这仅仅工作在web加速器中用以加速请求

--with-openssl[=DIR]
假如必要,你使用该选项来告诉squid到哪里找到OpenSSL库或头文件。
假如它们不在默认位置,在该选项后指定它们的父路径
例如:
% ./configure --enable-ssl --with-ssl= /usr/lib/openssl

    
--enable-poll
unix提供两个相似的函数用以在I/O事件里扫描开放文件描述符:select()和poll()./configure脚本通常能非常好的计算出何时使用poll()来代替select().假如你想强制使用poll(),那么指定该选项。
--desable-poll
类似的,如果不使用poll(),那么指定该选项。

--enable-linux-netfilter
Netfilter是linux 2.4系列内核的包过滤器名字。
假如你想在linux2.4或以后的版本中使用HTTP拦截功能,那么激活该选项。

--enable-auth[=LIST]
假如你使用不带参数的--enable-auth选项,编译进程将增加对所有验证机制的支持
假如你忽略该选项,squid仅仅支持basic验证。
你能选择下列机制的任意组合:basic,digest,ntlm

--disable-internal-dns
squid源代码包含两个不同的DNS解决方案,叫做“内部的”和“外部的”
内部查询是默认的,但某些人可能要使用外部技术
内部查询使用 squid自己的DNS协议执行工具。也就是说,squid产生未完成的DNS查询并且将它们发送到一个解析器

---------------------------------------------------------------------------------------------------------------------------

实现目的:
把客户端web请求重定向到代理服务器的代理端口(3128),结合iptables实现访问国外网站的需求
---------------------------------------------------------------------------------------------------------------------------

硬件要求:
Squid对硬件的要求是内存一定要大,不应小于128M,硬盘转速越快越好,最好使用服务器专用SCSI 硬盘,处理器要求不高,400MH以上既可

---------------------------------------------------------------------------------------------------------------------------

实验环境:
client:       ClientIp    (windows)
squid:   
                 eth1: “SquidServerIP”   (linux)
  
 
--------------------------------------------------------------------------------------------------------
安装准备:
gcc编译器  perl   awk    make

---------------------------------------------------------------------------------------------------------------------------


获取软件包:
http://www.squid-cache.org/Versions/v3/3.1/
squid-3.1.15.tar.gz

---------------------------------------------------------------------------------------------------------------------------
安装:
tar zxf squid-3.1.15.tar.gz
cd squid-3.1.15
 ./configure --prefix=/usr/local/squid --enable-dlmalloc --enable-icmp --enable-useragent-log --enable-snmp --enable-cachemgr  --enable-htcp -enable-ssl --enable-linux-netfilter --enable-auth
make
make install
make install-pinger

---------------------------------------------------------------------------------------------------------------------------

注释:
【在./configure检查完该编译器后,它查找头文件,库文件和函数的长列表】
【./configure的最终任务是创造Makefiles和其他文件,这些文件基于squid从你系统中了解到的知识】
【--enable-icmp选项,激活了squid的ICMP衡量功能,那么必须安装pinger程序。】
【pinger程序必须以超级用户权限安装,因为仅仅允许root来发送和接受ICMP消息】

提示:
【1)如果squid在高负载下,需要大量的内核资源,那么在编译之前需要增加这些限制】
【2)文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。】
   当squid用完所有的文件描述符后,它不能接收用户新的连接。也就是说,用完文件描述符导致拒绝服务。当squid用完所有的文件描述符后,它不能接收用户新的连接。也就是说,用完文件描述符导致拒绝服务。
   当squid发现文件描述符短缺时,它会发布警告。一般为1024个。
   在运行./configure之前一定要检查文件描述符的限制
   [root@CentOS squid]# ulimit -n
   65536
   如果limit,ulimit的值少于1024,必须在编译之前增加这个限制
   需要编辑内核配置文件:
   FreeBSD上    option   MAXFILES=
   Linux上
        vi /usr/include/bits/types.h
        define _ _FD_SETSIZE   8192
        增加内核文件描述符:
        echo 8192 > /proc/sys/fs/file-max
        增加进程文件描述符的限制
        ulimit -Hn 8192


---------------------------------------------------------------------------------------------------------------------------

安装完以后检查/usr/local/squid目录:
bin  etc  include  lib  libexec  sbin  share  var

./bin/squidclient
【squidclient是个简单的HTTP客户端程序,你能用它来测试squid。它也有一些特殊功能,用以对运行的squid进程发起管理请求。】

sbin/squid
【Squid的主程序】

[root@CentOS squid]# ls libexec/
cachemgr.cgi      getpwname_auth    pam_auth     smb_auth.sh        squid_unix_group
digest_edir_auth  ip_user_check     pinger       squid_db_auth      unlinkd
digest_ldap_auth  msnt_auth         pop3.pl      squid_ldap_auth    wbinfo_group.pl
digest_pw_auth    ncsa_auth         sasl_auth    squid_ldap_group   yp_auth
diskd             no_check.pl       smb_auth     squid_radius_auth
fakeauth_auth     ntlm_smb_lm_auth  smb_auth.pl  squid_session
【libexec目录传统的包含了辅助程序】
【libexec/unlinkd 是一个辅助程序,它从cache目录里删除文件】
【libexec/cachemgr.cgi 是Squid管理功能的CGI接口,为了使用它,你需要拷贝该程序到你的apache服务器的cgi-bin目录】
【libexec/pinger 你指定了--enable-icmp,你才能看到它】


[root@CentOS squid]# ls etc/
cachemgr.conf          errorpage.css.default  msntauth.conf          squid.conf.default
cachemgr.conf.default  mime.conf              msntauth.conf.default  squid.conf.documented
errorpage.css          mime.conf.default      squid.conf
【etc目录包含squid的配置文件。】
【etc/squid.conf 这是squid的主要配置文件】
【etc/squid.conf.default 这是从源代码目录中拷贝过来的默认配置文件】
【etc/mime.conf 该文件是一个关联文件名扩展到MIME类型的表,该文件告诉squid对从FTP和Gopher服务器获取的数据使用何种MIME类型】
【etc/mime.conf.default 这是从源代码目录里拷贝过来的默认mime.conf文件】


[root@CentOS squid]# ls share/
errors  icons  man  mib.txt
【share目录通常包括squid的只读数据文件】
【share/mib.txt 这是squid的SNMP管理信息基础(MIB)文件,squid自身不使用该文件,然而,你的SNMP客户端软件snmpget和多路由走向图(MRTG))需要该文件,用以理解来自squid的SNMP对象可用】
【share/icons 目录包含大量的小图标文件】
【share/errors目录包含了squid显示给用户看的错误消息模板】


[root@CentOS squid]# ls var/
cache  logs  run
【var目录包含了不是很重要的和经常变化的文件】
【var/logs目录是squid不同日志文件的默认位置】
【var/cache 假如你不在squid.conf文件里指定,这是默认的缓存目录(cache_dir)】

---------------------------------------------------------------------------------------------------------------------------

为了安全起见,我建议创建squid用户和组。该用户和组的组合,必须对大部分squid相关的文件和目录有读和写的权限。
假如不止一个人拥有对squid的管理权限,你可以将他们加到squid组里
[root@CentOS software]# useradd squid
[root@CentOS software]# passwd squid
[root@CentOS software]# chown -R squid /usr/local/squid/
[root@CentOS software]# su - squid
[squid@CentOS ~]$ /usr/local/squid/sbin/squid

---------------------------------------------------------------------------------------------------------------------------

【http_port指令告诉squid在哪个端口侦听HTTP请求。默认端口是3128】
【可以单使用一个端口,也可以是ip+port 如果需要配置透明代理需要加transparent】
http_port 3128
http_port 3128 80 8080 81   
http_port SquidServerIp:3128 transparent

【日志路径:默认的路径在/usr/local/squid/var/logs】
cache_log  NEWDIR
cache_access_log  NEWDIR
cache_store_log  NEWDIR

cache_dir ufs /usr/local/squid/var/cache 100 16 256
【缓存目录的位置 100M 16个一级目录  256个二级目录】
【你设置的文件目录一定要存在,不存在就要自己建立 】

【访问控制】
【squid默认的配置文件拒绝每一个客户请求。在任何人能使用代理之前,你必须在squid.conf文件里加入附加的访问控制规则】
src类型匹配客户IP地址,squid会针对客户HTTP请求检查http_access规则。这样,你需要增加两行:
acl Network src ClientIp
http_access allow Network

---------------------------------------------------------------------------------------------------------------------------

配置文件内容如下:
[root@CentOS etc]# cat squid.conf |sed '/^$/d'|grep -v '^#'
#额外使用内存量,一般为实际内存的1/3
cache_mem 8 MB

#最低缓存百分比
cache_swap_low 90

#最高缓存百分比
cache_swap_high 95

#单个文件最大缓存大小,超过这个大小将不缓存
maximum_object_size 4096 KB

#在内存中单个文件最大缓存大小,超过这个大小将不缓存
maximum_object_size_in_memory 8 KB

#进程文件存放位置
pid_filename /usr/local/squid/var/logs/squid.pid

#当squid忽然挂掉或者出现什么故障的时候,将squid在内存中得资料写到硬盘中
coredump_dir /usr/local/squid/var/cache

#访问控制
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7       # RFC 4193 local private network range
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines
acl SSL_ports port 443
acl Safe_ports port 80  # http
acl Safe_ports port 21  # ftp
acl Safe_ports port 443  # https
acl Safe_ports port 70  # gopher
acl Safe_ports port 210  # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280  # http-mgmt
acl Safe_ports port 488  # gss-http
acl Safe_ports port 591  # filemaker
acl Safe_ports port 777  # multiling http
acl CONNECT method CONNECT
acl Network src 192.168.31.0/24

#允许Network组里面的所有IP访问
http_access allow Network
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localnet
http_access allow localhost
http_access deny all
http_port SquidServerIP:3128 transparent

#cache更新时间设置
#如果网址是ftp开头的话,那么在一天(1440分钟后),如果proxy再次取用这个档案,则cache内的数据会被更新
refresh_pattern ^ftp:  1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern .  0 20% 4320

#运行squid时的用户
cache_effective_user squid
#运行squid时的组
cache_effective_group squid

#管理员信箱
cache_mgr squid@web-cache.net

#代理服务器的名称
visible_hostname CentOS

#连接到其他机器的最大尝试时间
connect_timeout 1 minute

#返回超时
request_timeout 2 minutes

#关闭此选项在访问某些论坛时显示的IP是unknown,如果打开则显示的是你client的内网IP
forwarded_for off

---------------------------------------------------------------------------------------------------------------------------

squid命令用法:
Usage: squid [-cdhvzCFNRVYX] [-s | -l facility] [-f config-file] [-[au] port] [-k signal]
       -a port   Specify HTTP port number (default: 3128).
       -d level  Write debugging to stderr also.
       -f file   Use given config-file instead of
                 /usr/local/squid/etc/squid.conf
       -h        Print help message.
       -k reconfigure|rotate|shutdown|interrupt|kill|debug|check|parse
                 Parse configuration file, then send signal to 
                 running copy (except -k parse) and exit.
       -s | -l facility
                 Enable logging to syslog.
       -u port   Specify ICP port number (default: 3130), disable with 0.
       -v        Print version.
       -z        Create swap directories
       -C        Do not catch fatal signals.
       -D        OBSOLETE. Scheduled for removal.
       -F        Don't serve any requests until store is rebuilt.
       -N        No daemon mode.
       -R        Do not set REUSEADDR on port.
       -S        Double-check swap during rebuild.
       -X        Force full debugging.
       -Y        Only return UDP_HIT or UDP_MISS_NOFETCH during fast reload.

---------------------------------------------------------------------------------------------------------------------------
    
#检查配置文件的语法
 /usr/local/squid/sbin/squid -k parse

#创建缓存目录(一级和二级)
 /usr/local/squid/sbin/squid -z

#查看缓存目录
[squid@CentOS var]$ cd cache/
[squid@CentOS cache]$ ls
00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

以守护进程的方式启动
 /usr/local/squid/sbin/squid -s

查看进程
[squid@CentOS run]$ cat squid.pid 
18776
[squid@CentOS logs]$ ps aux |grep squid
---------------------------------------------------------------------------------------------------------------------------

查看启动日志
2011/10/07 16:16:14| Creating Swap Directories
2011/10/07 16:16:14| /usr/local/squid/var/cache exists
2011/10/07 16:16:14| Making directories in /usr/local/squid/var/cache/00
2011/10/07 16:16:14| Making directories in /usr/local/squid/var/cache/01
2011/10/07 16:16:14| Making directories in /usr/local/squid/var/cache/02
2011/10/07 16:16:14| Making directories in /usr/local/squid/var/cache/03
2011/10/07 16:16:14| Making directories in /usr/local/squid/var/cache/04
2011/10/07 16:16:14| Making directories in /usr/local/squid/var/cache/05
2011/10/07 16:16:14| Making directories in /usr/local/squid/var/cache/06
2011/10/07 16:16:14| Making directories in /usr/local/squid/var/cache/07
2011/10/07 16:16:14| Making directories in /usr/local/squid/var/cache/08
2011/10/07 16:16:14| Making directories in /usr/local/squid/var/cache/09
2011/10/07 16:16:14| Making directories in /usr/local/squid/var/cache/0A
2011/10/07 16:16:14| Making directories in /usr/local/squid/var/cache/0B
2011/10/07 16:16:14| Making directories in /usr/local/squid/var/cache/0C
2011/10/07 16:16:14| Making directories in /usr/local/squid/var/cache/0D
2011/10/07 16:16:14| Making directories in /usr/local/squid/var/cache/0E
2011/10/07 16:16:14| Making directories in /usr/local/squid/var/cache/0F
2011/10/07 16:20:59| Starting Squid Cache version 3.1.15 for x86_64-unknown-linux-gnu...
2011/10/07 16:20:59| Process ID 30222
2011/10/07 16:20:59| With 65536 file descriptors available
2011/10/07 16:20:59| Initializing IP Cache...
2011/10/07 16:20:59| DNS Socket created at 0.0.0.0, FD 7
2011/10/07 16:20:59| Adding domain PCStars.com from /etc/resolv.conf
2011/10/07 16:20:59| Adding nameserver 202.106.0.20 from /etc/resolv.conf
2011/10/07 16:20:59| Adding nameserver 8.8.4.4 from /etc/resolv.conf
2011/10/07 16:20:59| User-Agent logging is disabled.
2011/10/07 16:20:59| Unlinkd pipe opened on FD 12
2011/10/07 16:20:59| Store logging disabled
2011/10/07 16:20:59| Swap maxSize 102400 + 8192 KB, estimated 8507 objects
2011/10/07 16:20:59| Target number of buckets: 425
2011/10/07 16:20:59| Using 8192 Store buckets
2011/10/07 16:20:59| Max Mem  size: 8192 KB
2011/10/07 16:20:59| Max Swap size: 102400 KB
2011/10/07 16:20:59| Rebuilding storage in /usr/local/squid/var/cache (DIRTY)
2011/10/07 16:20:59| Using Least Load store dir selection
2011/10/07 16:20:59| Set Current Directory to /usr/local/squid/var/cache
2011/10/07 16:20:59| Loaded Icons.
2011/10/07 16:20:59| Accepting  intercepted HTTP connections at 211.100.97.245:3128, FD 14.
2011/10/07 16:20:59| HTCP Disabled.
2011/10/07 16:20:59| Squid plugin modules loaded: 0
2011/10/07 16:20:59| Ready to serve requests.
2011/10/07 16:20:59| Done scanning /usr/local/squid/var/cache swaplog (0 entries)
2011/10/07 16:20:59| Finished rebuilding storage from disk.
2011/10/07 16:20:59|         0 Entries scanned
2011/10/07 16:20:59|         0 Invalid entries.
2011/10/07 16:20:59|         0 With invalid flags.
2011/10/07 16:20:59|         0 Objects loaded.
2011/10/07 16:20:59|         0 Objects expired.
2011/10/07 16:20:59|         0 Objects cancelled.
2011/10/07 16:20:59|         0 Duplicate URLs purged.
2011/10/07 16:20:59|         0 Swapfile clashes avoided.
2011/10/07 16:20:59|   Took 0.06 seconds (  0.00 objects/sec).
2011/10/07 16:20:59| Beginning Validation Procedure
2011/10/07 16:20:59|   Completed Validation Procedure
2011/10/07 16:20:59|   Validated 25 Entries
2011/10/07 16:20:59|   store_swap_size = 0
2011/10/07 16:21:00| storeLateRelease: released 0 objects


---------------------------------------------------------------------------------------------------------------------------

设置iptables支持透明代理

检查模块情况
模块 iptable_nat
[root@CentOS etc]# lsmod |grep iptable_nat
iptable_nat            40517  1 
ip_nat                 52973  2 ipt_REDIRECT,iptable_nat
ip_conntrack           91621  4 ip_conntrack_netbios_ns,xt_state,iptable_nat,ip_nat
ip_tables              55457  2 iptable_filter,iptable_nat
x_tables               50505  7 xt_state,ipt_REDIRECT,iptable_nat,ip_tables,ipt_REJECT,xt_tcpudp,ip6_tables

模块ip_conntrack
[root@CentOS etc]# lsmod |grep ip_conntrack
ip_conntrack_netbios_ns    36033  0 
ip_conntrack           91621  4 ip_conntrack_netbios_ns,xt_state,iptable_nat,ip_nat
nfnetlink              40457  2 ip_nat,ip_conntrack

模块 ip_conntrack_ftp
[root@CentOS etc]# lsmod |grep ip_conntrack_ftp
[root@CentOS etc]# /sbin/modprobe !$
/sbin/modprobe ip_conntrack_ftp

设置转发
echo 1 > /proc/sys/net/ipv4/ip_forward

设置防火墙规则
#将所有80端口的请求都转发到squid的3128端口上
/sbin/iptables -t nat -A PREROUTING -i eth1 -s ClientIp   -p tcp --dport 80 -j REDIRECT --to-port 3128

开放3128端口
iptables - INPUT -s ClientIp -p tcp --dport 3128 -j ACCEPT


保存防火墙规则
service iptables save

重启防火墙
service iptables restart

用客户端telnet测试一下3128端口,是否对客户端开放
---------------------------------------------------------------------------------------------------------------------------
client设置

如果是IE的话
那就在IE的  工具---->Internet选项---->连接----->局域网设置---->高级
填写squid代理IP以及使用的端口
最终可以实现http代理功能

 

如果是firefox的话
工具---->选项---->高级---->网络---->设置---->手动配置代理

---------------------------------------------------------------------------------------------------------------------------


总结:
其实整个过程很简单
需要注意的几点:
1)squid配置文件中允许客户端的网段访问squid端口
acl Network src ClientIp
http_access allow Network

2)配置透明代理
http_port SquidServerIP:3128 transparent

3)配置防火墙,允许clients访问squid端口
iptables - INPUT -s ClientIp -p tcp --dport 3128 -j ACCEPT

4)添加目的地址转发,将所有对squid服务器的web请求都转到3128端口
iptables -t nat -A PREROUTING -i eth1 -s ClientIp -p tcp --dport 80 -j REDIRECT --to-port 3128

 

如果端口没有对client开放或者是client没有访问权限都会报错

 

 

 

 

友情提示:
如果client的所在网络的出口IP【即网关】不是同一网段的,那么1 3 4 里面都要添加记录
如果client与squid服务器在同一个局域网,那么就可以将squid的IP设置为client的网关,实现真正意义上的透明代理