1 环境说明 1.1 软件版本
soft
version
os
CentOS Linux release 7.7.1908 (Core)
squid
4.1-5
squid-helpers
4.1-5
openldap
2.4.44-21
keepalived
1.3.5-19
1.2 ip说明
ip
用途
192.168.92.140
master
192.168.92.141
slave
192.168.92.150
vip
2 安装配置squid 2.1 安装 1 2 3 4 5 6 7 8 9 10 11 vim /etc/yum/squid.repo [squid] name=Squid repo for CentOS Linux - 7 # IL mirror baseurl=http://www1.ngtech.co.il/repo/centos/$releasever/beta/$basearch/ failovermethod=priority enabled=1 gpgcheck=0 yum install -y squid squid-helpers
2.2 配置 1 2 3 4 5 6 cat squid_confd.conf > /etc/squid/squid.conf #squid_confd.conf 见附1 mkdir /data/squid_files -p ln -s /data/squid_files /etc/squid/squid_files touch /etc/squid/squid_files/deny-net #网站黑名单列表 squid -z #创建缓存 systemctl start squid
3 squid相关配置说明 3.1 简单http验证 1 2 3 4 5 6 7 8 9 10 11 12 # 这种认证方式是通过htpasswd命令,生成一个数据库文件,squid通过数据库文件对用户进行校验 htpasswd -cb user.pass fushisanlang zzz #-c代表生成一个文件 -b是通过命令行提交密码 htpasswd -b user.pass fushisanlang zzz #如果已经有相应密码文件,就不用-c参数了 vim /etc/squid/squid.conf auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/squid_files/user.pass #定义squid密码文件,记录所有用户与密码 auth_param basic children 15 #认证进程的数量 auth_param basic credentialsttl 24 hours #认证有效期 auth_param basic casesensitive off #用户名不区分大小写,可改为ON区分大小写 # 通过上述配置可以启用squid的简单认证
3.2 结合windows的ad验证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 因为公司使用windows域进行用户控制,所以研究了一下ldap的认证方式 vim /etc/squid/squid.conf auth_param basic program /usr/lib64/squid/basic_ldap_auth -R -b "dc=fushisanlang,dc=cn" -D "fushisanlang@fushisanlang.cn" -w "xxx" -f sAMAccountName=%s -h 10.110.1.138 # 这里是通过basic_ldap_auth来进行验证,如果是通过编译安装的squid,需要在编译的时候添加--enable-basic-auth=LDAP参数,并且安装openldap-devel依赖,如果是yum安装,则直接安装squid-helpers包即可。 # 启动-b是基础域信息,-D里边是查询时需要用到的用户信息。-w是用户密码。-f是查询的数据,是一个过滤器。-h指定的是ladp服务的地址。 auth_param basic children 5 auth_param basic realm Web-Proxy auth_param basic credentialsttl 1 minute acl ldap-auth proxy_auth REQUIRED #这里是一个配置,用来把所有通过ladp认证的用户定义为一个组,组名叫ldap-auth,方便后续做策略划分 # 在配置时,可能会遇见无法认证的情况。可以通过ldapsearch命令进行验证,如果返回了信息,说明ladp服务连接成功,以下是示例 ldapsearch -x -w Yierer333 -D "fushisanlang@fushisanlang.cn" -b "dc=fushisanlang,dc=cn" -h 10.110.1.138
3.3 acl策略划分 1 2 3 4 5 6 7 8 9 vim /etc/squid/squid.conf acl leader proxy_auth "/etc/squid/squid_files/leader" #通过文件定义用户组 acl intranet dstdom_regex "/etc/squid/squid_files/intranet" #通过文件定义url组 # acl支持多种定义模式 http_access allow intranet http_access deny intranet leader # 通过allow和deny来控制允许还是拒绝,多个参数是与的关系。多条策略从第一条开始匹配,命中后不匹配
3.4 限速配置 1 2 3 4 5 6 7 8 9 delay_pools 1 #开启连接延迟池 delay_class 1 1 #定义延迟池,class类型为1,这个类型有2 3 ,代表整个B类,C类网段,但是网上没有示例,这里直接采用1 delay_parameters 1 2048000/2048000 #20480000 B #这里是指,通过上边定义的延迟池1 进行限速。总带宽是2048000,单个ip带宽是2048000。 这里的单位是B delay_access 1 allow ldap-auth #这个是指,限制整个ldap-auth组的用户,即所有通过ladp认证的用户都遵循此规则 delay_initial_bucket_level 100 #这里是指,初始化的百分比,抄来的,没仔细研究。
3.5 更多配置 squid 配置示例 是官网给出的配置示例,可以用于参考
4 安装配置keepalived 1 2 3 4 5 6 yum install -y keepalived cat keepalived.conf.master > /etc/keepalived/keepalived.conf #master操作,文件见附2 cat keepalived.conf.slave > /etc/keepalived/keepalived.conf #slave操作,文件见附3 cat chk_squid.sh > /data/squid_files/chk_squid.sh #文件见附4 systemctl start keepalived
5 后续配置 5.1 文件同步 1 vim /data/squid_files/notify_conf.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 package mainimport ( "fmt" "os" "os/exec" "path/filepath" "github.com/fsnotify/fsnotify" ) type Watch struct { watch *fsnotify.Watcher } func scpFile (filename string ) { cmd := exec.Command("bash" , "-c" , "scp -pr " +filename+" root@fushisanlang.cn:/data/squid_files" ) cmd.Run() return } func (w *Watch) watchDir (dir string ) { filepath.Walk(dir, func (path string , info os.FileInfo, err error) error { if info.IsDir() { path, err := filepath.Abs(path) if err != nil { return err } err = w.watch.Add(path) if err != nil { return err } } return nil }) go func () { for { select { case ev := <-w.watch.Events: { if ev.Op&fsnotify.Create == fsnotify.Create { scpFile(ev.Name) fi, err := os.Stat(ev.Name) if err == nil && fi.IsDir() { w.watch.Add(ev.Name) } } if ev.Op&fsnotify.Write == fsnotify.Write { scpFile(ev.Name) } if ev.Op&fsnotify.Remove == fsnotify.Remove { fi, err := os.Stat(ev.Name) if err == nil && fi.IsDir() { w.watch.Remove(ev.Name) } } if ev.Op&fsnotify.Rename == fsnotify.Rename { w.watch.Remove(ev.Name) scpFile(ev.Name) } } } } }() } var ( dirs [0 ]string dirs_s []string = dirs[:] ) func main () { watch, _ := fsnotify.NewWatcher() w := Watch{ watch: watch} dir := "/data/squid_files" w.watchDir(dir) select {} }
1 2 go build /data/squid_files/notify_conf.go nohup /data/squid_files/notify_conf &
5.2 日志切割 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 因为是yum安装,日志在/var/log /squid中已经完成了切割,只需要添加一个压缩即可。 # 这个步骤可通系统自带的日志工具操作,也可以自己写脚本操作。我这里为了以后和其他的功能集成,使用了脚本的方式 vim /data/squid_files/gz_log.sh #!/bin/bash #for gz squid log every day #by zhangyin workdir="/var/log/squid/" cd ${workdir} ls * | egrep -v 'log$|out$|gz$' | while read logfile do gzip $logfile done crontab -e 0 8 * * * /bin/bash /data/squid_files/gz_log.sh
6 配置示例 6.1 linux 1 2 3 export http_proxy=http://{user}:{pass}@10.110.1.188:3128 export https_proxy=http://{user}:{pass}@10.110.1.188:3128 export ftp_proxy=http://{user}:{pass}@10.110.1.188:3128
6.2 windows 1 2 3 4 5 6 7 8 9 #在环境变量中添加如下变量后,可以在cmd中生效。 HTTP_proxy=http://{user}:{pass}@10.110.1.188:3128 HTTPS_proxy=http://{user}:{pass}@10.110.1.188:3128 FTP_proxy=http://{user}:{pass}@10.110.1.188:3128 #在浏览器中配置相关代理,即可在浏览器中生效
附件 附件1:squid_confd.conf 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 acl SSL_ports port 443 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 22 # ssh acl Safe_ports port 443 # https acl Safe_ports port 1025-65535 # 自定义端口 acl CONNECT method CONNECT http_access deny !Safe_ports #http_access deny CONNECT !SSL_ports http_access allow localhost manager http_access deny manager http_access allow localhost http_port 3128 coredump_dir /var/spool/squid #refresh_pattern ^ftp: 1440 20% 10080 #refresh_pattern ^gopher: 1440 0% 1440 #refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 #refresh_pattern . 0 20% 4320 ident_lookup_access deny all cache_mem 0 MB #正向代理不需要缓存 maximum_object_size_in_memory 8 MB memory_replacement_policy heap LFUDA #动态使用最小的,移出内存cache cache_replacement_policy heap LFUDA #动态使用最小的,移出硬盘cache cache_dir ufs /data/squid_files/cache 5000 32 512 #高速缓存目录 ufs 类型 refresh_pattern . 0 20% 4320 override-expire override-lastmod reload-into-ims ignore-reload #更新cache规则 cache_effective_user squid #这里以用户squid的身份Squid服务器 cache_effective_group squid icp_port 0 #指定Squid从邻居服务器缓冲内发送和接收ICP请求的端口号。 #这里设置为0是因为这里配置Squid为内部Web服务器的加速器, #所以不需要使用邻居服务器的缓冲。0是禁用 always_direct allow all ignore_unknown_nameservers on ##账号设置 #auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/squid_files/user.pass #定义squid密码文件,记录所有用户与密码 #auth_param basic children 15 #认证进程的数量 #auth_param basic credentialsttl 24 hours #认证有效期 #auth_param basic casesensitive off #用户名不区分大小写,可改为ON区分大小写 # ##用户及黑白名单设置 #acl leader proxy_auth "/etc/squid/squid_files/leader" #设置领导 #acl staff proxy_auth "/etc/squid/squid_files/staff" #设置员工 #acl special-staff proxy_auth "/etc/squid/squid_files/special-staff" #设置特殊员工 # ##acl intranet dstdom_regex "/etc/squid/squid_files/intranet" #设置内网 ##acl extranet dstdom_regex "/etc/squid/squid_files/extranet" # 设置外网 #acl special-extranet dstdom_regex "/etc/squid/squid_files/special-extranet" # 设置特殊外网 #acl deny-net dstdom_regex "/etc/squid/squid_files/deny-net" #设置黑名单 # # ##http_access allow intranet #允许所有人访问内网 ##http_access allow extranet #允许所有人访问内网 ##http_access allow special-staff special-extranet #允许特殊员工访问特殊外网 ##http_access deny deny-net #禁止所有人访问黑名单 ##http_access allow all #允许访问所有非黑名单地址 ##http_access allow leader all #允许领导访问所有网址 #http_access allow leader #允许领导访问所有网址 #http_access deny staff deny-net #禁止普通员工访问黑名单 #http_access allow special-staff special-extranet #允许特殊员工访问特殊外网 #http_access deny special-staff deny-net #禁止特殊员工访问黑名单 #http_access allow all #允许访问所有非黑名单地址 # ##ftp设置 #acl FTP proto FTP #always_direct allow FTP auth_param basic program /usr/lib64/squid/basic_ldap_auth -R -b "dc=ncimall,dc=cn" -D "superman@ncimall.cn" -w "DC@adm1n" -f sAMAccountName=%s -h 10.110.1.138 auth_param basic children 15 auth_param basic realm Web-Proxy auth_param basic credentialsttl 24 hours acl ldap-auth proxy_auth REQUIRED delay_pools 1 #开启连接延迟池 delay_class 1 1 #定义延迟池,class类型为1 delay_parameters 1 2048000/2048000 #20480000 B delay_access 1 allow ldap-auth delay_initial_bucket_level 100 acl deny-net dstdom_regex "/etc/squid/squid_files/deny-net" #设置黑名单 http_access deny deny-net #禁止访问黑名单 http_access allow ldap-auth http_access deny all
附件2:keepalived.conf.master 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ! Configuration File for keepalived global_defs { router_id MASTER-HA } vrrp_script chk_squid_port { script "/data/squid_files/chk_squid.sh" interval 2 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state MASTER interface ens33 mcast_src_ip 192.168.92.140 virtual_router_id 151 priority 101 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.92.150 } track_script { chk_squid_port } }
附件3:keepalived.conf.slave 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ! Configuration File for keepalived global_defs { router_id MASTER-HA } vrrp_script chk_squid_port { script "/data/squid_files/chk_squid.sh" interval 2 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state BACKUP interface ens33 mcast_src_ip 192.168.92.141 virtual_router_id 151 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.92.151 } track_script { chk_squid_port } }
附件4:chk_squid.sh 1 2 3 4 5 6 #!/bin/bash counter=$(netstat -na|grep "LISTEN"|grep "3128"|wc -l) if [ "${counter}" -eq 0 ]; then systemctl stop keepalived fi