Linux下Squid正向/反向代理配置

jopen 9年前

应用场景: 1、正向代理 Squid被数以百计的网络提供商用来为他们的用户提供最好的网页访问,为了提升性能和常用内容来减少带宽squid充分利用客户端和服务端的数据流。Squid还能路由内容请求到服务器,以各种方式构建缓存服务器多层次结构,优化网络吞吐量 2、反向代理(网站内容加速和分发)Squid是一个支持HTTP, HTTPS, FTP的web缓存代理,它能通过缓存和反复使用频繁访问的网页来减少带宽、提高响应速度。Squid被广泛用于访问控制和做前端加速,它能运行在大部分 操作系统平台上,Squid能减少服务器的压力,提高客户端的响应速度,其高级的内容路由配置允许建立集群和负载均衡来处理各种WEB请求,3.2及之后 的版本基本都已支持SMP和多CPU

应用场景:
1、正向代理
Squid被数以百计的网络提供商用来为他们的用户提供最好的网页访问,为了提升性能和常用内容来减少带宽squid充分利用客户端和服务端的数据流。Squid还能路由内容请求到服务器,以各种方式构建缓存服务器多层次结构,优化网络吞吐量
2、反向代理(网站内容加速和分发)


一、正向代理

环境:
Squid
eth0: 10.0.2.15
eth1: 192.168.1.10

Client
eth0: 192.168.1.100


1、Squid 安装
A、yum安装

yum install squid -y

B、编译安装

groupadd squid
useradd -g squid -s /sbin/nologin squid

cd ~/downloads/
wget http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.4.tar.xz
tar -Jxf squid-3.5.4.tar.xz
cd squid-3.5.4

./configure \
--prefix=/usr/local/squid/ \
--localstatedir=/var \ #缓存目录
--mandir=/usr/share/man \
--enable-async-io=200 \ #async模式来运行squid,线程数
--enable-icmp \
--enable-delay-pools \ #延时池,这样能对某些特定的请求限制额定带宽
--enable-kill-parent-hack \ #关掉suqid的时候,连同父进程一起关掉
--enable-epoll \
--enable-snmp \ #可以让MRTG使用SNMP协议对服务器的流量状态进行监测
--enable-cache-digests \ #启用缓存摘要支持
--with-large-files \
--disable-arp-acl \ #禁用对客户端的MAC地址进行管理
--disable-ident-lookups

./configure --prefix=/usr/local/squid/ --localstatedir=/var --mandir=/usr/share/man --enable-async-io=200 --enable-icmp --enable-delay-pools --enable-kill-parent-hack --enable-epoll --enable-snmp --enable-cache-digests --with-large-files --disable-arp-acl --disable-ident-lookups

make && make install


vim /etc /init.d/squid #Squid 启动脚本

#!/bin/bash
# Squid server script
# chkconfig: 2345 86 17
# description: Squid prxoy server

squid_prefix='/usr/local/squid'
squid_pid='/var/run/squid.pid'

start()  {
if [ -e $squid_pid ]; then 
echo "squid already start, nothing "
else 
$squid_prefix/sbin/squid -k parse >> /dev/null 2>&1         #check config_file 
if [ $? -ne 0 ]; then 
    echo "squid config_file is Error "
else 
    echo "Squid is starting..."
    $squid_prefix/sbin/squid -s   
    fi 
    fi
}


stop()  {
if [ ! -e $squid_pid ]; then
echo "squid already start stop, nothing "
else 
    echo "Squid is stoping..."
$squid_prefix/sbin/squid -k shutdown 
    fi
}

status() {
if [ -e $squid_pid ]; then 
echo "squid  (pid  `cat $squid_pid`) is running..."
else 
    echo "Squid is stop"
    fi
}


case $1 in 
start)
  start
              ;;
stop)
          stop 
  ;;
restart)      
          stop 
  sleep 40  #shutdown_lifetime is 30(default)
  start
  ;;
status)
          status
              ;;    
