这是兄弟我将近一个星期的心血,终于做成了,现整理一下,拿出来和大家分享一下吧!
有哪些地方说的不对,请各位指出来,共同学习.
参考文档:
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 编辑 ]
sunowy 回复于:2005-11-27 23:27:55
我的log分析用的是sarg,
我见好多人用的都是pwebstats ,
这两个东东在http://www.vbird.org/linux_server/0420squid.php
上都有详细的说明,不妨去看一下,我就不赘述了~
platinum 回复于:2005-11-28 10:41:24
会学习,会总结,会思考,好文!
sunowy 回复于:2005-11-28 11:36:29
呵呵~~
多谢老大夸讲,
以后偶会再接再厉~
linuxsky 回复于:2005-11-29 08:08:37
楼主有没有联系的方法?
QQ或MSN之类的。我需要你的帮助。
sunowy 回复于:2005-11-29 12:51:38
记我的QQ吧,
439705697
我在这方面也是新手,
咱们共同学习吧~
inhell 回复于:2005-12-14 10:30:00
楼主 我的透明代理可以使用了 但是只要一家上你的防火墙脚本就不能上网了
zifengling 回复于:2005-12-24 12:09:52
顶,好文!
枫影谁用了 回复于:2005-12-24 13:32:54
引用:原帖由 inhell 于 2005-12-14 10:30 发表
楼主 我的透明代理可以使用了 但是只要一家上你的防火墙脚本就不能上网了
他的脚本本来就不能哦!
不要给版主的话欺骗了你的自信。
sunowy 回复于:2005-12-24 19:13:50
不是我的脚本不能用,
可能是你们的某些iptables的模块没有加载上
我那上面关于加载模块写的不太详细
可以到网上找找,
这方面的脚本好多
boyonline 回复于:2006-10-23 23:39:59
学习中。。。。。。。。。。。。。。。。。。。。。。。
yoooyooo 回复于:2007-01-03 16:54:30
en , 好东西,收藏拉
cxcjcy 回复于:2007-01-24 23:27:45
借鉴下。
|