转自:http://hi.baidu.com/owee/blog/item/53e74889355c53b20f24445d.html

文章写的很好!值得推荐!

LINUX网络工程师教程
2007-04-19 12:57

SQUID代理服务器
教学内容:
■     代理服务器概述
■     Squid安装和配置
■     Squid配置案例
教学目标:
■ 了解代理服务器工作原理
■ 理解Squid服务器配置选项
■     掌握Squid服务器的安装和配置
教学重点:
■ Squid的安装和配置
■ Squid配置选项
教学难点:
■ 透明代理
一.     代理服器概述
1.     什么是代理服务器
代理服务器(Proxy Server)是指代理服务的双宿主主机,是个人网络和Internet服务商之间的中间代理机构,它负责转发合法的网络信息,对转发进行控制和登记。代理服务器作为连接Internet(广域网)与Intranet(局域网)的桥梁
2.     代理服务器的功能
     充当局域网与外部网络的连接出口
     作为防火墙
     网址过滤和访问权限限制
     提高访问速度
3.     代理服务器的工作过程

(1)     客户机发送访问请求给代理服务器
(2)     代理服务器联系客户机请求的服务器,缓存客户访问内容
(3)     客户机访问代理服务器的缓存
4.     代理服务器的优缺点
(1)     优点
     保护内部主机免受外部主机的***
     提供高速的缓存功能
     在应用网关上可以强制执行用户的身份认证
     内容过滤和简化包过滤
     具有完整的日志
(1)     缺点
     支持的协议有限
     不能防止数据驱动侵袭
     建立了一个网络的服务瓶颈
5.     Squid简介
     Squid是一个高性能的代理缓存服务器,它支持FTP、GOPHER和HTTP协议
     Squid支持SSL,支持访问控制
     Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户请求
     Squid代理服务器可以分为:普通代理服务器、透明代理服务器、反向代理服务器
