用squid+iptables实现http代理


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:144020%10080
refresh_pattern ^gopher:14400%1440
refresh_pattern -i (/cgi-bin/|\?) 00%0
refresh_pattern .020%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的网关,实现真正意义上的透明代理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值