• 2007-09-04

    squid+iptable+linux策略路由架设proxy全过程

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://happyman-bruce.blogbus.com/logs/8090937.html

    这是兄弟我将近一个星期的心血,终于做成了,现整理一下,拿出来和大家分享一下吧!
    有哪些地方说的不对,请各位指出来,共同学习.

    参考文档:
    http://iptables-tutorial.frozent ... rial-cn-1.1.19.html
    http://bbs.chinaunix.net/viewthread.php?tid=477137
    http://bbs.chinaunix.net/viewthread.php?tid=281136
    http://blog.platinum.net.cn/inde ... eId=59&blogId=1
    http://bbs.chinaunix.net/viewthr ... p;extra=&page=1
    http://www.chinaunix.net/jh/4/293819.html
    http://bbs.chinaunix.net/viewthread.php?tid=559519
    http://bbs.chinaunix.net/viewthread.php?tid=602090
    http://iptables-tutorial.frozent ... rial-cn-1.1.19.html
    http://www.linuxaid.com.cn/engin ... /policy_pouting.htm
    http://bbs.chinaunix.net/viewthread.php?tid=304033
    http://chinaunix.net/jh/38/505206.html
    http://www.vbird.org/linux_server/0420squid.php
    多谢这些高手的奉献!

    先说一下我的架设环境:
    我们用的本是教育网,有一万多用户,为了提高对电信站点的访问速度,买一条100M带宽的电信出口,
    要求是做一个代理服务器,能供校内所有用户使用,用户访问电信站点时代理服务器要从电信出口
    出去捕捉资料,而用户访问教育网站点时,仍从教育网出口出去捕捉资料.
    为实现这个目标,我分了三步:
    1,配置proxy server的路由
    2.配置squid
    3.配置iptables

    下面进行第一步:配置proxy server的路由:
    说一下我的服务器网络介质情况:
    网卡:eth0   连外网(电信网络)
    IP: 218.28.172.x/255.255.255.0
    网关:218.28.172.1

    网卡:eth1     连内网(校园网)
    IP  :202.196.x.x/255.255.255.0
    网关:202.196.x.1

    现在我们再来解读一下要求:"用户访问电信站点时代理服务器要从电信出口出去捕捉资料,
       而用户访问教育网站点时,仍从教育网出口出去捕捉资料".实际是就是要求服务器"用户访问
       电信站点时代理服务器要从网关218.28.172.1(电信路由)出去,而用户访问教育网站点时,
       从网关202.196.x.1(教育网路由)出去捕捉资料."
    这就简单了,用linux基于路由策略的IP地址控制不就可以实现吗?如果你对基于路由策略的IP地址控制
    不了解可以到这几个地方看看:
       http://www.linuxaid.com.cn/engin ... /policy_pouting.htm
       http://bbs.chinaunix.net/viewthread.php?tid=304033
       http://iptables-tutorial.frozent ... rial-cn-1.1.19.html
    说明一下,我这里用的是linux基于路由策略的IP地址控制,也就是用route,而不是用NAT,
    route和nat是有区别的,引用platinum老大的话说就是:
    "NAT 和路由是不同的,
    NAT 用 iptables 实现,路由用 route 实现,
    iptables 负责地址欺骗,route 负责路径选,
    这个初学者容易混淆."
    如果你想搞懂它们,可以到http://blog.platinum.net.cn/inde ... eId=59&blogId=1
                           http://bbs.chinaunix.net/viewthr ... p;extra=&page=1和上面几个网页
    还有其它地方去多看看,这里不作过多说明.


    先说一下我对这个路由配置的想法,由于教育网的IP地址相对比较集中,而且也是太多,所以我可以把默认路由设为
    电信的,然后再建一个特殊的路由表,路由是我的教育网的网关,当服务器访问教育网IP时,就让它走这条特殊路由,
    其余的不管它,一律走电信路由,下面就来实现这个想法.

    查看一下我的路由,
    # /sbin/ip route ls
    218.28.172.0/24 dev eth0  proto kernel  scope link  src 218.28.172.x
    202.196.x.0/24 dev eth1  proto kernel  scope link  src 202.196.x.x
    169.254.0.0/16 dev eth1  scope link
    default via 202.196.x.1 dev eth0

    这说明我的默认路由是教育网的202.196.x.1,现在我把它改成想要的电信的,
    #ip route replace default via 218.28.172.1 dev eth1 table main

    # /sbin/ip route ls
    218.28.172.0/24 dev eth0  proto kernel  scope link  src 218.28.172.x
    202.196.x.0/24 dev eth1  proto kernel  scope link  src 202.196.x.x
    169.254.0.0/16 dev eth1  scope link
    default via 218.28.172.1 dev eth1
    这样就行了,默认路由改成电信的了.

    然后建立特殊路由表:
    #vi /etc/iproute2/rt_table
    #
    # reserved values
    #
    255    local
    254    main
    253    default
    #0      unspec
    200     edu
    #
    # local
    #
    #1      inr.ruhep

    看到没,
    200     edu
    这一行就是我新加的,自定义编号为200,名字为edu.
    下面向edu路由中添加它自己的默认路由
    #/sbin/ip route add default via 202.196.x.1 table edu
    注意,这个table edu一定不要忘了写,否则写到了主路由表中.

    先看看机器当前的ip rule
    #/sbin/ip rule ls
    0:      from all lookup local
    32766:  from all lookup main
    32767:  from all lookup default
    可以看到,规则中走了3个路由表,local、main、default
    我们平常用route看到的,实际是路由表main
    这些规则是按序号大小顺序走的,一个不同,则走下一个,知道通路或走完为止

    开始添加我们自己的路由edu到路由表中
    #/sbin/ip rule add to 59.76.0.0/16 pref 10000 table edu
    这个意思是说,去向IP地址范围为59.76.0.0/16的访问,则启用edu的路由表中的路由规则
    而edu的路由规则是什么呢?上面已经设置了,走的是202.196.x.1的路由.
    现在再来看一下当前的ip rule
    #/sbin/ip rule ls
    0:      from all lookup local
    10000:  from all to 59.76.0.0/16 lookup edu
    32766:  from all lookup main
    32767:  from all lookup default

    这里59.76.0.0/16只是教育网的一个IP地址段,还有其它的,可以依照上面的命令一直到添加为止.
    这样,我的路由控制就做好了.下面做第二步吧.

    第二步:配置squid

    呵呵~.这个就不多说了吧,坛子里面这方面的文章多的不能再多了,
    我只简单说一下我的配置:
    squid安装,你可以自己用rpm or Tarball安装,我这个机器系统是FC4.是老师装上的,安装时squid已经带上了.

    squid.conf:
    http_port 8080
    cache_mem 1024 M
    cache_swap_low 75
    cache_swap_high 95
    maximum_object_size 4096 KB
    cache_dir ufs /var/spool/squid 45000 16 256
    cache_access_log /var/squid/logs/access.log
    cache_log /dev/null
    cache_store_log none
    debug_options ALL,1

    icp_access allow all
    icp_query_time out 2000

    cache_effective_user squid
    cache_effective_group squid


    httpd_accel_with_proxy on
    httpd_accel_uses_host_header on
    acl all src 0.0.0.0/0
    acl office     src 202.x.112.0-202.x.127.0/24
    acl students   src 222.x.0.0-222.x.79.0/24


    http_access allow office
    http_access allow students

    http_access allow localhost
    http_access deny all


    acl QUERY urlpath_regex  cgi-bin \?  
    no_cache deny QUERY

    reference_age 3 days
    quick_abort_min 16 KB
    quick_abort_max 16 KB
    quick_abort_pct 95
    connect_timeout 60 seconds
    read_timeout 3 minutes
    request_timeout 30 seconds
    client_lifetime 30 seconds
    half_closed_clients off
    pconn_timeout 60 seconds
    ident_timeout 10 seconds
    shutdown_lifetime 10 seconds

    memory_pools off
    memory_pools_limit 0

    第二步OK了!


    下面是第三步,设置iptable防火墙规则,
    这个也不用多说,
    由于我做的这个只一个代理,而不是透明代理,
    设置iptables只是为了安全,网上有好多iptable的脚本,
    可以根据自己的实际情况和需求加以修改就可以用了,
    我的这个服务器和功能就只是一个代理服务器,
    在/etc/rc.d/下面建脚本文件firewall,把下面的内容为下面的脚本.
    然后在/etc/rc.d/rc.local中加入一句
    /etc/rc.d/firewall
    保存退出.
    下面是我的iptable的脚本:
    #!/bin/sh
    #
    /sbin/modprobe ipt_MASQUERADE
    /sbin/modprobe ip_conntrack_ftp
    /sbin/modprobe ip_nat_ftp
    /sbin/iptables -F
    /sbin/iptables -t nat -F
    /sbin/iptables -X
    /sbin/iptables -t nat -X
    /sbin/iptables -t mangle -F
    ###########################INPUT键#########################
    /sbin/iptables -P INPUT DROP
    /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    /sbin/iptables -A INPUT -p tcp -m multiport --dports 110,8080,80,25,22 -j ACCEPT
    #允许内网samba,smtp,pop3,连接

    /sbin/iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT
    #允许dns连接

    /sbin/iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
    /sbin/iptables -A INPUT -p gre -j ACCEPT
    允许外网vpn连接
    /sbin/iptables -A INPUT -p icmp -m limit --limit 3/s -j LOG --log-level INFO --log-prefix "ICMP packet IN: "
    /sbin/iptables -A INPUT -p icmp -m limit --limit 6/m -j ACCEPT
    /sbin/iptables -A INPUT -p icmp -j DROP
    #设置icmp阔值 ,并对攻击者记录在案
    /sbin/iptables -A INPUT -i eth0 -p tcp --dport 22  -j DROP
    #拒绝外网对22端口访问.
    /sbin/iptables -N syn-flood
    /sbin/iptables -A INPUT -p tcp --syn -j syn-flood
    /sbin/iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN
    /sbin/iptables -A syn-flood -j REJECT
    #防止SYN攻击 轻量
    #######################FORWARD链###########################
    /sbin/iptables -A FORWARD -p tcp -i eth1 -m multiport --dports 80,110,21,25,1723 -j ACCEPT
    /sbin/iptables -A FORWARD -p udp -i eth1 --dport 53 -j ACCEPT
    /sbin/iptables -A FORWARD -p gre -i eth1 -j ACCEPT
    /sbin/iptables -A FORWARD -p icmp -i eth1 -j ACCEPT
    #允许 vpn客户走vpn网络连接外网
    #########################################################
    /sbin/sysctl -w net.ipv4.ip_forward=1 &>;/dev/null
    #打开转发
    #########################################################
    /sbin/sysctl -w net.ipv4.tcp_syncookies=1 &>;/dev/null
    #打开 syncookie (轻量级预防 DOS 攻击)

    /sbin/sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=3800 &>;/dev/null
    #设置默认 TCP 连接痴呆时长为 3800 秒(此选项可以大大降低连接数)
    /sbin/iptables -I INPUT -s 222.x.x.x -j ACCEPT #我自己的机了,全部放行
    /sbin/iptables -I INPUT -s 202.x.x.x -j ACCEPT#老师的机子,全部放行

    ########################OUTPUT链###########################
    /sbin/iptables -P OUTPUT  ACCEPT
     

    收藏到:Del.icio.us