Linux环境下透明代理完全解决方案
--------------------------------------------------------------------------------
Ideal at Linuxaid
摘要:该文讨论了如何在Linux环境下如何通过Ipchains和squid实现透明代理。
硬件环境:3Com RAS1500 IBM Pc Server 320
软件环境:Redhat6.2 Squid 2.3.STABLE4
本文假设有这样的应用环境,网络中有一台拨号服务器为用户提供拨号接入服务,其IP地址为192.168.2.32,该服务器共有30条线,可供分配的IP地址为192.168.2.1-192.168.2.30。也就是说拨号用户得到的是一个内部IP,范围为1-31,在网络中专门为拨号用户设置一台Linux服务器,该服务器运行有Squid实现的代理服务器,并且配置了IPChains规则。Squid代理为客户的www访问提供了代理缓冲以增加其上网速度,而IPChains的运用却可以实现代理对于客户的透明化,同时对于非www访问提供互联网接入。
网络拓扑结构如下:
[img:3fcdf44174]http://oldsite.linuxaid.com.cn/engineer/ideal/article/image002.jpg[/img:3fcdf44174]
当然,如果希望使用透明代理加快局域网上网速度的话,原理是一样的,只有允许通过的ip范围不同,在这里我只允许拨号用户的IP地址通过该透明代理。
一、Squid的安装配置
1、什么是Squid
Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher和HTTP协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。
Squid将数据元缓存在内存中,同时也缓存DNS查询的结果,除此之外,它还支持非模块化的DNS查询,对失败的请求进行消极缓存。Squid支持SSL,支持访问控制。由于使用了ICP(轻量Internet缓存协议),Squid能够实现层叠的代理阵列,从而最大限度地节约带宽。
Squid由一个主要的服务程序squid,一个DNS查询程序dnsserver,几个重写请求和执行认证的程序,以及几个管理工具组成。当Squid启动以后,它可以派生出预先指定数目的dnsserver进程,而每一个dnsserver进程都可以执行单独的DNS查询,这样一来就大大减少了服务器等待DNS查询的时间。
2、Squid的下载安装
从Squid的官方站点http://www.squid-cache.org下载该软件;
1) 将该文件拷贝到/usr/local目录。
2) 解开该文件 tar xvzf squid-2.3.STABLE4-src.tar.gz。
3) 解开后,在/usr/local生成一个新的目录squid-2.3.STABLE4
4) 进入squid
cd squid-2.3.STABLE4
5) 执行./configure 可以用./confgure --prefix=/directory/you/want指定安装目录。系统缺省安装目录为/usr/local/squid。
6) 执行 make all
7) 执行 make install
安装结束后,squid的可执行文件在安装目录的bin子目录下,配置文件在etc子目录下。
3、Squid的配置
Squid配置文件为:/usr/local/squid/etc/squid.conf。安装成功以后,系统已经有了一个缺省的配置文件,用户仅仅需要修改该配置文件即可。首先我将Squid用在透明代理时的配置文件中必须打开的选项的内容列举如下:
http_port 8080
cache_mem 32 MB
cache_swap_low 90
cache_swap_high 95
maximum_object_size 4096 KB
cache_dir ufs /usr/local/squid/cache 1200 16 256
cache_access_log /usr/local/squid/logs/access.log
cache_log /usr/local/squid/logs/cache.log
dns_nameservers 210.12.114.130
unlinkd_program /usr/local/squid/bin/unlinkd
acl all src 0.0.0.0/0.0.0.0
http_access allow all
cache_effective_user nobody
cache_effective_group nobody
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
* http_port
说明:定义squid监听HTTP客户连接请求的端口。缺省是3128,如果使用HTTPD加速模式 则为80。你可以指定多个端口,但是所有指定的端口都必须在一条命令行上。
*cache_mem (bytes)
说明:该选项用于指定squid可以使用的内存的理想值。这部分内存被用来存储以下对象:In-Transit objects (传入的对象)
Hot Objects (热对象,即用户常访问的对象)
Negative-Cached objects (消极存储的对象)
需要注意的是,这并没有指明squid所使用的内存一定不能超过该值,其实,该选项只定义了squid所使用的内存的一个方面,squid还在其他方面使用内存。所以squid实际使用的内存可能超过该值。缺省值为8MB。
*cache_dir Directory-Name Mbytes Level-1 Level2
说明:指定squid用来存储对象的交换空间的大小及其目录结构。可以用多个cache_dir命令来定义多个这样的交换空间,并且这些交换空间可以分布不同的磁盘分区。"directory "指明了该交换空间的顶级目录。如果你想用整个磁盘来作为交换空间,那么你可以将该目录作为装载点将整个磁盘mount上去。缺省值为/var/spool/squid。“Mbytes”定义了可用的空间总量。需要注意的是,squid进程必须拥有对该目录的读写权力。“Level-1”是可以在该顶级目录下建立的第一级子目录的数目,缺省值为16。同理,“Level-2”是可以建立的第二级子目录的数目,缺省值为256。为什么要定义这么多子目录呢?这是因为如果子目录太少,则存储在一个子目录下的文件数目将大大增加,这也会导致系统寻找某一个文件的时间大大增加,从而使系统的整体性能急剧降低。所以,为了减少每个目录下的文件数量,我们必须增加所使用的目录的数量。如果仅仅使用一级子目录则顶级目录下的子目录数目太大了,所以我们使用两级子目录结构。
那么,怎么来确定你的系统所需要的子目录数目呢?我们可以用下面的公式来估算。
已知量:
DS = 可用交换空间总量(单位KB)/ 交换空间数目
OS = 平均每个对象的大小= 20k
NO = 平均每个二级子目录所存储的对象数目 = 256
未知量:
L1 = 一级子目录的数量
L2 = 二级子目录的数量
计算公式:
L1 x L2 = DS / OS / NO
注意这是个不定方程,可以有多个解。
* cache_swap_low (percent, 0-100)
cache_swap_high (percent, 0-100)
说明:squid使用大量的交换空间来存储对象。那么,过了一定的时间以后,该交换空间就会用完,所以还必须定期的按照某种指标来将低于某个水平线的对象清除。squid使用所谓的“最近最少使用算法”(LRU)来做这一工作。当已使用的交换空间达到cache_swap_high时,squid就根据LRU所计算的得到每个对象的值将低于某个水平线的对象清除。这种清除工作一直进行直到已用空间达到cache_swap_low。这两个值用百分比表示,如果你所使用的交换空间很大的话,建议你减少这两个值得差距,因为这时一个百分点就可能是几百兆空间,这势必影响squid的性能。缺省
cache_swap_low 90
cache_swap_high 95
* maximum_object_size
说明:大于该值得对象将不被存储。如果你想要提高访问速度,就请降低该值;如果你想最大限度地节约带宽,降低成本,请增加该值。单位为K,缺省值为:
maximum_object_size 4096 KB
* cache_dir Directory-Name Mbytes Level-1 Level2
说明:指定squid用来存储对象的交换空间的大小及其目录结构。可以用多个cache_dir命令来定义多个这样的交换空间,并且这些交换空间可以分布不同的磁盘分区。"directory "指明了该交换空间的顶级目录。如果你想用整个磁盘来作为交换空间,那么你可以将该目录作为装载点将整个磁盘mount上去。缺省值为/var/spool/squid。“Mbytes”定义了可用的空间总量。需要注意的是,squid进程必须拥有对该目录的读写权力。“Level-1”是可以在该顶级目录下建立的第一级子目录的数目,缺省值为16。同理,“Level-2”是可以建立的第二级子目录的数目,缺省值为256。为什么要定义这么多子目录呢?这是因为如果子目录太少,则存储在一个子目录下的文件数目将大大增加,这也会导致系统寻找某一个文件的时间大大增加,从而使系统的整体性能急剧降低。所以,为了减少每个目录下的文件数量,我们必须增加所使用的目录的数量。如果仅仅使用一级子目录则顶级目录下的子目录数目太大了,所以我们使用两级子目录结构。
那么,怎么来确定你的系统所需要的子目录数目呢?我们可以用下面的公式来估算。
已知量:
DS = 可用交换空间总量(单位KB)/ 交换空间数目
OS = 平均每个对象的大小= 20k
NO = 平均每个二级子目录所存储的对象数目 = 256
未知量:
L1 = 一级子目录的数量
L2 = 二级子目录的数量
计算公式:
L1 x L2 = DS / OS / NO
注意这是个不定方程,可以有多个解。
* cache_access_log
说明:指定客户请求记录日志的完整路径(包括文件的名称及所在的目录),该请求可以是来自一般用户的HTTP请求或来自邻居的ICP请求。缺省值为:
cache_access_log /var/log/squid/access.log
如果你不需要该日志,可以用以下语句取消:
cache_access_log none
* cache_log
说明:指定squid一般信息日志的完整路径(包括文件的名称及所在的目录)。缺省路径为:
cache_log /var/log/squid/cache.log
* dns_nameservers 100.100.100.101
该选项用来定义Squid进行域名解析时使用的域名服务器的,因为在使用代理协议时,客户端并不进行域名查询,而是通过代理进行的,因此需要为代理服务器指定域名服务器来进行域名解析。
* unlinkd_program
说明:指定文件删除进程的完整路径。
缺省设置为:unlinkd_program /usr/lib/squid/unlinkd
* acl
说明:定义访问控制列表。
定义语法为:
acl aclname acltype string1 ...
acl aclname acltype "file" ...
当使用文件时,该文件的格式为每行包含一个条目。
acltype 可以是 src dst srcdomain dstdomain url_pattern urlpath_pattern time port proto method browser user 中的一种。
分别说明如下:
src 指明源地址。可以用以下的方法指定:
acl aclname src ip-address/netmask ... (客户ip地址)
acl aclname src addr1-addr2/netmask ... (地址范围)
dst 指明目标地址。语法为:
acl aclname dst ip-address/netmask ...(即客户请求的服务器的ip地址)
srcdomain 指明客户所属的域。语法为:
acl aclname srcdomain foo.com ... squid将根据客户ip反向查询DNS。
dstdomain 指明请求服务器所属的域。语法为:
acl aclname dstdomain foo.com ... 由客户请求的URL决定。
注意,如果用户使用服务器ip而非完整的域名时,squid将进行反向的DNS解析来确定其完整域名,如果失败就记录为“none”。
time 指明访问时间。语法如下:
acl aclname time [day-abbrevs] [h1:m1-h2:m2][hh:mm-hh:mm]
day-abbrevs:
S - Sunday
M - Monday
T - Tuesday
W - Wednesday
H - Thursday
F - Friday
A - Saturday
h1:m1 必须小于 h2:m2,表达示为[hh:mm-hh:mm]。
port 指定访问端口。可以指定多个端口,比如:
acl aclname port 80 70 21 ...
acl aclname port 0-1024 ... (指定一个端口范围)
proto 指定使用协议。可以指定多个协议:
acl aclname proto HTTP FTP ...
method 指定请求方法。比如:
acl aclname method GET POST ...
这里定义了一个名为all的组,包括所有的主机。
*http_access
说明:根据访问控制列表允许或禁止某一类用户访问。
如果某个访问没有相符合的项目,则缺省为应用最后一条项目的“非”。比如最后一条为允许,则缺省就是禁止。所以,通常应该把最后的条目设为"deny all" 或 "allow all" 来避免安全性隐患。
这里我们允许所有的地址访问代理服务,但是在下面我们使用Ipchains来限制只允许拨号用户来访问该透明代理服务器。
* cache_effective_user
cache_effective_group
说明:如果用root启动squid,squid将变成这两条语句指定的用户和用户组。缺省变为squid用户和squid用户组。注意这里指定的用户和用户组必须真是存在于/etc/passwd中。如果用非root帐号启动squid,则squid将保持改用户及用户组运行,这时候,你不能指定小于1024地http_port。
cache_effective_user nobody
cache_effective_group nobody
*httpd_accel_host virtual
httpd_accel_port 80
这两个选项本来是用来定义squid加速模式的。在这里我们用virtual来指定为虚拟主机模式。80端口为要加速的请求端口。采用这种模式时,squid就取消了缓存及ICP功能,假如你需要这些功能,这必须设置httpd_accel_with_proxy选项。
* httpd_accel_with_proxy on
该选项在透明代理模式下是必须设置成on的。在该模式下,squid既是web请求的加速器,又是缓存代理服务器。
* httpd_accel_uses_host_header on
在透明代理模式下,如果你想让你代理服务器的缓存功能正确工作的话,你必须将该选项设为on。设为on时,squid会把存储的对象加上主机名而不是ip地址作为索引。这一点在你想建立代理服务器阵列时显得尤为重要。
4、Squid的启动
首先确定你的内核已经配置了以下特性:
[*] Network firewalls
[ ] Socket Filtering
[*] Unix domain sockets
[*] TCP/IP networking
[ ] IP: multicasting
[ ] IP: advanced router
[ ] IP: kernel level autoconfiguration
[*] IP: firewalling
[ ] IP: firewall packet netlink device
[*] IP: always defragment (required for masquerading)
[*] IP: transparent proxy support
如果没有,请你重新编译内核。一般在RedHat6.x以上,系统已经缺省配置了这些特性。
下来,需要为Squid创建 Cache目录,使用如下命令来创建:
[root@squid bin]# /usr/local/squid/bin/squid –z
下来需要指定Log目录为nobody用户具有写权限:
[root@squid squid]# chmod 777 /usr/local/squid/etc
然后就可以使用命令:
[root@dserv bin]# /usr/local/squid/bin/squid
来启动该服务器。启动以后察看启动进程,一般应该有如下的进程:
root 558 0.0 0.0 3300 0 ? SW 2000 0:00 [squid]
nobody 559 0.6 53.6 53600 51284 ? S 2000 74:29 (squid)
nobody 560 0.0 0.0 1088 84 ? S 2000 0:11 (unlinkd)
二、IPChains过滤规则的设立
首先应该打开包转发功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
为了让启动时能自动打开包转发功能,可以将上一行的内容添加到/etc/rc.d/rc.local文件的末尾。
这里我只允许拨号用户使用该透明代理,因此我的过滤规则数据文件内容如下:
:input ACCEPT
:forward DENY
utput ACCEPT
-A input -i lo -j ACCEPT
-A input -p tcp -s 192.168.2.0/27 -d 0.0.0.0/0 80 -i eth0 -j REDIRECT 8080
-A input -s ! 192.168.2.0/27 -d 0.0.0.0/0 -i eth0 -j DENY
-A forward -s 192.168.2.0/27 -d 0.0.0.0/0.0.0.0 -i eth1 -j MASQ
其中-A input -i lo -j ACCEPT表示接收所有的回送包;
-A input -p tcp -s 192.168.2.0/27 -d 0.0.0.0/0 80 -i eth0 -j REDIRECT 8080表示将拨号用户所在IP地址的目标端口为80的TCP包重定向到8080端口;
-A input -s ! 192.168.2.0/27 -d 0.0.0.0/0 -i eth0 -j DENY指示其他所有源地址不是拨号用户的数据都统统被丢弃;
-A forward -s 192.168.2.0/27 -d 0.0.0.0/0.0.0.0 -i eth1 -j MASQ转发并伪装拨号用户的其他数据。
最后,使用客户机进行测试,只需要设置默认网关为透明代理就可以上网,同时享受代理带来的快速。
三、参考文献
IPCHAINS-HOWTO
Squid Manual
roby19 回复于:2003-05-06 15:45:18 |
好,又是一篇好文章,是不是ipchains是iptables的旧版本呢? |
qiqigaogao 回复于:2003-05-06 16:36:45 |
iptables,它是ipchains的替代品,功能也更为强大。 |
qiqigaogao 回复于:2003-05-06 16:38:11 |
iptables,它是ipchains的替代品,功能也更为强大。 |
段誉 回复于:2003-05-06 22:45:01 |
不错,尤其是对squid中的一些常用参数进行了说明,会对许多实用squid的用户有很大帮助的。
感谢! |
roby19 回复于:2003-05-07 10:12:41 |
能在solaris 8 for x86 下使用squid+iptables 吗?
有什么不同吗? |
清茶淡淡 回复于:2003-05-07 11:52:02 |
文章太老了 |
wangzhao 回复于:2003-05-08 20:20:36 |
[quote:124b3140b8="roby19"]能在solaris 8 for x86 下使用squid+iptables 吗?
有什么不同吗?[/quote:124b3140b8] 不能,iptables基于netfilter框架,而netfilter是linux独有的 |
shaotao27 回复于:2003-05-08 21:58:42 |
还行吧 也不算老啊 |
shaotao27 回复于:2003-05-08 21:59:04 |
我说真的啊 有淀用 |
muzx 回复于:2003-05-08 22:40:39 |
长见识。 |
roby19 回复于:2003-05-08 23:06:03 |
[quote:869fd57759="wangzhao"]
不能,iptables基于netfilter框架,而netfilter是linux独有的[/quote:869fd57759] 那在solaris下用squid+ipchains呢?能实现透明代理吗?? |
IPphone 回复于:2003-05-15 13:49:42 |
是有点老了,不过对 squid 的一些参数的解释还是不错的。顶!! |
redhat_bluebird 回复于:2003-05-19 16:39:46 |
用squid做的传统代理可以用,可透明代理不能用,用什么方法可以看我的80端口是不是指向了3128端口。 |
race 回复于:2003-05-19 20:05:53 |
楼顶的,硬件需要哪些配置,比如内存最小多少? |
liangxinf 回复于:2003-05-26 13:18:12 |
定。 |
neeman 回复于:2003-05-26 15:26:34 |
我想知道这样做透明代理后,ipchains的使用情况如何查询呀?
我现在对使用该透明代理的内部IP上网情况一无所知了,而使用SQUID的日志都没有这样的记录。 |
dasen 回复于:2003-06-09 13:10:44 |
好!收下了。 |
a212481 回复于:2003-06-20 11:29:04 |
ok |
JohnBull 回复于:2003-06-22 08:58:58 |
真正的透明代理应该是把Linux配置成7层交换机,与squid配合.连IP都没有,真正透明.
当然,那就不是代理服务器的话题了. |
Ghost_Vale 回复于:2003-06-27 17:09:58 |
不知道这位大哥有没有Squid的配置手册呢?如果有中文的配置手册那就再好不过了!小弟现在正在为Squid的配置烦劳呢?因为局域网的及其数量比较多在用连接共享的方法好像行不通了要用两三个网段才能装得下呢!
哈哈!不知道斑竹是否愿意告诉我那里可以下载呢? 因为要配置很多规折所以不好发帖子所以一希望给为打虾告诉我那里有能够下载到Squid的中文配置手册小弟先在这里向各位大虾说声谢谢了 |
hoge 回复于:2003-06-30 23:50:25 |
不错 |
staric 回复于:2003-07-05 14:52:06 |
好 |
lable1018 回复于:2003-08-31 09:45:25 |
4、Squid的启动
首先确定你的内核已经配置了以下特性: [*] Network firewalls [ ] Socket Filtering [*] Unix domain sockets [*] TCP/IP networking [ ] IP: multicasting [ ] IP: advanced router [ ] IP: kernel level autoconfiguration [*] IP: firewalling [ ] IP: firewall packet netlink device [*] IP: always defragment (required for masquerading) [*] IP: transparent proxy support 我是一个新手,请问怎么样才能出现上面的一些选项呀?使用什么命令,命令在什么地方?我用的是redhat 8.0,谢谢! |
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/
领测软件测试网最新更新
关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073