linux中设置透明代理

1. 什么是透明代理?
如果你问:我如何才能使得用户的浏览器不需要任何代理设置就能使用我的 Squid cache 代理服务器上网?,此时你就需要使用透明代理。透明代理让你的客户端不需设置任何代理,当包经过透时代理服务器时实际上被重定向到 squid 代理服务器的代理端口(如 8080 ),即由本地代理服务器向外请求所需数据然后拷贝给客户端。
§§
 设置 squid
前面的配置是不加限制的允许内部所有用户使用该代理上 Internet ,显然这不是一个很好的访问策略。我们说过,代理方式对用户权限的控制有着非常丰富的支持。下面就看看 squid 如何实现多样化的权限控制的。让我们先了解一下 squid.conf 的几个配置选项和访问控制特性:
Squid
的定制是通过设置它的配置文件 squid.conf 来实现的, squid.conf 文件通常在 /etc/squid 目录下。这个配置文件内容很多,但它的每个选项都有详尽的说明。下面是几个常用的配置参数:
http_port
首先来更改一下 http_port ,这个选项指定了 Squid 监听客户请求的端口,默认值是 3128 。要使用代理功能,建议这个端口值和运行 Squid 的机器的 IP 地址一起使用,可以修改成下面这样:
http_port 192.168.100.254:3128
上述声明表示 Squid 绑定在 IP 地址 192.168.100.254 上,端口为 3128 。端口可以设置为任意值,但要确认没有其他程序会使用同样的端口。 /etc/services 文件列出了常用端口,如果你想为 squid 设置其它的端口,可以参考这个文件的内容,防止重复设置。
visible_hostname 192.168.100.254
运行 squid 的主机的名字,可以写上该机器的 IP 地址。
[email protected]
管理员的邮件地址。在访问发生错误时, visible_hostname cache_mgr 这两个选项的值显示在错误提示页面内的相关位置。
cache_mem 16 MB
定义缓存内存,一般定义为物理内存大小的 1/3 。默认设置为 8MB
cache_dir Type Directory-Name Fs-specific-data [options]
定义硬盘缓存空间以存储访问过的页面或其它资源的拷贝。 Type 是指存储类型,一般设置为 ufs Directort-Name 代表缓存的位置,默认的设置是 cache_dir ufs /var/spool/squid 100 16 256 。其中 100 代表缓存空间最大为 100M 16 256 代表缓存目录下的一级和二级目录数。
访问控制
控制用户的访问权限等功能是使用 squid 的访问控制特性来实现的。 Squid 访问控制有两个要素: ACL 和访问列表。访问列表可以允许或拒绝某些用户对特定服务的访问。
为了使用控制功能,必须先设置 ACL ACL 声明的格式如下:
acl acl_element_name type_of_acl_element values_to_acl
下面列出一些重要的 ACL 类型( type_of_acl_element
l src :
源地址(即客户机 IP 地址)
l dst :
目标地址(即服务器 IP 地址)
l srcdomain :
源名称 (即客户机名称)
l dstdomain :
目标名称 (即服务器名称)
l time :
一天中的时刻和一周内的一天
l url_regex : URL
规则表达式匹配
l urlpath_regex: URL-path
规则表达式匹配,略去协议和主机名
l proxy_auth :
通过外部程序进行用户验证
l maxconn :
单一 IP 的最大连接数
注:
1. acl_element_name
可以是任一个在 ACL 中定义的名称。
2.
任何两个 ACL 元素不能用相同的名字。
3.
每个 ACL 由列表值组成。当进行匹配检测的时候,多个值由逻辑或运算连接;换言之,即任一 ACL 的值被匹配,则这个 ACL 即被匹配。
4.
并不是所有的 ACL 都能使用访问列表中的全部类型。
5.
不同的 ACL 写在不同行中, Squid 将把它们组合在一个列表中。
我们可以使用许多不同的访问列表。我们常用的是 http_access: 允许 HTTP 访问,这个是主要的访问控制列表。
访问列表的规则由一些类似 allow deny 的关键字构成,用以允许或拒绝向特定或一组 ACL 元素提供服务。
注:
1.
这些规则按照它们的排列顺序进行匹配检测,一旦检测到匹配的规则,匹配检测就立即结束。
2.
一个访问列表可以又多条规则组成。
3.
如果没有任何规则与访问请求匹配,默认动作将与列表中最后一条规则对应。
4.
一个访问条目中的所有元素将用逻辑与运算连接:
http_access Action
声明 1 AND 声明 2 AND 声明 OR.
http_access Action
声明 3
多个 http_access 声明间用或运算连接,但每个访问条目的元素间用与运算连接。
5.
请记住列表中的规则总是遵循由上而下的顺序。
我们具体来看看如何运用 acl http_access 。首先把 squid.conf 的配置改回原状,即修改 http_access allow all http_access deny all 。下面给出几种常用访问控制:
根据 IP 鉴权
只有地址为 192.168.100.10 192.168.100.100 的终端可以使用代理
squid.conf ACCESS CONTROL 配置部分添加
acl authorizedip src 192.168.100.10
acl authorizedip src 192.168.100.100
然后到 http_access 部分
http_access deny all 这一行前面添加
http_access allow authorizedip
如果需要设置的 IP 地址非常多,又不连续,是不是要写上一大堆的 acl xxx xxx x.x.x.x ?有一个简单的方法,把这些 IP 地址写在一个文件里,比如 /etc/squid/authorizedip.txt ,每行一个。然后在 squid.conf 里这样写
acl authorizedip src "/etc/squid/authorizedip.txt"
根据时间控制
关于时间段的设置,可以参见 squid.conf 中的说明,具体是 S - Sunday, M - Monday, T - Tuesday, W - Wednesday, H - Thursday, F - Friday A - Saturday ,如果七天都允许,也可以不写。时间格式是 H1:M1-H2:M2 ,要求是前面的要小于后面的。
#
定义一个访问时间段:每周星期一到星期五的上午八点到下午五点,允许 alloweduser 用户在这个时间段内上网
acl accept_time time MTWHF 8:00-17:00
http_access allow alloweduser accept_time
http_access deny alloweduser
访问特定 URL 地址
虽然我们不希望所有的人都使用代理自由的访问 Internet ,但有几个网站是可以让内部终端都能访问的。在 squid.conf 里添加访问控制:
acl alloweddomain dstdomain .linuxforum.net .linuxaid.com.cn
http_access allow alloweddomain
同样的,如果参数很多的情况,也可以把这些允许的地址名写到一个文本里:
acl alloweddomain dstdomain "/etc/squid/alloweddomain.txt"
alloweddomain.txt
里是允许访问站点的列表,每行一个。
根据关键字过滤网址
有些网站(色情网站,广告网站)很令人讨厌,通过设置 acl 可以很容易屏蔽掉这些站点:
acl denyurl url_regex sex boylink xxx city69 asiaadult sehu
http_access deny denyurl
这个设置将过滤带有 sex boylink xxx city69 asiaadult sehu 这些关键字的 URL 地址。
和前面一样,也可以把这些关键字写到一个文本里
acl denyedurl url_regex "/etc/squid/sex.txt"
http_access deny denyurl
基于用户的认证
Squid
本身并不支持用户验证,它是通过外部程序提供用户验证功能,用户通过 squid 访问前需要输入有效的用户名和密码。可以用 proxy_auth ACL authenticate_program 来实现这个功能,在允许访问前强制进行用户名和密码的核查。下面列出一些 Squid 能用到的验证程序:
NCSA :
使用 NCSA 风格的用户名和密码档
LDAP :
使用 Linux Lightweight 目录访问协议( Linux Lightweight Directory Access Protocol
SMB :
使用 SMB 协议的服务,如 SAMBA Windows NT
MSNT :
使用 Windows NT 的域验证
PAM :
使用 Linux 的可装载验证模块
getpwam :
使用 Linux 密码档
使用验证功能必须用 authenticate_program 选项指定使什么验证程序,并且请确认选定的验证程序已安装并能很好的工作。默认的,这些验证程序放在 /usr/lib/squid/ 目录下。
NCSA 认证为例,修改 squid.conf 文件选定验证程序:
authenticate_program /usr/lib/squid/ncsa_auth /etc/squid/passwd
acl alloweduser proxy_auth pangty
http_access allow alloweduser
其中 /etc/squid/passwd 是用户和密码列表,这个文件可以用 apache 软件包带的 htpasswd 来产生,它的内容可能是这样的:
pangty:wCQhCeZOOF3vk
pangty
是用户名, “:” 号后面的是该用户的密码。
注意:修改了 squid.conf 配置后,需要重新启动 squid 或者告诉 squid 重新装入配置文件才能起作用。这样执行:
重起 squid
[root@rh73 ~]# /etc/rc.d/init.d/squid restart
不重起,只装入新的配置文件:
[root@rh73 ~]# /etc/rc.d/init.d/squid reload
以上是 squid 的常用的配置选项,这对于一般的应用来说已经足够了,如果你需要更多的特性支持,请阅读下面的内容。
§§
 需要更多的功能
显示中文错误提示信息
默认的, squid 在发生错误时显示的是英文提示信息, squid 的提示信息已经被翻译成很多语言,可以很方便的让他显示中文信息:
[root@rh73 ~]# cd /etc/squid/
[root@rh73 ~]# rm -f errors
[root@rh73 /etc/squid]# ln -s /usr/lib/squid/errors/Simplify_Chinese/ errors
/usr/lib/squid/errors
下面有 squid 的各种语言版本的提示信息,按目录存放在不同的子目录下面。
支持基于 MAC 的控制以及访问带有下划线的 URL
由于计算机的 IP 地址是随时可以更改的,所以即便你设置了 ACL 限制只有某些 IP 的计算机可以访问 Internet ,其它人仍然可以在该计算机关机的情况下,修改成这些允许上网的 IP 地址后访问 Internet 。另外,前面我们是使用 DHCP 来管理内部网络上的计算机的 IP 地址,每台计算机每次获得的 IP 地址可能是不一样的,所以,单纯的通过 IP 地址来控制上网权限并不适合所有的场合,而 MAC 地址相对是稳定的,一般网卡的 MAC 地址不能够更改,所以基于 MAC 地址的用户控制非常适合解决这两种情况带来的问题。
另外,我们访问 Internet 时,有时候会遇到这样的网站地址: [url]http://www.hello_world.com[/url] ,在网站的 URL 地址里面有下划线,这时 Red Hat Linux 自带的 squid 软件包可能会报告无法访问该网站。
这些功能需要重新编译 squid 源代码增加相应的编译选项来实现。下面我们就来看一下如何使用 rpm 重新编译软件包源代码获得必要的功能。
当文章写到这里的时候, Red Hat Linux 网站发布了 squid 的升级软件包,我们可以从网上获得它的最新源代码 rpm 包:
[url]ftp://updates.redhat.com/7.2/en/os/SRPMS/squid-2.4.STABLE6-6.7.3.src.rpm[/url]
在开始编译前,有一些软件包是需要首先安装,这可能包括 rpm-build sgml-tools ,前者在 Red Hat Linux 的光盘上可以找到,后者可以从这里下载:
[url]ftp://ftp.freesoft.cei.gov.cn/.mirror2/ftp.redhat.com/redhat-7.2/i386/RedHat/RPMS/sgml-tools-1.0.9-12.i386.rpm[/url]
安装 squid 的源代码包
[root@rh73 ~]# rpm -ivh squid-2.4.STABLE6-6.7.3.src.rpm
安装后的源代码包在 /usr/src/redhat/SOURCES 目录下,我们关心的是另外一个文件 /usr/src/redhat/SPECS/squid.spec ,这里面有 squid 的相关编译选项,修改该文件 %configure 部分如下:
%configure
--exec_prefix=/usr --bindir=/usr/sbin --libexecdir=/usr/lib/squid
--localstatedir=/var --sysconfdir=/etc/squid
--enable-poll --enable-snmp --enable-removal-policies="heap,lru"
--enable-storeio="aufs,coss,diskd,ufs"
--enable-delay-pools --enable-linux-netfilter
--with-pthreads
--enable-underscores
--enable-arp-acl
--enable-err-language=Simplify_Chinese
--enable-auth-modules="LDAP,NCSA,PAM,SMB,MSNT" # --enable-icmp
--enable-underscores
是增加对下划线网址的支持, --enable-arp-acl 是增加支持 MAC 地址方式的鉴权。
开始编译产生新的 RPM 包:
[root@rh73 ~]# rpm -ba squid.spec
这条命令将根据 squid.spec 的配置重新编译生成新的 rpm 包。编译过程视机器性能的好坏而定,大概需要几分钟到几十分钟不等,如果没有什么错误,最后产生的新的 rpm 包在 /usr/src/redhat/RPMS/i386/ 目录下: squid-2.4.STABLE6-6.7.3.i386.rpm
安装新的 rpm 包:
[root@rh73 ~]# rpm -Uvh /usr/src/redhat/RPMS/i386/squid-2.4.STABLE6-6.7.3.i386.rpm
注意,这里使用了 -U 参数,是因为我们前面已经安装过 squid 的一个较旧的版本, -U 参数指出这个操作是对原有版本软件包的升级。现在你的 squid 就可以支持 MAC 地址鉴权和带下划线的 URL 地址了。 8)
配置 squid.conf 来支持 MAC 地址鉴权,在 squid.conf 里加入这样的内容:
acl allowedmac arp 00:10:DC: 8F :5B:FF
http_access allow allowedmac
上面只是常用的几种 ACL 设置的示例,关于 ACL 可以访问 squid 主页上 FAQ 文档的 Access Controls 部分获得更多的信息:
[url]http://www.squid-cache.org/Doc/FAQ/FAQ-10.html[/url]
§§
 配置透明代理
透明代理是 NAT 和代理的完美结合,之所以称为透明,是因为在这种工作方式下你感觉不到代理的存在,和单纯使用 NAT 一样,对上网的客户端没有任何特殊的设置。 Squid 可以通过配置支持透明代理。
很多文章讲到共享上网就会讲有关透明代理( iptables + squid ipchains + squid )的内容,我个人认为对于规模不大的网络,又没有内容过滤等功能的要求,使用 squid 是没有必要的,单纯的使用 NAT 方式就足够了,并且这样对运行 NAT 的服务器的要求就更加低,比如使用一台 486 + 4M 内存的机器,如果使用那些经过特殊定制的 Linux 系统,甚至连硬盘都不需要,只要一张软盘就可以了。
如果是源代码方式编译安装的 squid ,请在编译选项里指明 --enable-linux-netfilter 选项。 Red Hat Linux 自带的 squid 支持透明代理,我们可以直接修改 /etc/squid/squid.conf 文件,设置必要的参数:
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
运行 /etc/rc.d/init.d/squid reload 使设置生效,然后修改 fw.sh 脚本,在最后添加这样一行:
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
这将把所有局域网用户通过 Linux 接入服务器访问 www 服务的访问请求重定向到工作在 3128 端口的 squid 处理。运行 fw.sh 脚本,使设置生效。就这么简单!
你可能还记得 fw.sh 里面的关于 NAT 的规则:
iptables -A POSTROUTING -t nat -s 192.168.100.0/24 -o eth0 -j SNAT --to-source 61.156.35.114
由于 PREROUTING 规则总在 POSTROUTING 规则之前应用,所以不用担心 squid NAT 规则屏蔽掉。
注意:使用透明代理时,无法同时使用 squid 基于用户帐号的验证功能!
想了解更多关于透明代理的资料,请访问 TLDP The Linux Documentation Project )上关于透明代理的 HOWTO 文档:
[url]http://www.tldp.org/HOWTO/mini/TransparentProxy.html[/url]
§§
 一个 squid.conf 的配置实例
现在给出一个支持透明代理并使用 MAC 地址控制用户上网权限的 squid 配置文件,该配置还支持特定网站(如色情网站)的过滤功能:
#
定义服务器地址和端口
http_port 192.168.100.254:3128
#
定义服务器名字
visible_hostname 192.168.100.254
#
定义管理员邮件地址
[email protected]
#
定义缓存内存空间和缓存目录
cache_mem 16 MB
cache_dir ufs /var/spool/squid 100 16 256
#
支持透明代理
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
#
定义 acl
#sexurl.txt
列出要过滤色情网站地址的关键字,每个关键字占一行,如 xchina
#maclist.txt
列出允许上网的主机的 MAC 地址,每个地址占一行,如 00:50:56:C0:00:08
acl all src 0.0.0.0/0.0.0.0
acl sexurl url_regex "/etc/squid/sexurl.txt"
acl allowedmac arp "/etc/squid/maclist.txt"
#
定义访问策略
http_access deny sexurl
http_access allow allowedmac
http_access deny all
还有问题请来论坛寻求帮助: [url]http://www.xxlinux.com/bbs/[/url]

你可能感兴趣的:(linux,职场,休闲)