本方法是基于路由器如果发现数据包的目的ip不存在于路由表中而且没有配置default-gateway就会丢弃此包和路由器的null0逻辑接口。
所有设置都是建立在cisco路由器上的。
模拟条件是cisco 3640 ios:c3640-js-mz.124-10.bin
模拟器是gns
ps 原来用ios:c3640-ik9o3s-mz.124-10.bin 不知道为什么路由表全对,但是ping不同。。。希望大家能够解答下。
注意这个封ip只是单向封锁。但是单向锁已经足够了 tcp无法建立 udp可以 但是收不到回复。做到双向封锁可以,也很简单 但是会有些问题 后面会去说。
![]()
请先看r1 r2 r3 r6, 忽略掉r4和r5, r2(core-route)是我们的核心路由。
然后r1 r2 r3 r6 中都配置相同的路由协议 ospf也 ripv2呀 ergip呀 bgp呀。 不过我用的是ergip 因为比较简单。 不用rip是因为rip 有点问题。 bgp我没做个实验正在想bgp的问题后面会详细的说下bgp的问题,这样 r1和r6是可以互相访问的。
然后我们在r6上开几个环回口(loopback)
int lo 0
ip ad 12.0.0.1 255.255.255.255
int lo 1
ip ad 12.0.0.10 255.255.255.255
r1也是能够访问到12.0.0.1和12.0.0.10的
出于一些原因我们不想让r1访问到 r6的地址(122.0.0.11)
变相的来说就是封锁r6的ip地址 但是我们想访问他的环回口。
一般情况下 我们可以用 access-list解决 在r1上设置
access-list 100 deny ip 122.0.0.11 0.0.0.0 any
access-list 100 premit ip any any
int fa0/0
ip access-group 100 out
ip access-group 100 in
这样 r6就被屏蔽了
如果ip在多点 写access会累死而且access的处理速度很慢的。
不限自己做做实验,写个2000条的access-list。
不用手写 用perl 写一个for循环。 直接telnet 输入。
好了解决的方法就是路由协议来封锁ip。 人畜无害,单一匹配 指哪打哪。
没有任何限制,占用cpu资源低。
目前公网上bgp路由器 都有30w条 条目了 ,他们依然能够在10ms内 把数据包转发出去。
我想3640这个路由器上配置个10000w条路由照样没问题吧?
不做bgp的话路由最多也就1000条 剩下9000条让你随便封ip。9000条还不够? 你就别internet了。 局域网的了。
好了开始介绍了。
r4 r5 出场。
r4和 r2上配置好 ospf ,如果 r1 r2 r3 r6是ospf 那么r4和 r2上的ospf as 要换另外的一个。
r4 r5 之间配置好rip v2. r4在配置好 rip 到ospf的重发布,优先级都调成最高。
这样就可以路由封锁ip了。
我们在r5上录入
ip route 122.0.0.11 255.255.255.255 null 0
tip:null 0 是一个逻辑接口 永远 up 发送过去的包等于直接丢弃,不会出现任何回复, 几乎不占用cup 。
几s 后 r2上就可以看到路由中 122.0.0.11/32的下一跳是r4了。
然后r1继续p r6
r1#p 122.0.0.11
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 122.0.0.11, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
tracert一下
r1#traceroute 12.0.0.11
Type escape sequence to abort.
Tracing the route to 12.0.0.11
1 1.0.0.2 20 msec 44 msec 32 msec
2 * * *
3 * * *
4 * * *
解释下这个traceroute为什么只有1条 其他都是*。
r2上 做了一条虚假路由 r6是永远到不了 现在变成了 r1 -》 r2 -》r4 -》r5-》丢弃
这样的话至少应该出现r4 和r5的信息呀?
因为r2上面没有做重分布 我也不想做重分布,所以r4的路由表只有r2和r5这2个直连路由和 r5 rip过来的虚假路由,他不知道r1怎么走,所以他先产生了一个icmp超时的数据包 然后丢弃了。
这样就保护了封锁路由器。
下面看看r6能不能访问 r1
r6#traceroute 1.0.0.1
Type escape sequence to abort.
Tracing the route to 1.0.0.1
1 122.0.0.1 44 msec 80 msec 32 msec
2 * * *
3 * * *
4 * * *
5 * * *
6 * * *
7 * * *
8
p 1.0.0.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 1.0.0.1, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
在r1和r2之间抓包 看看
No. Time Source Destination Protocol Info
9 7.318000 122.0.0.11 1.0.0.1 ICMP Echo (ping) request
10 7.344000 1.0.0.1 122.0.0.11 ICMP Echo (ping) reply
12 9.327000 122.0.0.11 1.0.0.1 ICMP Echo (ping) request
13 9.335000 1.0.0.1 122.0.0.11 ICMP Echo (ping) reply
15 11.339000 122.0.0.11 1.0.0.1 ICMP Echo (ping) request
16 11.370000 1.0.0.1 122.0.0.11 ICMP Echo (ping) reply
17 13.297000 122.0.0.11 1.0.0.1 ICMP Echo (ping) request
18 13.308000 1.0.0.1 122.0.0.11 ICMP Echo (ping) reply
23 15.339000 122.0.0.11 1.0.0.1 ICMP Echo (ping) request
24 15.381000 1.0.0.1 122.0.0.11 ICMP Echo (ping) reply
r1 能够收到r6的请求 也恢复了请求 但是被r2无情的转发给了r4 然后r5 很高兴的把它丢掉了。。。
工作原理差不多了
开始解释 r4 r5为什么用ripv2
首先用rip就不能用v1 因为v1不支持可变掩码。就会导致ban ip 过多。
第二r5我一直将他当作一台服务器来用。哪位大牛编个程序想什么自动封锁ip呀的。这样不就需要r4做翻译了吗。ospf 难度很大 但是rip就简单多了。 比如gfw。。。
如果只想封锁固定ip 而且数量不多的话 就不用r5了 r4 了 直接在核心路由上面写静态路由到null0口就可以了。
但是如果出来路由很多呢? 3-4台 而且静态封锁ip经常变的话 就需要r4了 因为3-4台你能忙的来但是容易出错。随便找个2800做r4 多好。
如果出口路由在多点10+ 那就有的忙了。
其实我不建议在出口路由上做静态路由来封锁ip,因为出口路由最好不要动,动得越多出问题越多。
如果真要做静态路由还是在backbone上面做吧。
其实最好还是多加一台路由做基于路由协议的扩散吧。
关于双向封锁的问题。
双向封锁可以,
只要加入 ip verify unicast source reachable-via any就ok了
这个是大名鼎鼎的 urpf 简单的说,如果数据包不是从路由表中他应该走的端口发过来 那么这个数据包直接丢失。
但是这样会让路由出现很多问题。 只会出现在数量庞大的路由中。
现在的路由都是多条线路负载均衡的去走 ,很多情况下目前地址真的不是从路由器网这个目标端口发送的那个端口进入的的 而是从该路由的其他端口进来的。
这样那些正常的数据包就被丢掉了。
cisco的文档也说 这个设置会造成很多误杀。。。。
发现的问题 关于bgp的。
bgp我水平真的不好,承认。
但是bgp可以解决很多问题,单公司多地点办公,总部屏蔽其他分部也要屏蔽。
这个用ospf可以, tunnel就可以办到,但是bgp会更好一些。
如果墙呢? 肯定是bgp了。
bgp扩散问题好解决。只要不粗心屏蔽列表是不会外传的。(route map)
问题1 我记得bgp的更新好像是触发更新 但是有个延时。具体延时多少 我记得是1分钟。有人说bgp没有延时是实施更新。











