赛迪网 >> 技术应用子站1 >> 专题文章
squid+iptable+linux策略路由架设proxy全过程
作者: 来源:linux联盟 发布时间:2006.08.01
【Java专区】 【网络安全】 【网管专区】 【linux专区】 【数据库专区】 【进入论坛】 【IT博客】 
【Eclipse】  【PHP】  【DB2】  【Ajax】  【Struts】  【Spring】  【源码·文档下载】

这是兄弟我将近一个星期的心血,终于做成了,现整理一下,拿出来和大家分享一下吧!

有哪些地方说的不对,请各位指出来,共同学习.

参考文档:

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

带给你最新,最快,最权威的数据库技术

评论】 【推荐】 【 】 【打印】 【关闭
*姓  名: 更多资料 了解方案 认识厂商
*单位名称:
*联系电话:
*电子邮件:
    
◆ 相关文章
· 基于嵌入式Linux平台的多协议路由器设计 2006-08-01
· Linux下路由器的配置之四 2006-08-01
· Linux下路由器的配置之三 2006-08-01
· Linux下路由器的配置之二 2006-08-01
· Linux下路由器的配置之一 2006-08-01