二.     Squid的安装和配置
1.     安装Squid
(1)RPM包方式
#rpm   -ivh   squid-2.5.STABLE1-2.i386.rpm(1#CD)
(2)编译方式
#tar   -xzvf   squid-2.5.STABLE.tar.gz
#cd    squid-2.5.STABLE
#./configure --prefix=/var/squid  
--sysconfdir=/etc  
--enable-arp-acl  
--enable-linux-netfilter  
--enable-pthreads  
--enable-err-language="Simplify_Chinese"  
--enable-storeio=ufs,null  
--enable-default-err-language="Simplify_Chinese"  
--enable-auth="basic"  
--enable-baisc-auth-helpers="NCSA"  
--enable-underscore
#make
#make   install
       相关文件:
           /etc/squid/squid.conf       squid的主配置文件
           /etc/squid/errors          报告错误使用的语言
           /etc/squid/ mib.txt         Squid-MIB定义文件
           /etc/squid/mime.conf      定义MIME-TYPE
           /etc/squid/msntauth.conf   MSNT认证的配置文件
           /usr/sbin/squid           Squid主程序
           /usr/sbin/squidclient      统计显示摘要表的客户程序
           /usr/lib/squid/*_auth     Squid的各种认证库文件
2.     Squid的配置
(1)     Network Options(网络设置选项)
     http_port   端口号
监听客户请求的端口,默认3128
     icp_port   端口号
和其它squid发送和接收ICP查询时监听的端口,0表示禁止
     mcast_groups    IP地址
指定一个多播组,可以接收多播形式的ICP查询,例:mcast_groups   239.128.16   224.0.1.20
     htcp_prot     端口号
同其它相邻的缓存服务器之间发送和接收HTCP查询时监听的端口,0:禁用
     tcp_outgoing_address   IP地址
用于采用HTCP和CARP方式同其它服务器通信,默认255.255.255.255
     udp_incoming_address    IP地址
接收其它缓存服务器的ICP数据报时使用的地址,默认0.0.0.0
     udp_outgoing_address   IP地址
发送ICP数据报到其它缓存服务器时用的地址,默认255.255.255.0
(2)     多缓存服务器设置选项
     cache_peer   hostname   type   http_port   icp_port   options
指定网络中其它的缓存服务器,默认为none。
Hostname:另一台缓存服务器的主机名
Type: parent/sibling /multicast(父/同级/多播)
http_port:目的服务器的http端口
icp_port:目的服务器的ICP端口
options:
–     proxy-only:仅去获取数据,但不在本地缓存
–     no-query: 不发送ICP查询给此主机
–     default:默认的父服务器
–     login   username:passwd:连接对方通过服务器用户名和密码
–     no-netdb-exchange   代理服务器之间彼此不交换信息
–     round-robin    当有多个代理服务器可用时,本地代理服务器采用轮转算法
     cache_peer_domain   服务器主机名    域名
用来限定查询相邻的缓存服务器的域
     dead_peer_timeout   N   seconds
设置Squid在确定父(同)级缓存服务器不可用之前的等待时间
(3)     缓存大小设置选项
     cache_mem   N(KB/MB/bytes,默认为bytes)
缓存内存大小
     cache_swap_low(percent,0-100)
缓存对象交换的最低点
     cache_swap_high(percent,0-100)
缓存对象交换的最高点
     maximum_object_size
缓存对象的最大大小
     minimum_object_size
缓存对象的最小大小
     maximum_object_size_in_memory
在内存中缓存的最大的对象大小
     ipcache_size 4096:
ip对应cache的大小为4096fqdncache_size 4096:
     fqdncache_size 4096
域名全称cache的大小为4096
(4)     日志文件路径及CACHE的目录设置选项
     memory_replacement_policy   heap GDSF/heap LRU/LRU/heap LFUDA
内存替换策略
heap GDSF:双重大小贪婪法
LRU:默认,最近最少使用算法
heap LFUDA:最近最不常用被老化法
heap LRU:堆LRU
     cache_replacement_policy   heap GDSF/heap LRU/LRU/heap LFUDA
缓存替换策略
     cache_dir   类型    路径    大小(M)   一级子目录    二级子目录
系统使用的存储类型
类型: UFS|AUFS,默认使用UFS,AUFS用于非同步的I/O设备
实例:cache_dir ufs /usr/local/squid/cache 25000 16 256
     cache_access_log /var/log/squid/access.log
access.log日志文件路径
     cache_log   /var/log/squid/cache.log
缓存日志文件的目录和文件
     emulate_httpd_log   on/off
激活仿真HTTP格式的日志
     mime_table   /etc/squid/mime.conf
mime文件路径
     pid_filename   /var/ran/squid.pid
指定pid文件和路径
     ftp_user   用户名@域名
指定匿名FTP密码
     ftp_list_width    数字
指定FTP列表的文件名长度
     ftp_passive    on/off
以被动模式(on)/主动模式(off)
     cache_dns_program    /usr/lib/squid/
指定DNS查询程序路径
编译时指定:--disable-internal-dns option
     dns_children 数字
指定本地默认启动DNS查询进程数
     dns_nameservers   IP地址
DNS服务器地址
     diskd_program   /usr/lib/squid/diskd
磁盘管理程序
     unlinkd_program usr/lib/squid/unlinkd
删除文件程序
     pinger_program   /usr/lib/squid/
ping程序
编译时指定:--enable-icmp option
     redirect_program   none
URL重点向程序
     redirect_children   数字
重点向进程数
     redirect_rewrites_host_heade    on/off
重点向时重写包头(用加速器时勿用)
     authenticate_program   路径
认证程序
例:authenticate_program /usr/bin/ncsa_auth /usr/etc/passwd
     authenticate_children   数字
认证程序的进程数
     authenticate_ttl     数字   hour/minutes/seconds
认证有效时间
     authenticate_ip_ttl  
对一个IP一次认证后多长时间有效
此时在同一个IP有第二个用户认证会失败
(5)     调整Cache的选项
     request_header_max_size    数字(KB)
最大http请求头
     request_body_max_size     数字(KB)
最大http请求数据内容
     reply_body_max_size   数字(KB)
最大返回数据,可限制用户下载的数据大小
     reference_age   数字
LRU算法中指定LRU时间
     quick_abort_min     数字(KB)
断点续传最小值
     quick_abort_max    数字(KB)
断点续传最大值
     quick_abort_pct    数字(percent)
超过值认为续传成功
     negative_ttl    数字 minutes/hours/seconds
否定回答TTL
     positive_dns_ttl    数字   minutes/hours/seconds
DNS肯定回答TTL
      range_offset_limit    数字   KB/MB/Bytes
请求SQUID预取数据的大小
(6)     定义超时的选项
     connect_timeout:SQUID等待客户请求的服务器回应的时间长度
     peer_connect_timeout:一个对等的缓存服务器的TCP连接超时时间
     client_lifetime:客户端同代理服务器TCP连接的最大时间长度
     read_timeout:读入数据超时
     request_timeout:客户端请求最大时间
     shutdown_lifetime:关闭squid缓存时间
(7)     定义超时的选项
     acl:定义一个访问列表
          格式:acl     aclname    acltype   string
类型:(acltype)
•     src:源地址
•     dst:目标地址
•     srcdomain:原(客户)名称
•     dstdomain:目标名称
•     time:时间
•     url_regex[-i]:URL中的正则表达式匹配
•     urlpath_regex[-i]:略去协议和主机名的正则表达式
•     proxy_auth:通过外部程序进行用户验证
•     maxconn:单IP最大连接数
•     port:端口
•     myip:本地IP
•     srcdom_regex [-i]:匹配客户名
•     dstdom_regex [-i]:匹配目标名
•     aclname myport:我的端口
•     aclname proto:协议,http,ftp..
•     aclname method:方法,   GET POST
•     aclname browser:匹配User-Agent header
•     aclname ident:用户方用户名
•     aclname ident_regex [-i]:匹配用户方用户名
•     aclname proxy_auth username:指定合法用户
•     用REQUIRED表示所有合法用户
     http_access:代理访问控制
格式:http_access   allow|deny   [!] acl_name
     icp_access:icp访问控制
格式:icp_access   allow|deny   [!]acl_name
     cache_peer_access:其它缓存服务器访问控制
格式:cache_peer_access    cache_host   allow|deny [!]acl_name
(8)     管理员参数选项
     cache_mgr     mail地址:管理员电子邮件
     cache_effective_user   用户名:运行身份
     cache_effective_group   组名:运行组身份
(9)     CACHE注册服务选项
     announce_period   数字:发布缓存通告频率
     announce_host    主机名:通告的主机
     announce_file    文件名:通告的信息
     announce_port   端口号:通告的对方端口
(10)     HTTPD加速选项
     httpd_accel_host   主机名/vitual:加速某服务器访问
     httpd_accel_port   端口号:加速服务器的对方端口
     httpd_accel_single_host    on/off:多台服务器时设置off
     httpd_accel_with_proxy on/off:即作为加速器,又作为WEB缓存服务器,设置为on
     httpd_accel_uses_host_header    on/off:为on,能支持不同的http协议
(11)     杂项
     logfile_rotate 0-9:日志轮换版本数
     append_domain   域名:默认域名
     tcp_recv_bufsize    数字(KB):TCP缓存区大小
     err_html_text    字符串:包含在错误消息中的文本
     deny_info:禁用时显示消息
格式:deny_info     err_page_name        acl
     visible_hostname   主机名
错误消息中显示的服务器名称
     error_directory 路径:指定错误消息文件目录





netfilter/iptables常用术语
•表
•链
•规则
⑴ 表
含义:提供独立的功能,每张表中由若干链组成
种类:FILTER(默认)   :包过滤
        NAT           :地址转换
        MANGLE      :QOS
⑵ 链
含义:是表的组成部分,细分表的具体功能,每条链由若干条规则构成
种类:INPUT
        OUTPUT
        FORWARD
        POSTROUTING   (对出去的数据包进行路由选择)
        PREROUTING   (对进来的数据包进行路由选择)
        用户自定义链
注:FILTER   :   INPUT           OUTPUT          FORWARD
     NAT      :   OUTPUT         POSTROUTING    PREROUTING
     MANGLE :   PREROUTING    OUTPUT    INPUT    POSTROUTING   FORWARD
⑶ 规则
含义:是一种包含条件的判断语句,用于确定如何处理数据包
   种类:     ACCEPT    Drop     FORWARD    REJECT     SNAT    DNAT
          LOG       TOS       REDIRECT    MASQUERRADE
a)     各表之间的关系






(12)     iptables的使用
a)     安装iptables
# rpm –ivh iptables-1.2.7a-3.i386.rpm
相关文件:
/etc/rc.d/init.d/iptables       (启动脚本)
/usr/sbin/iptables           (配置工具)
/usr/sbin/iptables-save       (保存规则到/etc/sysconfig/iptables文件中)
/usr/sbin/iptables-restore     (恢复/etc/sysconfig/iptables文件中的规则)

b)     iptables的语法
命令格式:
   # iptables [-t 表名] 命令 [链]   [规则号]   [条件]   [规则]
说明:⑴ -t 表名     指定规则所在的表。表名可以是 filter ,nat ,mangle (小写)
⑵   命令 (iptables的子命令)
-A         在指定链中添加规则
-D         在指定链中删除指定规则
-R         修改指定链中指定规则
-I          在指定规则前插入规则
-L         显示链中的规则
-N         建立用户链
-F         清空链中的规则
-X         删除用户自定义链
-P          设置链的默认规则
-C          用具体的规则链来检查在规则中的数据包
-h         显示帮助
     ⑶ 条件 
–i 接口名                         指定接收数据包接口
-o 接口名                         指定发送数据包接口
-p [!]协议名                        指定匹配的协议 (tcp , udp , icmp , all )
-s [!]ip地址 [/mask]                 指定匹配的源地址
--sport [!]端口号 [:端口号]          指定匹配的源端口或范围
-d [!]ip地址 [/mask]                 指定匹配的目标地址
--dport [!]端口号 [:端口号]          指定匹配的目标端口或范围
--icmp –type [!]类型号/类型名         指定icmp包的类型
注:8 表示request       0 表示relay (应答)
      -m   port   --multiport          指定多个匹配端口
          limit   --limit              指定传输速度
          mac   --mac-source        指定匹配MAC地址
          sate   --state NEW,ESTABLISHED,RELATED,INVALID      指定包的状态
注:以上选项用于定义扩展规则
-j   规则                            指定规则的处理方法
           ⑷   规则
            ACCEPT    :接受匹配条件的数据包(应用于I NPUT ,OUTPUT ,FORWARD )
            Drop       :丢弃匹配的数据包(应用于INPUT ,OUTPUT ,FORWARD )
            REJECT     :丢弃匹配的数据包且返回确认的数据包
            MASQUERADE :伪装数据包的源地址(应用于POSTROUTING且外网地址
为动态地址,作用于NAT )
            REDIRECT   :包重定向 (作用于NAT表中PREROUTING ,OUTPUT,使用要加上--to-port   端口号 )
            TOS         :   设置数据包的TOS字段(应用于MANGLE,要加上--set-tos 值)
            SNAT        :     伪装数据包的源地址(应用于NAT表中POSTROUTING链,要加上--to-source   ip地址 [ip地址] )
            DNAT        :     伪装数据包的目标地址(应用于NAT表中PREROUTING链,要加上--to-destination ip地址 )
            LOG         :使用syslog记录的日志
            RETURN     :直接跳出当前规则链
c)     iptables子命令的使用实例
    ⑴    添加规则
      #iptables –A INPUT –p icmp –-icmp-type 8 –s 192.168.0.3 –j Drop
(拒绝192.168.0.3主机发送icmp请求)
     # iptables –A INPUT –p icmp –-icmp-type 8 –s 192.168.0.0/24 –j Drop
       (拒绝192.168.0.0网段ping 防火墙主机,但允许防火墙主机ping 其他主机)
     # iptables –A OUTPUT –p icmp –-icmp-type 0 –d 192.168.0.0/24 –j Drop
       (拒绝防火墙主机向192.168.0.0网段发送icmp应答,等同于上一条指令)
     # iptables –A FORWARD –d www.sina.com -j Drop
       (拒绝转发数据包到www.sina.com,前提是www.sina.com必须被解析)
     # iptables –t nat –A POSTROUTING –s 192.168.0.0/24 –j SNAT –-to-source 211.162.11.1
       (NAT,伪装内网192.168.0.0网段的的主机地址为外网211.162.11.1,这个公有地址,使内网通过NAT上网,前提是启用了路由转发)
     # iptables –t nat –A PREROUTING –p tcp --dport 80 –d 211.162.11.1 –j DNAT -–to-destination 192.168.0.5
         (把internet上通过80端口访问211.168.11.1的请求伪装到内网192.168.0.5这台WEB服务器,即在iptables中发布WEB服务器,前提是启用路由转发)
       # iptables –A FORWARD –s 192.168.0.4 –m mac --mac-source 00:E0:4C:45:3A:38 –j ACCEPT
         (保留IP地址,绑定 IP地址与MAC地址)
     ⑵删除规则
       # iptables –D INPUT   3
       # iptables –t nat –D OUTPUT –d 192.168.0.3   –j   ACCEPT
     ⑶插入规则
       # iptables –I FORWARD 3 –s 192.168.0.3   –j Drop
       # iptables –t nat –I POSTROUTING 2 –s 192.168.0.0/24 –j Drop
     ⑷修改规则
       # iptables –R INPUT 1 –s 192.168.0.2 –j Drop
     ⑸显示规则
       # iptables –L (默认表中的所有规则)
       # iptables –t nat –L POSTROUTING
     ⑹清空规则
       # iptables –F
       # iptables –t nat –F PREROUTING
     ⑺设置默认规则
       # iptables –P INPUT ACCEPT
       # iptables –t nat –P OUTPUT Drop
       (注:默认规则可以设置为拒绝所有数据包通过,然后通过规则使允许的数据包通
过,这种防火墙称为堡垒防火墙,它安全级别高,但不容易实现;也可以把默认
规则设置为允许所有数据包通过,即鱼网防火墙,它的安全级别低,实用性较差。)
⑻建立自定义链
   # iptables –N wangkai
⑼删除自定义链
   # iptables –X wangkai
⑽应用自定义链
   # iptables –A wangkai –s 192.168.0.8   –j Drop
   # iptables –A INPUT –j wangkai
   (注:要删除自定义链,必须要确保该链不被引用,而且该链必须为空,如要删除上例定义的自定义链方法为:# iptables –D INPUT –j wangkai
# iptables   -F wangkai
# iptables   -X wangkai              
(13)     启动iptables和保存iptables规则
a)     启动iptables
# service iptables start
     2.   保存规则
方法一:将规则写入iptables 的启动脚本
   #v/etc/rc.d/init.d/iptables 在start()函数中写入要保存的规则
方法二:将规则写入一个自定义的脚本,再把该脚本放如rc.local中,要注意的是建立脚本是要输入iptables的绝对路径:/sbin/iptables
方法三:# service iptables save
         (将内存中的规则保存到/etc/sysconfig/iptables中,重启系统时,iptables的启动脚本会利用iptables-restore 来恢复该文件中的规则)
方法四:# iptables-save>/etc/sysconfig/iptables
         (该命令等同与上一条命令)     
(14)     配置案例
要求:•设置防火墙主机能够给局域网中的主机动态分配IP地址
         •设置防火墙主机具有SNAT功能,代理内网中的主机接入Internet
         •设置防火墙主机拒绝icmp 数据包
         •设置防火墙主机发布内网中的Web服务器和FTP服务器
         •设置防火墙主机禁止内网主机访问www.QQ.com;
   配置过程:
1.     DHCP服务的配置
⑴ # rpm –ivh dhcpd-3.11pl.i386.rpm
⑵ # vi /etc/dhcpd.conf
    ddns-update-style none;
    ignore client-updates;
    default-lease-time 3600;
    max-lease-time 7200;
    subnet 192.168.0.0 netmask 255.255.255.0 {
    option routers 192.168.0.1;
    options domain-name-servers 202.162.38.254;
    range 192.168.0.4   192.168.0.254;
    }
⑶ # vi /etc/sysconfig/dhcpd
     DHCPDARGS =eth0
⑷ # service dhcpd start
2.     启用防火墙主机的路由转发功能
   # vi /etc/rc.d/rc.local
echo “1” >/proc/sys/net/ipv4/ip_forward
3.     配置iptables
   ⑴ # rpm –ivh iptables-1.2.7a-3.i386.rpm
   ⑵ # service iptables start
   ⑶ # iptables –F
# iptables –t nat –F
# iptables –t mangle –F
# iptables –P INPUT Drop
# iptables –P OUTPUT Drop
# iptables –P FORWARD Drop
# iptables –t nat –A   POSTROUTING –s 192.168.0.0/24 –j SNAT -–to-source
                 202.162.39.1
        # iptables –A   FORWARD –s 192.168.0.0/24 –m state –state NEW –j   ACCEPT
        # iptables –A   FORWARD–m state –state ESTABLISHED,RELATED –j   ACCEPT
        # iptables –t nat –A PREROUTING –d 202.162.39.1 –p tcp -–dport 80 –j DNAT
                     --to-destination 192.168.0.2
        # iptables –t nat –A PREROUTING –d 202.162.39.1 –p tcp -–dport 21 –j DNAT
                     --to-destination 192.168.0.3
        # iptables –I FORWARD –s 192.168.0.0/24 –d www.QQ.com -j Drop
(4) # service iptables save