其他分享
首页 > 其他分享> > QQ空间迁移_【不同品牌的防火墙组成高可靠性集群】

QQ空间迁移_【不同品牌的防火墙组成高可靠性集群】

作者:互联网

不同品牌的防火墙组成高可靠性集群

2014-10-26 05:12:27

拓扑如下

主机A ,B有两个可用路由要实现主备切换,当主防火墙出现问题的时候,可以自动切换到备防火墙上。

第一台设备 ASG 425 支持OSPF BGP PIM路由协议

第二台设备SSG 520

支持BGP OSPF PIM RIP 路由协议

第一种方法

说明:两个防火墙属于不同品牌HA 等技术想都不用想了,想通过VRRP实现主备切换, juniper 我只发现了NSRP 的选项 Astarto 根本就木有这个选项

看来两个不同品牌的防火墙想组成高可靠性集群不大可能。

从防火墙本身来解决这个问题的路被堵死了换个思路

第二种方法

由于我们的客户端都是LINUX 主机。所以打算利用linux 强大的route 功能

在主机A 上执行命令

route add -host 172.16.110.80 gw 172.16.100.253

route add -host 172.16.110.80 gw 172.16.100.254

在主机B 上执行命令

route add -host 172.16.100.50 gw 172.16.100.253

route add -host 172.16.100.50 gw 172.16.100.254

执行ping 命令 可以通但是拔掉 asg 425防火墙的网线 就ping 不通了。

查找资料知道 在linux 系统下 系统会查看本地路由表,如果有多条相同网络的路由,只会默认选择第一条,其他的不起作用。此方法不通

第三种方法

利用linux的策略路由

网上查找的参考资料

http://www.cnblogs.com/gunl/archive/2010/09/14/1826234.html

知识准备

一、原理说明

1、路由表(table)从0到255进行编号,每个编号可以对应一个别名,编号和别名的对应关系在linux下放在/etc/iproute2/rt_tables这个文件里,一般0编号

的table对应的别名为upspec,255编号对应的别名为local,254和253对应的别名分别为main和default,我们通常用route命令配置和查看的路由表信息为别名

为main的路由表信息。

2、路由规则负责定义路由策略,它定义来源哪里的IP需要查询哪个路由表(使用别名)。路由规则的查看使用ip rule sh路由规则也从0开始编号,可以自由添

加,来源相同IP的路由规则选择根据规则编号的大小确定优先级,编号越小优先级越高。例如如下路由规则:

0: from all lookup local

32766: from all lookup main

32767: from all lookup default

优先级最高的规则是0,要查询的路由表名称是local,其次是32766,要查询的路由表名称是main,后面依此类推。

3、操作系统在选路时首先根据路由规则选取table,然后再从table里选取相应路由,如果同一table里不同接口使用相同的网关,选路时会默认选择第一条路由

,所以当有两个网络接口卡时,如果目标网络在同一网段,那么由于选路时按第一条路由出口出去,所以会导致所有的流量都会从第一个网卡上出去

在主机A 上执行命令

ip route add 172.16.110.0/24 via 172.16.100.253 dev bond1

ip route add 172.16.110.0/24 via 172.16.100.254 dev bond1

在主机B 上执行命令

ip route add 172.16.100.0/24 via 172.16.110.253 dev bond1

ip route add 172.16.100.0/24 via 172.16.110.254 dev bond1

添加一个路由表

echo 520 test >> /etc/iproute2/rt_tables

使用策略路由使172.16.100.0/24网段的主机可以通过172.16.100.254这个网关上网

iprule add from 172.16.100.0/24 dev bond1 table test pref 32765

iproute add default 172.16.100.254 dev bond1

iptables–t nat –A POSTROUTING –s 172.16.100.0/24 –j MASQUERADE

测试结果还是一样。

原因分析

Linux的 策略路由功能的确很强大,可以设定不同的流量走不同的路径。或者相同的流量从不通的端口流出。做到负载均衡。

而我的的要求是相同的流量走相同的口,而相同的口里面有两个可用路由。

Linux 默认还是只认第一条匹配的路由。

后来想想这个根本就不是策略路由可以解决的,属于动态路由中多路径可用的范畴。

