添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

需求描述: 需要一台可以同时访问外网和内网的主机作为正向代理,代理内网主机与外网通信。这里以squid来实现。

1.squid介绍

Squid是一个缓存Internet数据的软件,其接收用户的下载申请,并自动处理所下载的数据。当一个用户想要下载一个主页时,可以向Squid 发出一个申请,要Squid代替其进行下载,然后Squid连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid把保存的备份立即传给用户,使用户觉得速度相当快。Squid可以代理HTTP、FTP、GOPHER、SSL和WAIS等协议并且Squid 可以自动地进行处理,可以根据自己的需要设置Squid,使之过滤掉不想要的东西。

Squid代理服务器工作在TCP/IP的应用层。

1.1 squid分类

按照代理类型的不同,可以将Squid代理分为正向代理和反向代理,正向代理中,根据实现方式的不同,又可以分为普通代理和透明代理。

  • 普通代理:需要客户机在浏览器中指定代理服务器的地址、端口;
  • 透明代理:适用于企业的网关主机(共享接入Internet)中,客户机不需要指定代理服务器地址、端口等信息,代理服务器需要设置防火墙策略将客户机的Web访问数据转交给代理服务程序处理;
  • 反向代理:是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。不建议使用squid来作为反向代理服务器,如果需要反向代理,还是使用nginx、haproxy等产品比较好。
  • 2. 配置squid服务

    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
    $ yum -y install squid openssl    # 安装squid及openssl
    $ cat /etc/squid/squid.conf # 编写配置文件如下
    # 定义允许哪些网段可以访问此代理,根据实际修改,可以写多行
    acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
    acl localnet src fc00::/7 # RFC 4193 local private network range

    # 定义可以代理的端口,根据实际修改,基本下面的就够用
    acl SSL_ports port 443
    acl Safe_ports port 80 # http
    acl Safe_ports port 21 # ftp
    acl Safe_ports port 443 # https
    acl Safe_ports port 70 # gopher
    acl Safe_ports port 210 # wais
    acl Safe_ports port 1025-65535 # unregistered ports
    acl Safe_ports port 280 # http-mgmt
    acl Safe_ports port 488 # gss-http
    acl Safe_ports port 591 # filemaker
    acl Safe_ports port 777 # multiling http
    acl CONNECT method CONNECT

    http_access allow localnet
    http_access allow localhost
    http_access deny all
    http_port 85

    cache_dir ufs /var/spool/squid 100 16 256

    logformat squid_custom_log [%tl] %>Hs %>a [%<a] "%rm %ru HTTP/%rv" %Ss:%Sh "%{User-Agent}>h"
    access_log daemon:/var/log/squid/access.log squid_custom_log

    coredump_dir /usr/local/squid/var/cache/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

    关于squid支持的指令及解释,请参考 官方文档 ,基本上面的配置就够用了,squid支持的其他指令都有默认值,使用默认值即可。

    这里需要注意下,当squid应用运行了一段时间以后,cache_dir对应目录下的swap.state文件就会变得越来越大,里面的无效接口数据越来越多,这可能影响squid的响应时间,可以配置计划任务,定时清空文件。

    3. 启动squid

    1
    2
    3
    4
    # 设置为开机自启并启动squid服务
    $ systemctl enable squid && systemctl start squid
    $ ss -lnput | grep -w 85 # 确定端口在监听
    tcp LISTEN 0 128 :::85 :::* users:(("squid",pid=2912,fd=16))

    4. 客户端测试

    以下操作在客户端上进行配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 将http代理及https代理写入环境变量并重载配置文件
    $ cat >> /etc/profile << EOF
    export http_proxy=192.168.20.6:85
    export https_proxy=192.168.20.6:85
    EOF
    $ source /etc/profile


    # 执行下面的指令,测试是否可以正常下载
    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.0-x86_64.rpm
    wget http://nginx.org/download/nginx-1.18.0.tar.gz

    客户端只要可以正常下载,则表明squid没问题。

    5. squid维护指令

    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
    # 初始化你在squid.conf里配置的cache目录
    squid -z
    如果有错误提示,请检查你的 cache目录的权限。


    # 验证 squid.conf 的语法和配置。
    squid -k parse
    如果squid.conf 有语法或配置错误,这里会返回提示你,如果没有返回,尝试启动squid。


    # 在前台启动squid,并输出启动过程。
    /usr/local/squid/sbin/squid -N -d1
    如果有ready to server reques相关信息,说明Squid启动成功。
    然后 ctrl + c,停止squid,并以后台运行的方式启动它。


    # 启动squid在后台运行。
    squid -s


    # 停止 squid
    squid -k shutdown


    # 重引导修改过的 squid.conf
    squid -k reconfigure -f /XXX/squid.conf
    当squid进行过配置更改后,可以使用该命令进行squid配置重载。




    # squid命中率分析
    /usr/local/squid/bin/squidclient -p 80 mgr:info
    /usr/local/squid/bin/squidclient -p 80 mgr:5min
    可以看到详细的性能情况,其中PORT是你的proxy的端口,5min可以是60min

    # 取得squid运行状态信息
    squidclient -p 80 mgr:info

    # 取得squid内存使用情况
    squidclient -p 80 mgr:mem

    # 取得squid已经缓存的列表
    squidclient -p 80 mgr:bjects. use it carefully,it may crash

    # 取得squid的磁盘使用情况
    squidclient -p 80 mgr:diskd

    # 强制更新某个url
    squidclient -p 80 -m PURGE http://www.xxx.com/xxx.php