免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 22090 | 回复: 62
打印 上一主题 下一主题

基于策略路由的IP地址控制 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-04-14 16:55 |只看该作者 |正序浏览
基于策略路由的IP地址控制

===========================================================================

最近做了一套路由策略,觉得LINUX真的太强大了!于是心潮澎湃,写了这个文档!!!

一、背景描述
如图,LINUX是一台网关服务器,内有3块网卡
eth1绑定 172.17.0.0/16 的IP,该网段IP可以通过 172.17.1.1 上网
eth0绑定 192.168.10.0/24 的IP,该网段IP可以通过 192.168.10.1 上网
eth2绑定 192.168.1.1,是内网用户的网关

二、需求分析
内网用户应该走 172.17.1.1 这个路由上网
但由于工作需要,部分用户应该有访问图中“专用网络”的权限
也就是说,应该走 192.168.10.1 这个路由

另外一点,所有人应该可以访问FTP服务器,这个服务器的IP是 192.168.10.xx
也就是说,走 172.17.1.1 路由的人,也应该能访问 192.168.10.xx,且可以上网

三、解决方案
要解决这个问题,用到了一下几个命令,具体使用方法需要另查资料
ip route
ip rule
arp
注:关于 ip 命令的用法,请查阅ip中文手册,www.google.com 上有

1、绑定IP
ifconfig eth1 172.17.3.x netmask 255.255.0.0
ifconfig eth0 192.168.10.2 netmask 255.255.255.0
ifconfig eth2 192.168.1.1 netmask 255.255.255.0
然后分别修改 /etc/sysconfig/network-script/ifcfg-ethx 文件,以使计算机启动自动设置IP地址

2、创建特殊路由表
vi /etc/iproute2/rt_table

  1. #
  2. # reserved values
  3. #
  4. 255     local
  5. 254     main
  6. 253     default
  7. 0       unspec

  8. 200     NET10
  9. #
  10. # local
  11. #
  12. #1      inr.ruhep
复制代码

上面那个 200 NET10 为新添加,自定义编号为 200,名字为 NET10

3、向NET10 路由中添加它自己的默认路由

  1. ip route add default via 192.168.10.1 table NET10
复制代码

注意,这个 table NET10 一定不要忘了写,否则写到了主路由表中

4、创建特殊路由规则
用 ip rule 可以看到计算机当前的路由规则
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

可以看到,规则中走了3个路由表,local、main、default
我们平常用route看到的,实际是路由表main
这些规则是按序号大小顺序走的,一个不同,则走下一个,知道通路或走完为止

开始添加我们自己的路由NET10到路由表中

  1. ip rule add from 192.168.1.222 pref 10000 table NET10
复制代码

这个意思是说,如果来自IP地址为 192.168.1.222 的访问,则启用NET10的路由表中的路由规则
而NET10的路由规则是什么呢?上面已经设置了,走的是 192.168.10.1 的网段
接下来,使 LINUX 可以 NAT(这里不再细说 HOW TO 了)

5、让所有人可以访问 192.168.10.xx(这个IP不便说出来)
因为其余人都走了 172.17.1.1 这个路由,所以他们是无法访问 192.168.10.xx 的
怎么才能实现呢?再添加个策略就可以了!

  1. ip rule add to 192.168.10.xx pref 10001 table NET10
复制代码

这句话的意思是说,所有人,如果目的IP是 192.168.10.xx,则临时使用 NET10 的路由表
这样做,安全会不会有安全问题呢?路由变了,他们会不会访问到专用网络呢?
不会的,因为路由规则是 to 192.168.10.xx,也就是目标是 xx 时,才该路由的,访问别的网站还是走原来的路由。
如果说访问到专用网络的机器,也就只有10.xx这一台而已。
这里,我们还可以做一个小技巧,不告诉别人 192.168.10.xx 的地址,只告诉他们网关 192.168.1.1 上有这个服务
iptables -t nat -A PREROUTING -d 192.168.1.1/32 --dport 21 -j DNAT --to 192.168.10.xx