所有想到

第四种解决办法

网上找到的参考资料

把linux 变成一台路由器

Zebra介绍介绍

Zebra 是一个 TPC/IP 路由软件,支持 BGP-4、BGP-4+、OSPFv2、OSPFv3、RIPv1、RIPv2 和 RIPng。它的发行遵循 GNU 通用公共许可协议,可以运行于 Linux 以及其他一些 Unix 变体操作系统上。Zebra 是那些系统最新的发行版本中的路由软件。最新版本的 Zebra 以及文档可以从 GNU Zebra 网站上下载:http://www.zebra.org/  Zebra ;的设计独特,采用模块的方法来管理协议。可以根据网络需要启用或者禁用协议。

Zebra 最为实用的一点是它的配置形式同 Cisco IOS 极其类似。尽管它的配置与 IOS 相比还是有一些不同,但是这对于那些已经熟悉 IOS 的网络工程师来说在这种环境下工作将相当自如。

安装安装

1、下载下载

ftp://ftp.zebra.org/pub/zebra/zebra-0.95a.tar.gz 2、安装过程安装过程

[root@RS1 mnt]# gunzip zebra-0.95a.tar.gz

[root@RS1 mnt]# tar xvf zebra-0.95a.tar

会在当前目录下自动生成一个zebra-0.95a子目录,进入zebra-0.95a目录后执行以下命令安装

[root@RS1 zebra-0.95a]# ./configure

编译出错

接下来是配置本地YUM 然后安装GCC,aclocal,autoconf,automake等包

后来发现这些包都装了,于是万能的百度上场

关闭IPV6 还是不行

打开zebra-0.95a/lib/zebra.h文件, 
定位到103行,添加如下内容,即可解决。 
Vi 定位

1: 快速到最后一行:shift + G

2:快速到第一行: 1 + shift +G

3: 快速到第40 行: 40 + shift + G

#ifdef GNU_LINUX
#define __USE_GNU
#endif
========

问题解决

#include <netinet/in_systm.h>

[root@RS1 zebra-0.95a]# make install

Making install in lib

make[1]: Entering directory `/mnt/zebra-0.95a/lib’

make[2]: Entering directory `/mnt/zebra-0.95a/lib’

make[2]: Nothing to be done for `install-exec-am’.

make[2]: Nothing to be done for `install-data-am’.

make[2]: Leaving directory `/mnt/zebra-0.95a/lib’

make[1]: Leaving directory `/mnt/zebra-0.95a/lib’

Making install in zebra

make[1]: Entering directory `/mnt/zebra-0.95a/zebra’

make[2]: Entering directory `/mnt/zebra-0.95a/zebra’

/bin/sh …/mkinstalldirs /usr/local/sbin

/usr/bin/install-c zebra /usr/local/sbin/zebra

/bin/sh …/mkinstalldirs /usr/local/etc

/usr/bin/install -c -m 600 ./zebra.conf.sample /usr/local/etc/zebra.conf.sample

make[2]: Nothing to be done for `install-data-am’.

make[2]: Leaving directory `/mnt/zebra-0.95a/zebra’

make[1]: Leaving directory `/mnt/zebra-0.95a/zebra’

Making install in bgpd

make[1]: Entering directory `/mnt/zebra-0.95a/bgpd’

make[2]: Entering directory `/mnt/zebra-0.95a/bgpd’

/bin/sh …/mkinstalldirs /usr/local/sbin

/usr/bin/install-c bgpd /usr/local/sbin/bgpd

/bin/sh …/mkinstalldirs /usr/local/etc

/usr/bin/install -c -m 600 ./bgpd.conf.sample /usr/local/etc/bgpd.conf.sample

/usr/bin/install -c -m 600 ./bgpd.conf.sample2 /usr/local/etc/bgpd.conf.sample2

make[2]: Nothing to be done for `install-data-am’.

make[2]: Leaving directory `/mnt/zebra-0.95a/bgpd’

make[1]: Leaving directory `/mnt/zebra-0.95a/bgpd’

Making install in ripd

