搭建需要身份认证的 Squid 代理

1. 安装 Squid

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install squid

或者

yum install squid

2. 配置 HTTP 代理
注意,在 Ubuntu 下配置文件的默认位置可能是 /etc/squid3/,下面均用 CentOS 的 /etc/squid/ 举例,请自行替换。
基础设置:
首先设置允许访问该代理的 IP 列表:

# /etc/squid/squid.conf
acl client src 12.34.56.78 #客户端1 IP 地址
acl client src 21.43.56.78 #客户端2 IP 地址
...
http_access allow client

注意这几行要加在配置文件原有的

http_access deny all

之前,不然不会生效。
然后重启 squid 服务,让配置生效。

service squid restart #CentOS
service squid3 restart #Ubuntu

注意!非常不建议使用 http_access allow all,你的代理一定会被别人扫到用来干坏事!

高级验证:
如果想使用用户名密码来做权限控制,则需要进行一些额外的配置:
首先,我们需要安装 htpasswd,这个工具集成在 apache httpd 的 tools 里面

apt-get install apache2-utils
yum install httpd-tools

安装完成之后执行 htpasswd,如果没有提示找不到命令,则说明安装成功。
接下来创建保存用户名密码的文件:

touch /etc/squid/squid_passwd
chown squid /etc/squid/squid_passwd

注意授权的时候要弄清楚 squid 运行时的用户名,一般是 squid 或者 proxy。
然后执行:

htpasswd /etc/squid/squid_passwd username
New password:
Re-type new password:
Adding password for user username

注意把 username 换成你想要的用户名。
如果想要继续添加用户,请多次执行这条命令。

接下来修改 /etc/squid/squid.conf 文件,在 http_access deny all 之前加上下面几句:

auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/squid_passwd
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off

acl ncsa_users proxy_auth REQUIRED
http_access allow ncsa_users
这里要注意,如果你的系统是 64 位的,那么 /usr/lib/squid/ncsa_auth 这个模块的地址应该是 /usr/lib64/squid/ncsa_auth。设置之前建议用这个命令来检查一下:
dpkg -L squid | grep ncsa_auth
rpm -ql squid | grep ncsa_auth

下面说说这几个选项的含义:
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/squid_passwd : 指定密码文件和用来验证密码的程序
auth_param basic children 5 : 鉴权进程的数量
auth_param basic realm Squid proxy-caching web server : 用户输入用户名密码时看到的提示信息
auth_param basic credentialsttl 2 hours : 用户名和密码的缓存时间,也就是说同一个用户名多久会调用 ncsa_auth 一次。
auth_param basic casesensitive off : 用户名是否需要匹配大小写
acl ncsa_users proxy_auth REQUIRED : 所有成功鉴权的用户都归于 ncsa_users 组
http_access allow ncsa_users : 允许 ncsa_users 组的用户使用 Proxy

配置完成后重启 Squid 就可以啦!

3. 匿名
默认情况下,Squid 会添加很多和客户信息相关的 HTTP 头,如 X-Forwarded-For 这类。如果想要做到高度匿名,需要将这些头去掉。在 squid.conf 里面添加如下的配置:

forwarded_for off
request_header_access Allow allow all
request_header_access Authorization allow all
request_header_access WWW-Authenticate allow all
request_header_access Proxy-Authorization allow all
request_header_access Proxy-Authenticate allow all
request_header_access Cache-Control allow all
request_header_access Content-Encoding allow all
request_header_access Content-Length allow all
request_header_access Content-Type allow all
request_header_access Date allow all
request_header_access Expires allow all
request_header_access Host allow all
request_header_access If-Modified-Since allow all
request_header_access Last-Modified allow all
request_header_access Location allow all
request_header_access Pragma allow all
request_header_access Accept allow all
request_header_access Accept-Charset allow all
request_header_access Accept-Encoding allow all
request_header_access Accept-Language allow all
request_header_access Content-Language allow all
request_header_access Mime-Version allow all
request_header_access Retry-After allow all
request_header_access Title allow all
request_header_access Connection allow all
request_header_access Proxy-Connection allow all
request_header_access User-Agent allow all
request_header_access Cookie allow all
request_header_access All deny all

