最近帮朋友接了个小项目,客户在他们的美国机房租了几台服务器,然后想在上面做上网用的代理服务器,供客户在国内使用。具体需求如下:

1、客户的这台服务器具有多个出口ip地址

2、客户希望使用认证的方式使用代理服务器上网

3、客户希望通过不同的认证用户实现从不同的出口ip访问网络

4、隐藏代理信息,隐藏真实上网ip

此客户需求相当明确,根据上面罗列,条理也很清晰。本文的目的就是向大家介绍笔者实现这个需求的思路和步骤。

作者简介:刘晗昭,网名蚊子(博客),某通信业国企系统工程师,熟悉各种主流开源软件的使用,部署和组合应用,以及主流网站架构。目前关注系统架构和系统优化。

笔者使用了Squid来实现这一需求。Squid是一种在Linux系统下使用的优秀的代理服务器软件,还可以用在AIX、Digital Unix、FreeBSD、HP-UX、Irix、NetBSD、Nextstep、SCO和Solaris等系统上。更多关于squid的介绍就不在这里多讲了,有需要的去官方网站上看吧,51CTO也有这方面的专题。

这里先看下我设计的逻辑图:

根据图中所示,红色的用户1会通过红色的出口ip1访问internet,绿色的用户2会通过绿色的出口ip2访问internet,用户3和用户4同样对应相应颜色的出口访问internet。

接下来根据上面的需求进行逐一的分解。

一、需求分析

1、服务器具有多个出口ip地址

这个没什么可说的,客户的出口ip为:

10.100.10.1
10.100.10.2
10.100.10.3

2、使用认证的方式使用代理服务器上网

这里要用到squid的认证功能。squid的认证功能大类包括basic_auth,digest_auth,external_acl,negotiate_auth,ntlm_auth这5种(注:squid-2.7.STABLE9版本),每个大类下面还有具体的认证方式,如NCSA,LDAP,DB等等,具体支持哪些可以去这些目录下面看。

笔者在这里主要介绍的是NCSA的方式,此种认证方式类似apache的auth认证方式,通过用户名密码来验证,密码文件也是通过htpasswd程序来创建。后面会给出具体配置。

3、通过不同的认证用户实现从不同的出口ip访问网络

先说实现不同出口ip访问网络,这个主要是依靠squid的tcp_outgoing_address配置实现的,此参数可以根据source ip或者用户名的不同,分配不同的出口ip出去。

如此一来,搭配第二个需求中的用户验证,正好就可以实现第三个需求了。后面会给出具体的配置。

4、隐藏代理信息,隐藏真实上网ip

这个需求很多人应该都想到使用什么配置文件了,对,就是squid的header_access这个参数。主要就是隐藏掉HTTP_VIA,VIA和X-forwarded-for。后面会给出具体配置。

二、安装配置

首先要做的就是下载一个squid安装包(下载地址)。笔者这里使用的是2.7 STABLE9,操作的当前目录是/tmp,下面所有涉及到目录的都是基于此目录。squid源文件路径是/tmp/squid-2.7.STABLE9.tar.gz

安装步骤如下:

tar zxvf squid-2.7.STABLE9.tar.gz
cd squid-2.7.STABLE9
./configure --prefix=/usr/local/squid --enable-async-io=320 --enable-icmp --enable-delay-pools --enable-kill-parent-hack --enable-snmp --enable-arp-acl --enable-htcp --enable-cache-digests --enable-removal-policies=heap,lru --enable-default-err-language=Simplify_Chinese --enable-x-accelerator-vary --enable-follow-x-forwarded-for --with-aufs-threads=320 --with-pthreads --with-dl --with-maxfd=65536 --enable-basic-auth-helpers=DB,NCSA --enable-digest-auth-helpers=password --enable-large-cache-files --with-large-files
make
make install

如果以上步骤中无报错,squid就被正确安装完毕了。

接下来执行:

cd /usr/local/squid/           
#(之后的所有操作均在此目录下完成)
grep -v "^#" etc/squid.conf.default|uniq > etc/squid.conf

将创建一份未注释的配置文件。

接下来编辑此文件

vi etc/squid.conf

修改编辑的内容如下:

20  acl CONNECT method CONNECT
21
22  http_access allow manager localhost