make[1]: Entering directory `/mnt/zebra-0.95a/ripd’

make[2]: Entering directory `/mnt/zebra-0.95a/ripd’

/bin/sh …/mkinstalldirs /usr/local/sbin

/usr/bin/install-c ripd /usr/local/sbin/ripd

/bin/sh …/mkinstalldirs /usr/local/etc

/usr/bin/install -c -m 600 ./ripd.conf.sample /usr/local/etc/ripd.conf.sample

make[2]: Nothing to be done for `install-data-am’.

make[2]: Leaving directory `/mnt/zebra-0.95a/ripd’

make[1]: Leaving directory `/mnt/zebra-0.95a/ripd’

Making install in ripngd

make[1]: Entering directory `/mnt/zebra-0.95a/ripngd’

make[2]: Entering directory `/mnt/zebra-0.95a/ripngd’

/bin/sh …/mkinstalldirs /usr/local/sbin

/usr/bin/install-c ripngd /usr/local/sbin/ripngd

/bin/sh …/mkinstalldirs /usr/local/etc

/usr/bin/install -c -m 600 ./ripngd.conf.sample /usr/local/etc/ripngd.conf.sample

make[2]: Nothing to be done for `install-data-am’.

make[2]: Leaving directory `/mnt/zebra-0.95a/ripngd’

make[1]: Leaving directory `/mnt/zebra-0.95a/ripngd’

Making install in ospfd

make[1]: Entering directory `/mnt/zebra-0.95a/ospfd’

make[2]: Entering directory `/mnt/zebra-0.95a/ospfd’

/bin/sh …/mkinstalldirs /usr/local/sbin

/usr/bin/install-c ospfd /usr/local/sbin/ospfd

/bin/sh …/mkinstalldirs /usr/local/etc

/usr/bin/install -c -m 600 ./ospfd.conf.sample /usr/local/etc/ospfd.conf.sample

make[2]: Nothing to be done for `install-data-am’.

make[2]: Leaving directory `/mnt/zebra-0.95a/ospfd’

make[1]: Leaving directory `/mnt/zebra-0.95a/ospfd’

Making install in ospf6d

make[1]: Entering directory `/mnt/zebra-0.95a/ospf6d’

make[2]: Entering directory `/mnt/zebra-0.95a/ospf6d’

/bin/sh …/mkinstalldirs /usr/local/sbin

/usr/bin/install-c ospf6d /usr/local/sbin/ospf6d

/bin/sh …/mkinstalldirs /usr/local/etc

/usr/bin/install -c -m 600 ./ospf6d.conf.sample /usr/local/etc/ospf6d.conf.sample

make[2]: Nothing to be done for `install-data-am’.

make[2]: Leaving directory `/mnt/zebra-0.95a/ospf6d’

make[1]: Leaving directory `/mnt/zebra-0.95a/ospf6d’

Making install in doc

make[1]: Entering directory `/mnt/zebra-0.95a/doc’

make[2]: Entering directory `/mnt/zebra-0.95a/doc’

make[2]: Nothing to be done for `install-exec-am’.

/bin/sh …/mkinstalldirs /usr/local/info

mkdir -p – /usr/local/info

/usr/bin/install -c -m 644 ./zebra.info /usr/local/info/zebra.info

install-info --info-dir=/usr/local/info /usr/local/info/zebra.info

/bin/sh …/mkinstalldirs /usr/local/man/man1

mkdir -p – /usr/local/man/man1

/usr/bin/install -c -m 644 ./vtysh.1 /usr/local/man/man1/vtysh.1

/bin/sh …/mkinstalldirs /usr/local/man/man8

mkdir -p – /usr/local/man/man8

/usr/bin/install -c -m 644 ./bgpd.8 /usr/local/man/man8/bgpd.8

/usr/bin/install -c -m 644 ./ospf6d.8 /usr/local/man/man8/ospf6d.8

/usr/bin/install -c -m 644 ./ospfd.8 /usr/local/man/man8/ospfd.8

/usr/bin/install -c -m 644 ./ripd.8 /usr/local/man/man8/ripd.8

/usr/bin/install -c -m 644 ./ripngd.8 /usr/local/man/man8/ripngd.8

/usr/bin/install -c -m 644 ./zebra.8 /usr/local/man/man8/zebra.8

make[2]: Leaving directory `/mnt/zebra-0.95a/doc’

