squid+iptable+linux策略路由架设proxy全过程
时间:2005-11-28 来源:sunowy
有哪些地方说的不对,请各位指出来,共同学习.
参考文档:
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.6.222 -j ACCEPT #我自己的机了,全部放行
/sbin/iptables -I INPUT -s 202.x.112.24 -j ACCEPT#老师的机子,全部放行
########################OUTPUT链###########################
/sbin/iptables -P OUTPUT ACCEPT