Squid+AD认证代理配置


需求

  • 支持HTTP、HTTPS多协议代理
  • 支持LDAP/AD认证允许代理
  • 支持Group组权限划分
  • 支持PAC或自定义ACL

一、Squid组权限代理方案

  1. Squid服务器使用ppp拨号至翻墙环境并调整路由,使外网环境全局翻墙
  2. Squid配置LDAP/AD认证,定义默认用户组为Employee
  3. Squid额外配置组认证策略,定义该用户组为VIP
  4. 为Employee组设置白名单,仅允许部分网站通过代理
  5. 为VIP组配置黑名单,除黑名单外网站均可通过代理

拓扑示意

img

配置步骤

PPTP VPN配置

#1.安装pptp组件
yum install wget ppp pptp pptp-setup -y

#2.关闭防火墙
systemctl stop firewalld && systemctl disable firewalld

#3.设置外网DNS(推荐8.8.8.8)
cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 114.114.114.114

#4.配置VPN全局路由(注意添加本地路由,否则VPN连接后会导致节点失联)
vim /etc/ppp/ip-up

#在exit0前面添加以下内容
ip route delete default
route add -net 172.16.0.0/16 gw {gateway ipaddress}
route add -net 172.26.0.0/16 gw {gateway ipaddress}
ip route add default dev ppp0

#5.创建VPN连接,执行后会自动连接
pptpsetup --create vpn --server 172.16.0.254 --username squid --password ******* --encrypt --start

创建黑、白名单

#示例
[root@localhost ~]# cat /etc/squid/blacklist
.transwarp.io
.transwarp.cn
.baidu.com
[root@localhost ~]# cat /etc/squid/whitelist
.google.com
.github.com
.github.io

Squid代理配置

#1.安装squid组件
yum install squid -y

#2.修改squid配置
vim /etc/squid/squid.conf

#首先拒绝所有非来自公司内网的连接
acl localnet src 172.16.0.0/16  # RFC1918 possible internal network
acl localnet src 172.26.0.0/16  # RFC1918 possible internal network
http_access deny !localnet
#############################LDAP认证设置#############################
#LDAP认证设置,注意修改合适的过滤器以避免结果超限问题
auth_param basic program /usr/lib64/squid/basic_ldap_auth -R -b "OU=Domain Users,DC=transwarp,DC=io" -D "CN=xinchen.luan,OU=Domain Users,DC=transwarp,DC=io" -w "*********"  -h 172.16.20.11 -f "(&(objectClass=user)(sAMAccountName=%s)(mail=*))"
#最大认证进程数
auth_param basic children 50
#认证提示
auth_param basic realm Transwarp Proxy Server
#单次认证有效期
auth_param basic credentialsttl 2 hours
#是否指定用户名大小写
auth_param basic casesensitive off
##########################LDAP用户组权限设置################################
#定义一个扩展acl类,命名为ldapgroup,认证类型为ldap_group_acl
external_acl_type ldapgroup %LOGIN /usr/lib64/squid/ext_ldap_group_acl -d -R -b "DC=transwarp,DC=io" -D xinchen.luan@transwarp.io -w "**************"  -h 172.16.20.11 -f "(&(objectClass=user)(sAMAccountName=%u)(memberOf=CN=%g,OU=Domain Groups,DC=transwarp,DC=io))"
#认证过程DEBUG,默认注释,调试时开启
#debug_options ALL,1 29,9 33,9
##############################ACL定义#######################################
acl CONNECT method CONNECT
#使用扩展类ldapgroup定义vip组,设置AD用户组名
acl vip-group external ldapgroup HQ_OM_G_AccountOperators
#定义员工用户组,要求使用AD认证
acl employee proxy_auth REQUIRED
#定义黑白名单
acl blacklist dstdomain "/etc/squid/blacklist"
acl whitelist dstdomain "/etc/squid/whitelist"
##############################访问权限控制################################
#禁止VIP访问黑名单,除黑名单外全部允许
http_access deny vip-group blacklist
http_access allow vip-group
#允许员工访问白名单,除白名单外全部拒绝
http_access allow employee whitelist
http_access deny all