reload)
          echo "Squid is reloading"
  $squid_prefix/sbin/squid -k reconfigure
  ;;
*)
          echo "Usage: $0 {start|stop|restart|status|reload}"
  ;;
esac

chmod a+x /etc/init.d/squid
chkconfig --add squid #加入系统服务
chkconfig squid on

滚动日志(日志切割):
vim /etc/cron.d/squid_cutlog
0 3 * * *  /usr/local/squid/sbin/squid -k rotate           #每天3点切割一次




2、配置Squid

vim /etc/squid/squid.conf #编辑squid主配置文件
#1、规则会依次执行,先执行的先优先生效
#2、先局部后整体,一般先局部拒绝再允许,最后定义一条拒绝策略(匹配完执行)

# 访问控制规则,更多见 http://wiki.squid-cache.org/SquidFaq/SquidAcl

acl 163mail dstdomain .163.com

# URL words
#acl Cooking1 url_regex -i cooking
acl Bad_Url url_regex -i "/usr/local/squid/etc/Bad_Url.lst"

# Local network 
acl Mynetwork src 192.168.1.0/24 
#acl Arp1 arp 01:02:03:04:05:06 

acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7       # RFC 4193 local private network range
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machine


# No Cache Site
acl No_cache dstdomain .2345.com

# Cache delete
acl Purge method PURGE

# Specific User
acl Admin src 192.168.1.11 
acl Manage src 192.168.1.15-192.168.1.25

# Bad Client IP
acl Bad_client src "/usr/local/squid/etc/Bad_client.lst"

# Max Conn
acl Max_conn maxconn 10

# Work time 
acl Work_time time MTWHF 09:00-12:00
acl Work_time time MTWHF 13:00-17:00


cache deny No_cache
always_direct allow 163mail
http_access allow Admin Purge
http_access deny Purge
http_access allow Admin
http_access allow Manage
http_access deny Bad_client
http_access deny Bad_Url
http_access deny Max_conn Mynetwork 
http_access allow MyNetwork Work_time
http_access deny Mynetwork
#http_access allow Mynetwork
http_access allow localnet
http_access allow localhost
http_access deny all

http_port 3128
dns_nameservers 114.114.114.114 8.8.8.8      # DNS服务器,优先级比 ‘/etc/resolv.conf’ 更高

#MyNetwork
acl MyNetwork src 192.168.1.0/24  192.168.18.0/24   # Local_host network
http_access allow MyNetwork


cache_dir ufs /var/cache/squid 100 16 256        #  #100M、16个子目录、256个子子目录,可有多个.
maximum_object_size 4 MB           #4MB, cache的最大文件数

cache_mem 32 MB                     #对象内存缓存,一般设置成服务器内存的一半或更多
half_closed_clients off              #关闭半连接 
cache_swap_high 95               #95,达到%100时删除内容到swap_low值
cache_swap_low 80                #90,
#maximum_object_size_in_memory  512 KB   #512KB,内存cache的最大文件大小 


cache_effective_user squid       #运行用户
cache_effective_group squid

# log 
access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log 
pid_filename /var/run/squid.pid

visible_hostname Proxy.Srv01           #显示名
cache_mgr chenxuwq@163.com       #管理员mail


#数据过期算法,percent为百分比,低于该值则数据不过期
#refresh_pattern  [-i]  regexp  min  percent  max [option]          
# Add any of your own refresh_pattern entries above these.
#
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



chown -R squid:squid /var/cache/squid #缓冲目标权限
/usr/local/squid/sbin/squid -z #创建缓冲区目录

启动squid
/etc/init.d/squid restart #适用yum安装
/usr/local/squid/sbin/squid -f /usr/local/squid/etc/squid.conf


/usr/local/squid/bin/squidclient -p 3128 mgr:info #运行状态信息
/usr/local/squid/bin/squidclient -p 3128 mgr:mem #内存情况
/usr/local/squid/bin/squidclient -p 3128 mgr:diskd #磁盘情况
/usr/local/squid/bin/squidclient -p 3128 mgr:objects
/usr/local/squid/bin/squidclient -p 3128 mgr: #查看更多。。
/usr/local/squid/bin/squidclient -p 3128 PURGE http://www.php-oa.com/static.php #强制更新某个url