然后重启就可以啦!

默认情况下,Squid 会把主机相关的信息发送出去,并显示在错误页面。加上下面两句去掉这些信息:

# add this to /etc/squid/squid.conf
visible_hostname mybogusproxyhostname.local
# and while we are at it stop squid blabbing about it's version aswell
httpd_suppress_version_string on

最后说一个小坑,apache httpd 2.2 版本和 2.4 版本的 htpasswd 生成的密码文件格式是不一样的。只有 2.2 版本的能用。
如果按照教程设置成功以后发现用户名密码死活不对,文件权限也没有问题的话,那就要看一下是不是 htpasswd 的问题了。
直接输入 /usr/lib/squid/ncsa_auth /etc/squid/squid_passwd 然后输入 username passwd 可以手动运行一下 ncsa_auth 程序,看看是否是密码文件的问题。
如果提示 OK 那么说明没有问题,提示 ERR Wrong password 则说明要么是密码输错了,要么是密码文件的格式有问题。

PS:放出一个最简单的 PAC 文件,用来做代理的按需访问:

function FindProxyForURL(url, host) {
   if(ProxyDomain(url, host)) {
       return "PROXY 1.2.3.4:8080";
   }
   else {
       return "DIRECT";
   }
}

function ProxyDomain(url, host) {
    if(
        shExpMatch(host, "*.maoxian.de") ||
        shExpMatch(host, "*.baidu.com")
    ) {
        return true
    }
    return false;
}

PS:

编译安装的时候要注意一点,从 3.2 开始,编译使用的参数有了一点小变化,原先的:

--enable-auth="basic" --enable-baisc-auth-#helpers="NCSA"

变成了

--enable-auth  \
--enable-auth-basic=NCSA \

同时配置文件里的 /usr/lib/squid/ncsa_auth 模块可能会变成 /usr/bin/basic_ncsa_auth ,需要注意。

https://www.linode.com/docs/networking/squid/squid-http-proxy-ubuntu-12-04

代理上网行为检测逃脱之本地路由引导+SSH隧道

相信很多公司为了限制员工上网,都会选择一些深信服的设备对用户的流量做控制,一般只会给用户普通的权限,比如只允许浏览某些网页啦,打开个优酷都会被拦截啦。本文简单介绍一个在现有只允许打开某些网站的情况的,简历SSH隧道,把SSH隧道再塞进HTTP流里面去。示意图大致如下:

13898000658030

这个模型首先需要用户在公网有一台服务器(vps之流,并可以SSH上去)

思路:

本地去往公网的路由都通过一个小软件导导入到HTTP流中去,例如:Proxifier(这里可以跟路由把不支持代理功能的软件通过路由的方式把数据流导入到HTTP流中去)。这一步完成之后也就是你可以让所有软件都通过HTTP代理出去。

但是问题来了,这个依然是不加密的,改限制的网站依然会被限制。这个时候就用到了外网的那台开启了SSH功能的VPS,通过CRT(SecureCRT)用SSH链接到公网的VPS(此时所以数据流都可以通过Proxifier出去)。

到了这一步,前面的准备的工作已经完成,然后进行二次代理,以Firefox为例:

插件:autoproxy,设置127.0.0.1 端口号32768。然后在SecureCrt里面选择Option—>Session option—>port forwarding 。然后点击add,如下图所示:

13898008565439

上图中的32768即是SecureCrt在本地进行监听的端口号。

点击OK之后会在本地看到32768端口正在监听,如下图:

13898009931378

到了这里,双击Firefox的AutoProxy按钮,就可以畅通无阻的走起来了。检测不到里面的数据,这些行为监控之类的代理设备就形同虚设了。