squid

多出口认证上网代理服务器[原创]

已经授权给了51cto,http://os.51cto.com/art/201104/256479.htm,请注意版权问题。

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

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

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

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

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

此客户需求相当明确,根据上面罗列,条理也很清晰。接下来就是对于客户的以上需求逐一的实现了。

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

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

根据图中所示,红色的用户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安装包。下载地址http://www.squid-cache.org/Versions/,笔者这里使用的是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 0 0.0.0.0:3128 0.0.0.0:* LISTEN

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

另外还可以登录http://www.iprivacytools.com/proxy-checker-anonymity-test/网站查看使用不同的用户组的用户,是否上网ip不一样,同时这个页面还能查看当前上网方式是否使用了代理。

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

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

/usr/local/squid/sbin/squid -ND&即可了。

Related Post

13 Comments

  1. 我是在windows server里配置的多个公网IP,然后使用route -p add dst_ip mask 255.255.255.255 outgoing_ip_0,这样设置某次请求所使用的公网IP,请求发送返回处理之后,使用route delete dst_ip删掉这个规则,然后再次绑定另一公网IP,这样循环往复。但是实际使用中,这样并未生效,不知道是什么原因。请问对这个了解吗?

  2. 通过那个ip出去是在iptable里设置的,所以,如果你定时改变一下iptables的配置,那是可以实现出去的ip进行轮换的。

  3. 您好,有个问题请教一下。假设现在服务器单块网卡配置多个公网IP,有没有办法使这些公网IP自动切换,也就是说,相当有一个公网IP池,服务器前一秒使用IP1,下一秒使用IP2。这个可以做到吗?

  4. 最及我也在弄缓存加速问题,但是我们的情况复杂点。
    abc。。。。n台服务器
    a电信,b网通其他的国外的。 他们互相访问的延时在10ms左右但是带宽很小。
    目前我打算实现以下目标但是不知道如何去做,a访问非电信的先去查b,如果目标不是网通自己get,如果是网通b帮a get。同理b访问非网通也是一样。
    目前实现了a电信直接出去不icp查b,非电信本机miss的icp去查b,但是网通的b帮a去代理去没实现。不知道如何去弄。

    ps squid对ip dstlist的查询速度如何?如果存在全国路由前缀的话性能会不会差很多。
    因为只想要80加速所以不想用路由去解决。

  5. 看了你的文章,有个问题: 若是客户在国内通过未加密的代理访问国外HTTP,现阶段有无可能被G~F~W档掉?
    谢谢~

  6. 看了你写的 squid文章。受益匪浅。谢谢分享。同时,我还有个需求,不知道SQUID能不能实现。在一台squid上做代理,分成两中类型,领导层和普通员工层。领导层用代理可以访问一些网站,普通员工用代理不允许访问某些网站。squid 如何识别领导和普通员工呢?客户端的IP不固定。MAC地址来识别,感觉也不是很靠谱。。。

  7. 内网同网段做mac地址绑定可以更安全,本来是想给客户做mac地址的,结果公网ip,md搞不到客户mac地址。所以就用这个方案实施了。客户还挺满意。呵呵

Leave a Reply

Your email address will not be published. Required fields are marked *