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

JavaGG 发布于 2009/05/05 17:49
阅读 722
收藏 1

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

参考文档:
http://iptables-tutorial.frozentux.net/cn/iptables-tutorial-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/index.php?op=ViewArticle&articleId=59&blogId=1
http://bbs.chinaunix.net/viewthread.php?tid=536582&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.frozentux.net/cn/iptables-tutorial-cn-1.1.19.html
http://www.linuxaid.com.cn/engineer/ideal/article/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/engineer/ideal/article/policy_pouting.htm
   http://bbs.chinaunix.net/viewthread.php?tid=304033
   http://iptables-tutorial.frozentux.net/cn/iptables-tutorial-cn-1.1.19.html
说明一下,我这里用的是linux基于路由策略的IP地址控制,也就是用route,而不是用NAT,
route和nat是有区别的,引用platinum老大的话说就是:
"NAT 和路由是不同的,
NAT 用 iptables 实现,路由用 route 实现,
iptables 负责地址欺骗,route 负责路径选,
这个初学者容易混淆."
如果你想搞懂它们,可以到http://blog.platinum.net.cn/index.php?op=ViewArticle&articleId=59&blogId=1
                       http://bbs.chinaunix.net/viewthread.php?tid=536582&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

[ 本帖最后由 sunowy 于 2005-12-6 11:25 编辑 ]



加载中
返回顶部
顶部