6、防止其他人篡改IP地址而获得特殊权限
arp有个静态功能 CM,不是 C,大家可能知道
如果给一个IP地址强行绑定一个非他自己的 MAC,会怎么样呢?双方会话将会失败!
好,我们来利用这一点!

首先,我写了一个文件iproute.c

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. main ()
  4. {
  5.         int i;
  6.         for(i=2;i<255;i++)
  7.                 printf("192.168.1.%d\t\t00:00:00:00:00:00\n",i);
  8. }
复制代码

gcc iproute.c -o iproute
将编译出一个可执行文件
注:不应该包括主机IP地址本身,所以从 2 循环到 254(255 是广播)

其次,生成一个 C 的 IP 地址和全为 00 的 MAC 地址

  1. # ./iproute > /etc/ethers
复制代码


tips: 上面的方法写于不会 shell 时候的我,利用 bash 的特性可以很简单的将上面步骤简化为

  1. # 修改于 2005.10.24
  2. # for((i=2;i<=254;i++));do echo -e "192.168.1.$i\t00:00:00:00:00:00";done > /etc/ethers
复制代码


再次,修改IP-MAC匹配列表
vi /etc/ethers
具体怎么该我就不用细说了,相信大家都会

最后,做静态 IP-MAC 绑定
arp -f

7、为了安全,建立防火墙,修改main路由表
默认的路由表应该有 192.168.10.0/24 和 172.17.0.0/16 网段的内容,为了安全,可以去掉
另外,如果是AS3的话,还会有 169.254.0.0/16 的路由,具体为什么我不知道,去掉
然后写一个防火墙教本,利用iptables,把你的机器变得更加坚固!


好了,终于写完了!
昨天和好好先生聊天,他说了一句话让我深有感触!
“任何东西只要你能活学活用,它的功能都会很强大!”
同志们,努力吧!

[ 本帖最后由 platinum 于 2006-10-13 12:43 编辑 ]

net.jpg (14.6 KB, 下载次数: 276)

网络拓扑图

网络拓扑图

论坛徽章:
0
63 [报告]
发表于 2006-12-01 13:19 |只看该作者
策略路由如果配合三层交换机我想可以更好的实现QOS,有了三层,客户端随便更改IP无效(不嫌麻烦的话最好在交换机上做ip+mac ACL),这样的话经三层交换机路由过来的数据再在gateway上进行策略路由走不同的出口

论坛徽章:
0
62 [报告]
发表于 2006-11-27 15:00 |只看该作者
楼主,问一下可不可以这样写规则

ip rule add from 192.168.1.222 to 192.168.10.× table NET10

论坛徽章:
0
61 [报告]
发表于 2006-11-27 11:23 |只看该作者
顶起来,学. 白金出手总有精华.

论坛徽章:
0
60 [报告]
发表于 2006-11-25 01:58 |只看该作者
原帖由 wikingki 于 2006-10-13 16:17 发表
今天才看到这样的强贴,汗!!



我更迟,本文写得很简明。强,学习中

论坛徽章:
0
59 [报告]
发表于 2006-10-13 16:17 |只看该作者
今天才看到这样的强贴,汗!!

论坛徽章:
0
58 [报告]
发表于 2006-10-11 15:34 |只看该作者
一群强人,学习中

论坛徽章:
0
57 [报告]
发表于 2006-10-08 10:19 |只看该作者
说来缘分,前两天接个私单,居然让我把这老帖翻出来实现了个方案,哈哈
搞得和MOP一样

论坛徽章:
0
56 [报告]
发表于 2006-05-26 15:36 |只看该作者

现在配个SATA+AMD64的机

现在配个SATA+AMD64的机就能跑的N好。一点不比Cisco3600的路由器差



ZF
看我简释iptables防火墙!

