需求
- 支持HTTP、HTTPS多协议代理
- 支持LDAP/AD认证允许代理
- 支持Group组权限划分
- 支持PAC或自定义ACL
一、Squid组权限代理方案
- Squid服务器使用ppp拨号至翻墙环境并调整路由,使外网环境全局翻墙
- Squid配置LDAP/AD认证,定义默认用户组为Employee
- Squid额外配置组认证策略,定义该用户组为VIP
- 为Employee组设置白名单,仅允许部分网站通过代理
- 为VIP组配置黑名单,除黑名单外网站均可通过代理
拓扑示意
配置步骤
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多级代理方案(已弃用)
该方案结构设计比较复杂,且用户体验不佳,已弃用,仅做记录
- 父级代理首先使用ppp拨号至翻墙环境并调整路由,使外网环境全局翻墙
- 开启父级代理的AD认证,仅允许部分账户或组可以认证使用全局代理
- 设置父级代理的可信来源网段/IP,仅允许子级代理或指定IP可使用代理
- 子级代理配置父级代理连接
- 子级代理开启AD认证,仅认证通过后的账户或组可使用代理
- 子级代理配置PAC或指定ACL,仅允许部分网站使用父级代理的翻墙代理,不满足ACL条件的默认使用Direct直通模式
拓扑示意
一、父级代理
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~