这两行中间加入:include "/usr/local/squid/etc/auth.conf"。auth.conf文件的内容后面会有详细介绍。

32  icp_access deny all
33
34  http_port 3128

这两行中间加入:always_direct allow all,意思是对所有ip过来的请求都允许转发。

将49  broken_vary_encoding allow apache行后面的所有内容删除,加上如下内容

forwarded_for off                     
#隐藏x-forwarded-for头
header_access HTTP_VIA deny all       
#隐藏HTTP_VIA头
header_access VIA deny all                  
#隐藏VIA头 cache_effective_group daemon      
#设置squid执行的用户组,这里使用了系统自带的daemon用户组
cache_effective_user daemon         
#设置squid执行的用户,这里使用了系统自带的daemon用户

visible_hostname test               
#设置错误页面中出现的服务器名称,可自行更改cache_dir aufs /usr/local/squid/cache 100 16 256              
#设置squid的缓存,可自行调整
cache_store_log none               
#关闭store.log

都修改添加完毕后,保存退出。

紧接着我们来创建auth.conf。

vi /usr/local/squid/etc/auth.conf

输入如下内容

# 设置验证相关的配置内容,指定密码文件
1  auth_param basic program /usr/local/squid/libexec/ncsa_auth /usr/local/squid/etc/passwd
2  auth_param basic children 10          #设置验证子进程数
3  auth_param basic credentialsttl 2 hours         #设置验证有效期
4  auth_param basic casesensitive off         #设置是否区分大小写
5
# 后面这三行分别定义了三个用户组。每个用户组指定了一个用户文件。
6  acl usergroup1 proxy_auth "/usr/local/squid/etc/ip1user"
7  acl usergroup2 proxy_auth "/usr/local/squid/etc/ip2user"
8  acl usergroup3 proxy_auth "/usr/local/squid/etc/ip3user"
9
# 后面三条允许这三个组的用户可以访问网络
10  http_access allow usergroup1
11  http_access allow usergroup2
12  http_access allow usergroup3
13
# 这三条用来分配哪个组的用户走哪个出口ip
14  tcp_outgoing_address10.100.10.1 usergroup1
15  tcp_outgoing_address10.100.10.2 usergroup2
16  tcp_outgoing_address 10.100.10.3 usergroup3

编辑完成后保存退出。

接下来是创建用户文件,vi /usr/local/squid/etc/ip1user,填入如下内容

user1
user2

保存退出。这里用户数量不限,每个用户名占用一行。

如果一开始没有那么多用户,建议使用touch命令将文件创建好,不然启动squid的时候会出错。

接下来创建用户的密码文件,第一次创建密码文件请使用下面的命令

htpasswd -cb /usr/local/squid/etc/passwd user1 111111

倒数第二个字段是用户名,最后一个字段是用户对应的密码

如果之前创建过了密码文件,使用下面的命令就可以了

htpasswd -b /usr/local/squid/etc/passwd user2 111111

命令解释同上。

到此为止,配置文件等相关工作就基本完成了。下面来说说squid的初始化工作。

首先,mkdir cache,创建cache目录

然后执行,chown -R daemon.daemon,变更当前目录及所有子目录的的属主与属组。笔者这里使用系统自有的daemon用户和组。

这些工作都做好之后呢,就来执行 sbin/squid -z对squid进行初始化,如果没有报错信息呢,初始化工作就算是做完了,下面启动squid服务即可了,启动命令为

sbin/squid -ND &

然后通过下面的命令查看一下3128端口是否启动

netstat -ln|grep 3128

如果出现下面的内容,说明squid服务已经正常运行了

tcp        0      00.0.0.0:31280.0.0.0:*                   LISTEN

到此为止,一个支持用户身份验证的多出口代理服务器就完全配置完毕了,赶快打开浏览器,配置好代理服务器,测试一下吧。看看浏览网页是否会弹出验证的提示。

另外还可以登录proxy checker工具网站查看使用不同的用户组的用户,是否上网ip不一样,同时这个页面还能查看当前上网方式是否使用了代理。

由上图可知,最上面是上网的ip地址,最下方的proxy detected如果是no表示未检测出使用代理上网。

如果想让squid在开机的时候自动启动只需要在/etc/rc.loacl文件中加入

/usr/local/squid/sbin/squid –ND &

即可。


http://os.51cto.com/art/201104/256479.htm