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