linux squid代理服务器
一. squid代理软件结构介绍
/etc/squid/squid.conf #squid的主配置文件
/etc/squid/mime.conf #squid所支持的Internet上面的文件格式,默认足够用
/usr/sbin/squid #squid的主程序
/var/spool/squid #squid的缓存目录
/usr/lib64/squid/ #提供 squid 额外的控制模块,尤其是影响认证密码方面的程序,都是放在这个目录下的
[root@study06 ~]# rpm -qa | grep 'squid' #检查squid是否安装
[root@study06 ~]# yum -y install squid #安装squid软件
二. squid主配置文件介绍
本部分介绍的是标准的代理模式,用户是需要在浏览器中指定代理服务器才能使用代理的,比较麻烦,一般场景中会设置透明代理,具体请在看完本部分后看第三大部分,
[root@www ~]# vim /etc/squid/squid.conf
# 1. 信任用户与目标控制,透过 acl 定义出 localhost 等相关用户
acl manager proto cache_object <==定义 manager 为管理功能
acl localhost src 127.0.0.1/32 <==定义 localhost 为本机来源
acl localhost src ::1/128
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 <==定义 to_localhost 可联机到本机
acl to_localhost dst ::1/128
# 2. 信任用户与目标控制,定义可能使用这部 proxy 的外部用户(内网)
acl localnet src 10.0.0.0/8 <==可发现底下都是 private IP 的设定
acl localnet src 172.16.0.0/12
acl localnet src 192.168.0.0/16
acl localnet src fc00::/7
acl localnet src fe80::/10
# 上述数据设定两个用户 (localhost, localnet) 与一个可取得目标 (to_localhost)
# 3. 定义可取得的数据端口所在!
acl SSL_ports port 443 <==联机加密的埠口设定
acl Safe_ports port 80 # http <==公认标准的协议使用埠口
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
# 定义出 SSL_ports 及标准的常用埠口 Safe_ports 两个名称
# 4. 定义这些名称是否可放行的标准依据(有顺序喔!)
http_access allow manager localhost <==放行管理本机的功能
http_access deny manager <==其他管理来源都予以拒绝
http_access deny !Safe_ports <==拒绝非正规的埠口联机要求
http_access deny CONNECT !SSL_ports <==拒绝非正规的加密埠口联机要求
<==这个位置为你可以写入自己的规则的位置喔!不要写错了!有顺序之分的!
http_access allow localnet <==放行内部网络的用户来源
http_access allow localhost <==放行本机的使用
http_access deny all <==全部都予以拒绝啦!
# 5. 网络相关参数,最重要的是那个定义 Proxy 协议埠口的 http_port
http_port 3128 <==Proxy 预设的监听客户端要求的埠口,是可以改的
# 其实,如果想让 proxy server/client 之间的联机加密,可以改用 https_port (923)
# 6. 快取与内存相关参数的设定值,尤其注意内存的计算方式
#1个G磁盘缓存,占用10M内存空间。
hierarchy_stoplist cgi-bin ? <==hierarchy_stoplist 后面的关键词 (此例为 cgi-bin)
# 若发现在客户端所需要的网址列,则不快取 (避免经常变动的数据库或程序讯息)
cache_mem 8 MB <==给proxy额外的内存,用来处理最热门的快取数据(需自己加)
# 7. 磁盘高速缓存,亦即放置快取数据的目录所在与相关设定
cache_dir ufs /var/spool/squid 100 16 256 <==默认使用 100MB 的容量放置快取
coredump_dir /var/spool/squid
# 底下的四个参数得要自己加上来喔!旧版才有这样的默认值!
minimum_object_size 0 KB <==小于多少 KB 的数据不要放快取,0 为不限制
maximum_object_size 4096 KB <==与上头相反,大于 4 MB 的数据就不快取到磁盘
cache_swap_low 90 <==与下一行有关,减低到剩下 90% 的磁盘高速缓存为止
cache_swap_high 95 <==当磁盘使用量超过 95% 就开始删除磁盘中的旧快取
# 8. 其他可能会用到的默认值!参考参考即可,并不会出现在配置文件中。
access_log /var/log/squid/access.log squid <==曾经使用过 squid 的用户记录
ftp_user Squid@ <==当以 Proxy 进行 FTP 代理匿名登录时,使用的账号名称
ftp_passive on <==若有代理 FTP 服务,使用被动式联机
#refresh_pattern <regex> <最小时间> <百分比> <最大时间>
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
#regex:使用的是正规表示法来分析网址列的资料,如上面第一行设定为网址列开头是 ftp 的意思。
#最小时间:单位是分钟,当取得这个数据的时间超过这个设定值,则该数据会被判定为旧资料。如上面第一行, 表示当取得的资料超过 1440 分钟时,该资料会被判定为旧数据,若有人尝试读取同样的网址列,那么 squid 会重新抓取该数据,不会使用快取内的旧数据。至于第三行,则表示除了上述的两个开头数据外,其他的数据都是被定义为新的, 因此 squid 只会从快取内抓数据给客户端。
#百分比:这个项目与『最大时间』有关,当该资料被抓取到快取后,经过最大时间的多少百分比时,该数据就会被重抓。
#最大时间:与上一个设定有关,就是这个数据存在快取内的最长时间。如上面第一行,最大时间为 10080 分钟,但是当超过此时间的 20% (2016分钟) 时,这个数据也会被判定为旧资料。
# 上面这四行与快取的存在时间有关,底下内文会予以说明
cache_mgr root <==预设的 proxy 管理员的 email
cache_effective_user squid <==启动 squid PID 的拥有者
cache_effective_group squid <==启动 squid PID 的群组
# visible_hostname <==有时由于 DNS 的问题,找不到主机名会出错,就得加上此设定
ipcache_size 1024 <==以下三个为指定 IP 进行快取的设定值
ipcache_low 90
ipcache_high 95
三. squid配置文件常用修改功能
1. 增加额外目录空间给缓存
tips:了解即可,一般情况下分区足够,直接增加缓存即可,不需要指定额外目录。
[root@www ~]# vim /etc/squid/squid.conf
cache_dir ufs /var/spool/squid 500 16 256
cache_dir ufs /srv/squid 2000 16 256
[root@www ~]# mkdir /srv/squid
[root@www ~]# chmod 750 /srv/squid
[root@www ~]# chown squid:squid /srv/squid
[root@www ~]# chcon --reference /var/spool/squid /srv/squid
[root@www ~]# ll -Zd /srv/squid
drwxr-x---. squid squid system_u:object_r:squid_cache_t:s0 /srv/squid/
[root@www ~]# /etc/init.d/squid restart
2. ACL与http_access
- 管理使用代理的源
- src ip-address/netmask
- src addr1-addr2/netmask
- srcdomain .domain.name
- 管理目标站点能否被代理
- dst ip-addr/netmask
- dstdomain .domain.name
- acl dropdomain dstdomain "/etc/squid/dropdomain.txt" #如果域名经常变动,可以这样操作,防止经常修改主配置,每次修改配置后reload配置即可。
- url_regex [-i] ^http://url #使用正则表达式---全路径匹配
- urlpath_regex [-i] .gif$ #正则表达式---部分路径匹配
[root@www ~]# vim /etc/squid/squid.conf
# http_access 是有顺序的,因此建议你找到底下这个关键词行后,将你的资料加在后面
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
acl vbirdlan src 192.168.1.0/24 192.168.100.0/24
acl dropdomain dstdomain .facebook.com
acl dropsex urlpath_regex /sexy.*jpg$
http_access deny dropdomain <==这三行的『顺序』很重要!
http_access deny dropsex
http_access allow vbirdlan
[root@www ~]# /etc/init.d/squid restart
3. 不要进行某些网站的缓存
[root@www ~]# vim /etc/squid/squid.conf
acl denyphp urlpath_regex \.php$
cache deny denyphp
# 在此档案的最后新增这两行即可!
[root@www ~]# /etc/init.d/squid restart
4. 主机名与管理员的email指定
指定主机名是防止由于DNS解析问题导致squid无法启动,邮箱是在用户报错的时候提示给用户看的。
[root@www ~]# vim /etc/squid/squid.conf
cache_mgr wang_zengyi@126.com <==管理员的 email 呦!
visible_hostname www.centos.com <==直接设定主机名喔!
[root@www ~]# /etc/init.d/squid restart
三. squid服务器的常用功能
1. Proxy 服务放在 NAT 服务器上:通透式代理 (Transparent Proxy)
## 1. 设定 proxy 成为通透式代理服务器的功能!
[root@www ~]# vim /etc/squid/squid.conf
http_port 3128 transparent
# 找到 3128 这行后,在最后面加上 transparent 即可
[root@www ~]# /etc/init.d/squid reload
# 2. 设定防火墙规则
[root@www ~]# vim /usr/local/virus/iptables/iptables.rule
iptables -t nat -A PREROUTING -i $INIF -s 192.168.100.0/24 -p tcp \
--dport 80 -j REDIRECT --to-ports 3128
# 将上述这一行加在最底下 /etc/init.d/iptables save 的上面一行即可!
[root@www ~]# /usr/local/virus/iptables/iptables.rule
2. 设置仅代理不缓存的squid
# 先关闭 squid ,然后删除快取目录,之后再重建快取目录,此时快取目录就空了
[root@www ~]# /etc/init.d/squid stop
[root@www ~]# rm -rf /var/spool/squid/*
[root@www ~]# vim /etc/squid/squid.conf
cache_dir ufs /var/spool/squid 100 16 256 read-only
#cache_dir ufs /srv/squid 2000 16 256
# 额外的那个 /srv/squid 批注掉,然后第一行多个 read-only 字样!
cache_mem 0 MB
# 本来规范有 32MB ,现在不要了!
[root@www ~]# /etc/init.d/squid start
3. 代理的认证功能
tips:一般直接在用户接入网络的时候使用802.1X,这种认证实际不用,了解即可。
[root@www ~]# rpm -ql squid | grep ncsa
/usr/lib64/squid/ncsa_auth <==有的!就是这个验证模块档案!注意完整路径
/usr/share/man/man8/ncsa_auth.8.gz
[root@www ~]# yum install httpd <==apache 软件安装
[root@www ~]# rpm -ql httpd | grep htpasswd
/usr/bin/htpasswd <==就是需要这个帐密建立指令!
/usr/share/man/man1/htpasswd.1.gz
# 1. 先修改 squid.conf 档案内容
[root@www ~]# vim /etc/squid/squid.conf
# 1.1 先设定验证相关的参数
auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/squid_user.txt
auth_param basic children 5
auth_param basic realm Welcome to VBird's proxy-only web server
# 非特殊字体为关键词不可更动,第一行为透过 ncsa_auth 读取 squid_user.txt 密码
# 第二行为启动 5 个程序 (squid 的子程序) 来管理验证的需求;
# 第三行为验证时,显示给用户看的欢迎讯息,这三行可写在最上面!
# 1.2 然后是针对验证功能放行与否的 acl 与 http_access 设定
acl vbirdlan src 192.168.100.0/24 <==修改一下,取消 192.168.1.0/24
acl dropdomain dstdomain "/etc/squid/dropdomain.txt"
acl dropsex urlpath_regex /sexy.*jpg$
acl squid_user proxy_auth REQUIRED <==建立一个需验证的 acl 名称
http_access deny dropdomain
http_access deny dropsex
http_access allow vbirdlan
http_access allow squid_user <==请注意这样的规则顺序喔!验证在最后
# 2. 建立密码数据
[root@www ~]# htpasswd -c /etc/squid/squid_user.txt vbird
New password:
Re-type new password:
Adding password for user vbird
# 第一次建立才需要加上 -c 的参数,否则不需要加上 -c 喔!
[root@www ~]# cat /etc/squid/squid_user.txt
vbird:vRC9ie/4E21c. <==这就是用户与密码啰!
[root@www ~]# /etc/init.d/squid restart