make[1]: Leaving directory `/mnt/zebra-0.95a/doc’

make[1]: Entering directory `/mnt/zebra-0.95a’

make[2]: Entering directory `/mnt/zebra-0.95a’

make[2]: Nothing to be done for `install-exec-am’.

make[2]: Nothing to be done for `install-data-am’.

make[2]: Leaving directory `/mnt/zebra-0.95a’

make[1]: Leaving directory `/mnt/zebra-0.95a’

[root@RS1 zebra-0.95a]#

安装完成后执行文件位于/usr/local/sbin,如下所示: # ls -l /usr/local/sbin

[root@RS1 zebra-0.95a]# ls -l /usr/local/sbin

总用量 8000

-rwxr-xr-x. 1 root root 2323159 10月 25 18:22 bgpd

-rwxr-xr-x. 1 root root 1358143 10月 25 18:22 ospf6d

-rwxr-xr-x. 1 root root 1713332 10月 25 18:22 ospfd

-rwxr-xr-x. 1 root root 1027235 10月 25 18:22 ripd

-rwxr-xr-x. 1 root root 895162 10月 25 18:22 ripngd

-rwxr-xr-x. 1 root root 860516 10月 25 18:22 zebra

[root@RS1 zebra-0.95a]#

运行各个模块

各个zebra模块运行时需要事先定义一个配置文件(*.conf),可直接使用样本配置文件。

# cd /usr/local/etc

# cp zebra.conf.sample zebra.conf

可通过-h参数查看help:

可使用-d参数以后台进程模式启动各模块,比如zebra: # zebra –d

[root@RS1 ~]# ps -ef |grep zebra

root 3919 2572 0 18:26 pts/0 00:00:00 zebra –d

root 3948 3927 0 18:27 pts/1 00:00:00 grep zebra

[root@RS1 ~]# lsof -i:2601

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

zebra 3919 root 10u IPv4 19685 0t0 TCP *:discp-client (LISTEN)

[root@RS1 ~]#

*:discp-client (LISTEN)

zebra-0.95a安装好后会自动往系统/etc/servics中添加定义

配置配置

zebra是基本进程,诸如路由器hostname、接口IP等基本信息都在这个模块中配置。

可通过以下命令进入zebra模块

telnet localhost 2601

很奇怪 SSG520可以获得OSPF邻居而RS1和AS1却获得不了。关闭防火墙试下

结果可以获得。OK

接下来关闭所有机器的防火墙

检查selinux服务并关闭

#vi /etc/selinux/config

确认里面的SELINUX字段的值是disabled,如果不是则改为disabled。

service iptables stop

chkconfig iptables off

AS

RS

切换到本机的SHELL下 rouer -n

发现动态路由并没有更新到本机的路由表

AS

在路由界面下 修改BOND1的地址 为172.16.110.81/24

RS

在路由界面下 修改BOND1的地址 为172.16.100.51/24

逻辑结构就变成这样了

动态路由出来了。

AS

当我关闭SSG 520后 路由自动切换到了ASG425

切换速度非常快 根本就感觉不出来。

RS

当我关闭SSG 520后 路由自动切换到了ASG425

到此我们的目的达成了。

贴出配置

As1

as1_route#

[root@AS1 ~]# telnet 127.0.0.1 2601

Trying 127.0.0.1…

Connected to 127.0.0.1.

Escape character is ‘^]’.

Hello, this is zebra (version 0.95a).

Copyright 1996-2004 Kunihiro Ishiguro.

User Access Verification

Password:

as1_route> en

Password:

as1_route# show run

Current configuration:

!

hostname as1_route

password cisco

enable password cisco

!

interface lo

!

interface eth0

ipv6 nd suppress-ra

!

interface eth1

ipv6 nd suppress-ra

!

interface eth2

ipv6 nd suppress-ra

!

interface eth3

ipv6 nd suppress-ra

!

interface bond0

ipv6 nd suppress-ra

!

interface bond1

ip address 172.16.110.81/24

ipv6 nd suppress-ra

!

interface virbr0

ipv6 nd suppress-ra

!

interface virbr0-nic

ipv6 nd suppress-ra

!

table 1

no ip forwarding

no ipv6 forwarding

!

line vty

exec-timeout 0 0

!

End

as1_ospf#

[root@AS1 ~]# telnet 127.0.0.1 2604

Trying 127.0.0.1…

Connected to 127.0.0.1.

Escape character is ‘^]’.

Hello, this is zebra (version 0.95a).

Copyright 1996-2004 Kunihiro Ishiguro.

User Access Verification

Password:

as1_ospf> en

as1_ospf# show run

Current configuration:

!

hostname as1_ospf

password cisco

log stdout

!

!

!

interface lo

!

interface eth0

!

interface eth1

!

interface eth2

!

interface eth3

!

interface bond0

!

interface bond1

!

interface virbr0

!

interface virbr0-nic

!

router ospf

ospf router-id 172.16.110.81

network 172.16.100.0/24 area 0.0.0.0

network 172.16.110.0/24 area 0.0.0.0

!

line vty

!

end

SSG 520

SSG520-> get vrouter trust-vr protocol ospf config

VR: trust-vr RouterId: 172.16.100.254

----------------------------------

set protocol ospf

set enable

set area 0.0.0.0 range 172.16.100.0 255.255.255.0 advertise

set area 0.0.0.0 range 172.16.110.0 255.255.255.0 advertise

exit

set interface redundant1.10 protocol ospf area 0.0.0.0

set interface redundant1.10 protocol ospf enable

set interface redundant2 protocol ospf area 0.0.0.0

set interface redundant2 protocol ospf enable

SSG520->

ASG 425

ASG425 不允许ROOT用户登录SSH,需要一堆公匙 秘匙 就不用了登录SSH了 直接截图

RS1

rs1_route#

[root@RS1 ~]# telnet 127.0.0.1 2601

Trying 127.0.0.1…

Connected to 127.0.0.1.

Escape character is ‘^]’.

Hello, this is zebra (version 0.95a).

Copyright 1996-2004 Kunihiro Ishiguro.

User Access Verification

Password:

rs1_route> en

Password:

rs1_route# show run

Current configuration:

!

hostname rs1_route

password cisco

enable password cisco

!

interface lo

!

interface eth0

ipv6 nd suppress-ra

!

interface eth1

ipv6 nd suppress-ra

!

interface eth2

ipv6 nd suppress-ra

!

interface eth3

ipv6 nd suppress-ra

!

interface bond0

ipv6 nd suppress-ra

!

interface bond1

ip address 172.16.100.51/24

ipv6 nd suppress-ra

!

interface virbr0

ipv6 nd suppress-ra

!

interface virbr0-nic

ipv6 nd suppress-ra

!

!

line vty

!

End

rs1_ospf#

[root@RS1 ~]# telnet 127.0.0.1 2604

Trying 127.0.0.1…

Connected to 127.0.0.1.

Escape character is ‘^]’.

Hello, this is zebra (version 0.95a).

Copyright 1996-2004 Kunihiro Ishiguro.

User Access Verification

Password:

rs1_ospf> en

rs1_ospf# show run

Current configuration:

!

hostname rs1_ospf

password cisco

log stdout

!

!

!

interface lo

!

interface eth0

!

interface eth1

!

interface eth2

!

interface eth3

!

interface bond0

!

interface bond1

!

interface virbr0

!

interface virbr0-nic

!

router ospf

ospf router-id 172.16.100.51

network 172.16.100.0/24 area 0.0.0.0

network 172.16.110.0/24 area 0.0.0.0

!

line vty

!

end

现在把 zebra -d 和ospfd -d加入 启动脚本

[root@RS1 ~]# vi /etc/rc.d/rc.local

#!/bin/sh

# This script will be executed *after* all the other init scripts.

# You can put your own initialization stuff in here if you don’t

# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

#新增加

/usr/local/sbin/zebra -d

/usr/local/sbin/ospfd -d

接下来重启系统验证一下。

结果RS 1正常执行 AS1需要手动执行

网上搜索了半天 结果想起来是不是权限不对

查看权限果真不对 改在755就好了

chmod 755 /etc/rc.local

全部搞定

第五种方法

还有一种很简单的解决思路,写个脚本

自动添加网关。 这是我网上COPY的

但是我认为这种方法在生产环境下太危险了。一直跑一个死循环脚本。万一出了问题,系统就崩溃了

#!/bin/bash

while : #死循环

do #做下面的事情

route del default #删除以前的默认网关配置

route add default dev ppp0 gw 1.1.1.1 #添加一条网关

while ping -c 1 1.1.1 &> /dev/null #再次进入子循环里面,ping成功也就是为真的话,那么就循环,ping失败跳出循环

do

sleep 1 #ping通后,睡1秒

done

route del default #如果ping不通,来到这个语句。就删除前面ppp0的网关地址

route add default dev ppp1 gw 2.2.2.2 #并且用添加ppp1网关

while ! ping -c 1.1.1.1 &> /dev/null #如果ping不通则为真,ping通跳出循环。继续从上开始了

do

sleep 1

done

done

第六种方法

开始交换机的功能

第一次尝试使用静态路由

int vlan 100

ip add 172.16.100.1 255.255.255.0

no shu

int vlan 110

ip add 172.16.110.1 255.255.255.0

no shu

ip sla 100

icmp-echo 172.16.110.80

ip sla schedule 100 life forever start-time now

ip sla 110

icmp-echo 172.16.100.50

ip sla schedule 110 life forever start-time now

track 100 rtr 100 reachability

track 110 rtr 110 reachability

route add 172.16.100.0 255.255.255.0 172.16.110.253 10 track 100

route add 172.16.100.0 255.255.255.0 172.16.110.254

route add 172.16.110.0 255.255.255.0 172.16.100.253 10 track 100

route add 172.16.110.0 255.255.255.0 172.16.110.254

结果发现交换机本身实现了主备防火墙切换,

但是交换机下面的PC机把下一条地址设置为交换机VLAN100,110的地址时候,通是通了,不过走的却是交换机本身的路由,绕过了防火墙

分析了一下原因。交换机本身的 VLAN 100 VLAN110 两个IP 是直连路由 拥有最高的优先级,我设置的静态路由根本就不起作用。

想到第二个方法 使用策略路由

ip sla 100

icmp-echo 172.16.110.80

ip sla schedule 100 life forever start-time now

ip sla 101

icmp-echo 172.16.110.90

ip sla schedule 101 life forever start-time now

ip sla 110

icmp-echo 172.16.100.50

ip sla schedule 110 life forever start-time now

ip sla 111

icmp-echo 172.16.100.60

ip sla schedule 111 life forever start-time now

配置SAA检查连通性。并跟踪这结果

track 100 rtr 100 reachability

track 110 rtr 110 reachability

track 101 rtr 101 reachability

track 111 rtr 111 reachability

定义访问控制列表,permit选项为需要重定向的数据包

access-list 100 permit ip 172.16.100.0 0.0.0.255 any

access-list 110 permit ip 172.16.110.0 0.0.0.255 any

定义策略路由

route-map rs permit 10

match ip address 100

set ip next-hop verify-availability 172.16.100.253 10 track 100

set ip next-hop verify-availability 172.16.100.254 64 track 101

route-map as permit 20

match ip address 110

set ip next-hop verify-availability 172.16.110.253 10 track 110

set ip next-hop verify-availability 172.16.110.254 64 track 111

interface vlan100

ip address 172.16.100.1 255.255.255.0

ip policy route-map rs

到这里 结果 奶奶的3750X系列不支持策略路由,百度一下发现需要购买license 只能放弃了

删除还原交换机配置。

总结

经过1天一夜差不多30个小时的奋战终于把问题解决了

最后实际上 是 RS1  RS2  SSG520 ASG425 AS1 AS2 6个设备 都变成了路由器组成了一个OSPF的冗余网络。

评论(0)

标签:QQ,local,make,防火墙,usr,172.16,0.95,高可靠性,zebra
来源: https://blog.csdn.net/feitianyul/article/details/113726832