/usr/local/squid/sbin/squid -krec #重新载入配置
/usr/local/squid/sbin/squid -k reconfigure|rotate|shutdown|restart|interrupt|kill|debug|check|parse(检查语法) #用法
/usr/local/squid/sbin/squid -N -d1 # debug


3、客户端测试

1、非上网时间访问:
curl --proxy 192.168.1.10:3128 www.cooking.com

<p>Access control configuration prevents your request from being allowed at this time. Please contact your service provider if you feel this is incorrect.</p>


2、访问屏蔽URL关键字
curl --proxy 192.168.1.10:3128 www.baidu.com

<h2>The requested URL could not be retrieved</h2>



二、透明代理(特殊的一种正向代理)

vim etc/squid.conf #配置上同,加入"intercept“
http_port 3128 intercept



vim /etc/sysctl.conf #开启内核端口转发
# Controls IP packet forwarding
net.ipv4.ip_forward = 1

# Controls source route verification
net.ipv4.conf.default.rp_filter = 0

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0


sysctl -p

增加防火墙策略(SNAT):
iptable -A input -j ACCEPT -i lo
iptables -A INPUT -p tcp --dport 3128 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
/etc/init.d/iptables save



参考:
http://www.squid-cache.org/Doc/config/
http://wiki.squid-cache.org/ConfigExamples
http://www.deckle.co.uk/squid-users-guide/



三、反向代理

反向代理服务器又称为 WEB 加速服务器,它位于 WEB 服务器的前端,充当 WEB 服务器的内容缓存加速器,这里根据Squid的联结模式展开讨论:

A、单Squid服务器架构
DNS服务器将解析结果指向Squid,Squid 以轮询方式去后台源服务器上取到数据,最终返回给Client

环境:
DNS/Squid
eth0:192.168.1.10
eth1:192.168.18.10

webServer1
eth0:192.168.1.11

webServer2
eth0:192.168.1.15

Client
eth1:192.168.18.1


1、配置DNS服务器

反向代理结合智能DNS(view)就能实现基本的CDN框架,当不同地区的Client 访问时,DNS服务器将解析结果指向对应地区的Squid 服务器

yum install bind #

vim /etc/named.conf #主配置文件
options {
        listen-on port 53 { 192.168.18.10;
                            192.168.1.10; };
#       listen-on port 53 { any; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { 192.168.18.0/24;
                          192.168.1.0/24; };
#       allow-query     { any; };
        recursion yes;
        dnssec-enable yes;
        dnssec-validation yes;
        dnssec-lookaside auto;
        rrset-order { order cyclic; };

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";


vim  /etc/named.rfc1912.zones        #DNS区域定义

zone "test.org" IN {
        type master;
        file "test.org.zone";
        allow-update { none; };
};

zone "1.168.192.in-adr.arpatest" IN {
        type master;
        file "1.168.192.org.zone";
        allow-update { none; };
};



cd /var/named/
cp -a named.localhost test.org.zone #复制模板区域文件
cp -a named.empty 1.168.192.org.zone


vim test.org.zone #正向区域文件
$TTL 3H
@       IN SOA  ns.test.org. root.test.org. (
                                        1       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@   IN  NS      ns.test.org.

ns  IN  A       192.168.18.10
www IN  A       192.168.18.10



vim 1.168.192.org.zone #反向区域文件

$TTL 3H
@       IN SOA  ns.test.org. root.test.org. (
                                        1       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@       IN NS  ns.test.org.

10      IN PTR http://www.test.org.



/etc/init.d/named start #启动,并加入系统服务
chkconfig named on
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
service iptables save



2、Squid 配置
反向代理的大部分配置和正向代理一样,下面是特别配置:

http_port 80 accel vhost                    #accel设置squid为加速模式,vhost实现实现反向代理
http_port 3128                                 #方便squidclient管理缓存

# 设置后台源服务器
#cache_peer  hostname  type[parent] [sibling] [multicast]  http- port  icp-port [0]  [option]      #no-query 不使用ICP查询源服务器   round-robin 轮 询  weigh=N 权重
cache_peer  192.168.1.11  parent  80  0     no-query  originserver  round-robin  name=webServer1
cache_peer  192.168.1.15  parent  80  0   no-query  originserver  round-robin  name=webServer2

visible_hostname Proxy.Srv01     #显示名


3、Web源服务器设置

3.1. webServer1

yum install httpd
echo "webServer1" > /var/www/html/index.html
service httpd start
chkconfig httpd on

3.2 .webServer2配置基本类似


http://www.test.org/



B、邻居Squid服务器架构(>=2)

DNS服务器将解析结果以轮询方式指向多台Squid,Squid没有缓存时会通过ICP从兄弟Squid上取到数据,最终返回给Client

环境:
DNS/Squid1
eth0:192.168.1.10
eth1:192.168.18.10

Squid2
eth0:192.168.1.15
eth1:192.168.18.15

webServer1
eth0:192.168.1.11
eth0:192.168.18.11

webServer2
eth0:192.168.1.100
eth0:192.168.18.100

Client
eth1:192.168.18.1



http_port 80 accel vhost
icp_port 3130 #ICP查询端口
http_port 3128 #方便squidclient管理缓存

cache_peer 192.168.1.11 parent 80 0 no-query originserver round-robin name=webServer1
cache_peer 192.168.1.100 parent 80 0 no-query originserver round-robin name=webServer2

#squid1、squid2 为兄弟,当 squid1 在其缓存中没有找到请求的资源时, 通过 ICP 查询去其邻居中取得缓存
cache_peer 192.168.1.10 sibling 80 3130
cache_peer 192.168.1.15 sibling 80 3130

#将 www.test.org的请求通过轮询方式转发到三个父节点中的一个
cache_peer_domain webServer1 webServer2 www.test.org


iptables -A INPUT -m state --state NEW -p tcp --dport 3128 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 3130 -j ACCEPT



四:内容过滤插件--SquidGuard

SquidGuard是 Squid的一个过滤插件,该软件会在Squid3处理请求的时候检查SquidGuard所管理的网站分类数据库,并根据自定义的规则进行转向(Redirect)拦截。
http://www.squidguard.org/

1、主程序下载

wget http://www.squidguard.org/Downloads/squidGuard-1.4.tar.gz

2、path 下载:
wget http://www.squidguard.org/Downloads/Patches/1.4/squidGuard-1.4-patch-20091015.tar.gz \
http://www.squidguard.org/Downloads/Patches/1.4/squidGuard-1.4-patch-20091015.tar.gz.md5 \
http://www.squidguard.org/Downloads/Patches/1.4/squidGuard-1.4-patch-20091019.tar.gz \
http://www.squidguard.org/Downloads/Patches/1.4/squidGuard-1.4-patch-20091019.tar.gz.md5 \
http://www.squidguard.org/Downloads/Patches/1.4/squidGuard-1.4-patch-20150201.tar.gz \
http://www.squidguard.org/Downloads/Patches/1.4/squidGuard-1.4-patch-20150201.tar.gz.md5


tar -zxf squidGuard-1.4-patch-20091015.tar.gz -C /opt/downloads/squidGuard-1.4/src/
tar -zxf squidGuard-1.4-patch-20091019.tar.gz -C /opt/downloads/squidGuard-1.4/src/
tar -zxf squidGuard-1.4-patch-20150201.tar.gz -C /opt/downloads/squidGuard-1.4/src/


./configure --prefix=/usr/local/squidGuard
make && make install

groupadd squid
useradd -g squid -s /sbin/nologin squid

wget http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.4.tar.xz
tar -Jxf squid-3.5.4.tar.xz
cd squid-3.5.4
./configure --prefix=/usr/local/squid
make && make install