#其他配置选项保持默认,保存文件

#3.启动服务,测试连接效果
systemctl start squid
systemctl enable squid

#快速重载配置命令
squid -kr

VPN Watchdog配置

# cat /etc/squid/watchdog.sh
#!/bin/bash
while  true
do
  wget -T 10 google.com -O /tmp/google &> /dev/null
  if [ $? -ne 0 ]
  then
    sleep 5
    wget -T 10 google.com -O /tmp/google &> /dev/null
    if [ $? -ne 0 ]
    then
      echo "$(date) vpn seems down, restart it" >> /var/log/watchdog.log
      /usr/bin/pkill pptp
      /usr/sbin/pppd call vpn
    fi
  fi
  sleep 30
done

# cat /etc/squid/vpn_watchdog.service
[Unit]
Description=VPN_Watchdog

[Service]
Type=simple
ExecStart=/etc/squid/watchdog.sh
KillMode=process
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

#启动服务前需要关闭selinux和firewalld,否则VPN拨号会报Permission Denied
ln -s /etc/squid/vpn_watchdog.service /usr/lib/systemd/system/
systemctl daemon-reload && systemctl start vpn_watchdog && systemctl enable vpn_watchdog 

二、Squid多级代理方案(已弃用)

该方案结构设计比较复杂,且用户体验不佳,已弃用,仅做记录

  1. 父级代理首先使用ppp拨号至翻墙环境并调整路由,使外网环境全局翻墙
  2. 开启父级代理的AD认证,仅允许部分账户或组可以认证使用全局代理
  3. 设置父级代理的可信来源网段/IP,仅允许子级代理或指定IP可使用代理
  4. 子级代理配置父级代理连接
  5. 子级代理开启AD认证,仅认证通过后的账户或组可使用代理
  6. 子级代理配置PAC或指定ACL,仅允许部分网站使用父级代理的翻墙代理,不满足ACL条件的默认使用Direct直通模式

拓扑示意

img

一、父级代理

PPTP VPN配置

参考方案一

Squid配置

#1.安装squid组件
yum install squid -y

#2.修改squid配置
vim /etc/squid/squid.conf
#############################LDAP认证设置#############################
#LDAP认证设置,注意修改合适的过滤器以避免结果超限问题
auth_param basic program /usr/lib64/squid/basic_ldap_auth -R -b "OU=Domain Users,DC=transwarp,DC=io" -D "CN=xinchen.luan,OU=Domain Users,DC=transwarp,DC=io" -w "*********"  -h 172.16.20.11 -f "(&(objectClass=user)(sAMAccountName=%s)(mail=*))"
#最大认证进程数
auth_param basic children 50
#认证提示
auth_param basic realm Transwarp Proxy Server
#单次认证有效期
auth_param basic credentialsttl 2 hours
#是否指定用户名大小写
auth_param basic casesensitive off
############################访问权限设置#################################
#允许公司内网访问
acl localnet src 172.16.0.0/16
acl localnet src 172.26.0.0/16 
http_access deny !localnet
#允许子级代理访问(这里是让子级代理服务器跳过认证)
acl child src 172.16.30.177/32
http_access allow child
#仅允许认证用户访问
acl aduser proxy_auth REQUIRED
http_access allow aduser
#拒绝其他所有连接
http_access deny all
#开启auth过程debug,默认注释
#debug_options ALL,1 29,9 33,9
###########################其他配置保持默认即可############################

#3.启动服务,测试连接效果
systemctl enable squid
systemctl start squid
#快速重载配置命令
squid -kr

二、子级代理

#1.安装squid组件
yum install squid -y

#2.修改squid配置
vim /etc/squid/squid.conf
#############################LDAP认证设置#############################
#LDAP认证设置,注意修改合适的过滤器以避免结果超限问题
auth_param basic program /usr/lib64/squid/basic_ldap_auth -R -b "OU=Domain Users,DC=transwarp,DC=io" -D "CN=xinchen.luan,OU=Domain Users,DC=transwarp,DC=io" -w "*********"  -h 172.16.20.11 -f "(&(objectClass=user)(sAMAccountName=%s)(mail=*))"
#最大认证进程数
auth_param basic children 50
#认证提示
auth_param basic realm Transwarp Proxy Server
#单次认证有效期
auth_param basic credentialsttl 2 hours
#是否指定用户名大小写
auth_param basic casesensitive off
##############################ACL定义##################################
acl free-internet dstdomain .google.com .gstatic.com
acl free-internet dstdomain .facebook.com .fbcdn.net
acl free-internet dstdomain .youtube.com
#禁止访问白名单以外的网站
http_access deny !free-internet
#############################父级代理配置##############################
cache_peer 172.16.30.165 parent 3128 0 no-query default
#acl网站使用父级代理
never_direct allow free-internet
never_direct deny all
############################访问权限设置###############################
#允许公司内网访问
acl localnet src 172.16.0.0/16
acl localnet src 172.26.0.0/16 
http_access deny !localnet
#仅允许认证用户访问
acl aduser proxy_auth REQUIRED
http_access allow aduser
#拒绝其他所有连接
http_access deny all
#开启auth过程debug,默认注释
#debug_options ALL,1 29,9 33,9
###########################其他配置保持默认即可############################

#3.启动服务,测试连接效果
systemctl enable squid
systemctl start squid
#快速重载配置命令
squid -kr

三、其他

  • 自定义错误页logo
    /usr/share/squid/icons/SN.png

  • 自定义错误页内容
    /usr/share/squid/errors/zh-cn/

注意:错误页只对http请求有效,https请求会返回浏览器默认错误页
具体参考:https://wiki.squid-cache.org/Features/CustomErrors#Custom_error_pages_not_displayed_for_HTTPS

四、PAC自动发布服务

基于web.py实现PAC文件发布,且白名单文件更新时PAC会随之更新,无需重启服务

import web

urls = (
    '/', 'index',
    '/transwarp.pac', 'pac',
    '/blacklist', 'blacklist',
    '/whitelist', 'whitelist',
)

#PAC头部内容
head = '''var FindProxyForURL = function(init, profiles) {
    return function(url, host) {
        "use strict";
        var result = init, scheme = url.substr(0, url.indexOf(":"));
        do {
            result = profiles[result];
            if (typeof result === "function") result = result(url, host, scheme);
        } while (typeof result !== "string" || result.charCodeAt(0) === 43);
        return result;
    };
}("+auto switch", {
    "+auto switch": function(url, host, scheme) {
        "use strict";
'''
#PAC尾部内容
foot = '''
        return "+__ruleListOf_auto switch";
    },
    "+__ruleListOf_auto switch": "DIRECT",
    "+Squid": function(url, host, scheme) {
        "use strict";
        if (/^127\.0\.0\.1$/.test(host) || /^::1$/.test(host) || /^localhost$/.test(host)) return "DIRECT";
        return "PROXY proxy.transwarp.io:3128";
    }
});'''

class index:
    def GET(self):
        return "Transwarp Proxy Server \nContact: it-service@transwarp.io"

class pac:
    def GET(self):
        #新建一个空list用于存放pac条目
        list = []
        #获取白名单网站
        for line in open('/etc/squid/whitelist'):
            site = line[1:].replace(".","\.").strip('\n')
            #拼接pac语法
            content = "        if (/(?:^|\.)"+site+"$/.test(host)) return \"+Squid\";"
            list.append(content)
        #添加换行,拼接头部和尾部内容,返回完整pac文件
        pac = "\n".join(list)
        data = head + pac + foot
        return data

#黑名单列表
class blacklist:
    def GET(self):
        f=open('/etc/squid/blacklist','r')
        data=f.read()
        f.close()
        return data

#白名单列表
class whitelist:
    def GET(self):
        f=open('/etc/squid/whitelist','r')
        data=f.read()
        f.close()
        return data

if __name__ == "__main__":
    app = web.application(urls, globals())
    app.run()

最后,Have a nice day~


评论