看我简释iptables防火墙!
一般LINUX防火墙(iptalbes)的运用无非是用nat 表(PREROUTING、OUTPUT、POSTROUTING)和filter表(FORWARD、INPUT、OUTPUT)。我们只有知道了数据的流向才能正确的配置防火墙。现用一个相对比较直观的图形解释数据的走向。(此处只作最基本的iptables数据流走向说明。)


上图是你的家,蓝色的圈是你家院子,有两扇大门①⑥进出,你家有两个房间,分别为eth0和 eth1房间,每个房间有两个门可以进出②③④⑤。旁边是张三和李四的家,张三家和李四家之间的往返必须要过你家院子。
现假设,eth0网卡IP为:192.168.5.1链接内网,eth1网卡IP为:218.100.100.111链接互连网。再假设,“张三家”为一个局域网,“李四家”为互连网。进我家院子用PREROUTING,出我家院子用FORWARD,进我家门用INPUT,出我家门用OUTPUT。(当我们的操作是征对服务器本身而言的话,如SSH操作,此时肯定会用到PREROUTING、INPUT和OUTPUT,当数据只是通过服务器去访问别的机器时会用到PREROUTING和FORWARD。)
又假设,默认这六个门都是关的。生成如下代码。
###########################################################################
*nat
################################
:PREROUTING    DROP  [0:0]
:OUTPUT         DROP  [0:0]
:POSTROUTING   DROP  [0:0]
################################
-F
-Z
-X
### 以后要新增语句请在此处增加。
-L –v
COMMIT
################################################
*filter
##############################
:INPUT          DROP  [0:0]
:FORWARD      DROP  [0:0]
:OUTPUT        DROP  [0:0]
##############################
-F
-Z
-X
### 以后要新增语句请在此处增加。
-L –v
COMMIT
##########################################################################
1、    局域网用户通过服务器共享上网
(即从张三家到李四家)
1)首先进①号门,再从⑥号门走出。
-A  PREROUTING –p tcp --dport 80 –j ACCEPT #允许TCP 80端口通过服务器
-A  FORWARD –p tcp --dport 80 –j ACCEPT    #允许TCP80 端口转发
-A  FORWARD –p tcp --sport 80 –j ACCEPT    #允许接收对方为TCP80端口反回的信息
2)其次,由于我们上网打的是域名,为此有一个公网DNS服务器为我们服务,那当然也要允许内网机器与DNS服务器的数据转发。DNS用UDP 53或者 TCP 53端口。两者用其一个就行。
-A  PREROUTING –p udp  --dport 53 –j ACCEPT   
-A  FORWARD –p udp  --dport 53 –j ACCEPT      
-A  FORWARD –p udp  --sport 53 –j ACCEPT      
3)再次,由于局域网的地址在公网上是不被允许的,所以在出公网前应该把其地址转为服务器地址进行伪装。
-A  POSTROUTING –s 192.168.5.0/24 –j SNAT –to  218.100.100.111
2、    允许局域网和公网可以访问服务器的SSH
假设SSH采用默认端口TCP 22 。此要求相当于要进我的家的TCP 22号门,为此我们首先要进我家院子,然后再进我家门,最后走出我家门这样的过程。此操作是征对服务器本身的操作。
-A  PREROUTING –p tcp --dport 22 –j ACCEPT
-A  INPUT –p tcp --dport 22 –j ACCEPT
-A  OUTPUT –p tcp --sport 22 –j ACCEPT
3、    允许内网机器可以登录MSN和QQ。
(MSN和QQ默认是不允许登录的)QQ一般来说可以从TCP 80、8000、443及UDP 8000、4000登录,而MSN可以从TCP 1863、443登录。我们登录MSN和QQ的过程就象上网一样,也是去访问远程服务器的指定端口,故而我们只用数据转发即可。
-A  PREROUTING –p tcp --dport 1863 –j ACCEPT
-A  PREROUTING –p tcp --dport 443 –j ACCEPT
-A  PREROUTING –p tcp --dport 8000 –j ACCEPT
-A  PREROUTING –p udp --dport 8000 –j ACCEPT
-A  PREROUTING –p udp --dport 4000 –j ACCEPT
-A  FORWARD –p tcp --dport 1863 –j ACCEPT
-A  FORWARD –p tcp --sport 1863 –j ACCEPT
-A  FORWARD –p tcp --dport 443 –j ACCEPT
-A  FORWARD –p tcp --sport 443 –j ACCEPT
-A  FORWARD –p tcp --dport 8000 –j ACCEPT
-A  FORWARD –p tcp --sport 8000 –j ACCEPT
-A  FORWARD –p udp --dport 8000 –j ACCEPT
-A  FORWARD –p udp --sport 8000 –j ACCEPT
-A  FORWARD –p udp --dport 4000 –j ACCEPT
-A  FORWARD –p udp --sport 4000 –j ACCEPT
4、    让内网机器可以收发邮件。
接收邮件是访问远程服务器的TCP 110端口,发送邮件是访问TCP25端口。用数据转发即可。
-A  PREROUTING –p tcp --dport 110 –j ACCEPT
-A  PREROUTING –p tcp --dport 25 –j ACCEPT
-A  FORWARD –p tcp --dport 110 –j ACCEPT
-A  FORWARD –p tcp --sport 110 –j ACCEPT
-A  FORWARD –p tcp --dport 25 –j ACCEPT
-A  FORWARD –p tcp --sport 25 –j ACCEPT
5、    内部机器对外发布WEB。
要把内网机器192.168.5.179的WEB对外发布的话,相当于是从外网访问内网。与第1步操作的局域网共享上网相同,只是访问的方向改变了。不是从内网访问外网,而是从外网访问内网。当公网访问服务器218.100.100.111时,防火墙把它映射到内网的192.168.5.179的TCP80上。当内网机器访问服务器218.100.100.111时,防火墙把它映射到内网的192.168.5.179的TCP80上。
-A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination

192.168.5.179:80
-A PREROUTING –i eth1 –p tcp –d 218.100.100.111 –dport 80 –j DNAT –to-destination

192.168.5.179:80
(以上两句必须写在 –A PREROUTING –p tcp --dport 80 –j ACCEPT 前面。)
  TCP 80端口的转发在第1步就已做过,此处就不用重复制作了。另外在
-A  POSTROUTING –s 192.168.5.0/24 –j SNAT –to  218.100.100.111 之后加上一句:
-A  POSTROUTING –p tcp --dport 80 –j  ACCEPT
为什么要加这句话呢,我的理解是这样的,公网访问 http://218.100.100.111时:(假设公网上用户的IP为199.199.199.199,端口12345为随机的产生的。)
数据源 :   ip:199.199.199.199   sport:12345
数据目标:  ip:218.100.100.111   dport 80
此时,通过-A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-

destination 192.168.5.179:80 告诉199.199.199.199,您要访问的真正地址应该是192.168.5.179:80,然后我们通过-A  POSTROUTING –p tcp --dport 80 –j  ACCEPT 目标地址218.100.100.111:80伪装成 192.168.5.179:80 。
数据源 :   ip:199.199.199.199   sport:12345
数据目标:  ip:192.168.5.179     dport 80

当192.168.5.179返回数据时:
数据源 :   ip:192.168.5.179     sport:80
数据目标:  ip:199.199.199.199   dport 12345
数据经过 -A  POSTROUTING –s 192.168.5.0/24 –j SNAT –to  218.100.100.111 后,
数据源 :   ip:218.100.100.111   sport:80
数据目标:  ip:199.199.199.199   dport 12345

6、    完整的iptables配置
###########################################################################
*nat
################################
:PREROUTING    DROP  [0:0]
:OUTPUT         DROP  [0:0]
:POSTROUTING   DROP  [0:0]
################################
-F
-Z
-X
-A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination

192.168.5.179:80
-A PREROUTING –i eth1 –p tcp –d 218.100.100.111 --dport 80 –j DNAT –to-destination

192.168.5.179:80
-A  PREROUTING –p tcp --dport 80 –j ACCEPT
-A  PREROUTING –p udp  --dport 53 –j ACCEPT   
-A  PREROUTING –p tcp --dport 22 –j ACCEPT
-A  PREROUTING –p tcp --dport 1863 –j ACCEPT
-A  PREROUTING –p tcp --dport 443 –j ACCEPT
-A  PREROUTING –p tcp --dport 8000 –j ACCEPT
-A  PREROUTING –p udp --dport 8000 –j ACCEPT
-A  PREROUTING –p udp --dport 4000 –j ACCEPT
-A  PREROUTING –p tcp --dport 110 –j ACCEPT
-A  PREROUTING –p tcp --dport 25 –j ACCEPT
-A  POSTROUTING –s 192.168.5.0/24 –j SNAT –to  218.100.100.111
-A  POSTROUTING –p tcp --dport 80 –j  ACCEPT
-L –v
COMMIT
################################################
*filter
##############################
:INPUT          DROP  [0:0]
:FORWARD      DROP  [0:0]
:OUTPUT        DROP  [0:0]
##############################
-F
-Z
-X
-A  INPUT –p tcp --dport 22 –j ACCEPT
-A  OUTPUT –p tcp --sport 22 –j ACCEPT
-A  FORWARD –p tcp --dport 80 –j ACCEPT   
-A  FORWARD –p tcp --sport 80 –j ACCEPT   
-A  FORWARD –p udp --dport 53 –j ACCEPT      
-A  FORWARD –p udp  --sport 53 –j ACCEPT   
-A  FORWARD –p tcp --dport 1863 –j ACCEPT
-A  FORWARD –p tcp --sport 1863 –j ACCEPT
-A  FORWARD –p tcp --dport 443 –j ACCEPT
-A  FORWARD –p tcp --sport 443 –j ACCEPT
-A  FORWARD –p tcp --dport 8000 –j ACCEPT
-A  FORWARD –p tcp --sport 8000 –j ACCEPT
-A  FORWARD –p udp --dport 8000 –j ACCEPT
-A  FORWARD –p udp --sport 8000 –j ACCEPT
-A  FORWARD –p udp --dport 4000 –j ACCEPT
-A  FORWARD –p udp --sport 4000 –j ACCEPT
-A  FORWARD –p tcp --dport 110 –j ACCEPT
-A  FORWARD –p tcp --sport 110 –j ACCEPT
-A  FORWARD –p tcp --dport 25 –j ACCEPT
-A  FORWARD –p tcp --sport 25 –j ACCEPT
-L –v  
COMMIT
##########################################################################
7、    其它注意事项
1)在使用iptables防火墙之前,必须先打开IP转发功能。
# echo “1” > /proc/sys/net/ipv4/ip_forward
2)以上内容(第6步生成的内容)保存到 /etc/sysconfig/iptables文件中。
3)每修改一次iptables文件后,都要重启iptalbes
    # service iptables restart
以上就是我对iptables的初浅理解,里面的语句已在RedHat 9.0上测试通过。如有不当之处请通知我:QQ 3877900  MSN hzjjr@msn.com
补充一下,我在这里各链都设置了DROP,所以设置起来会比较麻烦的。我只是为了解释数据是怎么走的,防火墙设置时应该考虑哪些地方,如果您把这些链都ACCEPT的话,那你只要那句-A  POSTROUTING –s 192.168.5.0/24 –j SNAT –to  218.100.100.111就够了。
这篇帖子已经被 lyjjr 于2005年01月11日23时16分 编辑过

[[i] 本帖最后由 wheel 于 2006-5-29 16:51 编辑 [/i]]

论坛徽章:
0
55 [报告]
发表于 2006-03-06 02:55 |只看该作者
学习中
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP