OpenVpn+BGP协议实现双线路由动态切换

家里使用电信的ADSL上网,为了逾越电信与联通之间的巨大鸿沟。我在公司搭建了一台双线的服务器(实际就是办公室台式电脑里面装了个虚拟机),通过openvpn把公司的联通线路引到家里来使用。按照一般的做法就是家里的路由器HG255d作为客户端连接到公司的服务器上,然后添加联通的静态路由指向vpn服务端。静态路由的方法简单可行,但是不可靠。要自己实现掉线检查,否则vpn掉线了,静态路由还在的话,往联通放向直接挂掉了。。要不就是断线的时候虽然路由会删除掉,但是恢复后不会自动加上,各种麻烦。

本文将介绍一种全新的方式,全新的体验。用动态路由协议来实现双线路由选择,除了可以做掉线检查之外,还可以双机热备或者负载均衡,可靠性大大提高。

由于openvpn的tunnel模式比较特别,所以这里选择了广域网上使用广泛的BGP协议,使用标准的TCP连接进行通信,完美兼容tunnel模式的openvpn。在openwrt平台上用quagga建立BGP连接也很方便。在服务器方面,新加入了一台水星4530,以防止台式电脑在下班时间被意外关闭导致VPN不可用,真正高可用了。

解析下以上示意图

GW2 是台式机,主力vpn。AS号65002

GW4是水星mw4530r,备胎。AS号65004

HG255d家里的路由,AS号65008

三个操作系统均是openwrt,通过openvpn两两相连成环。GW2和GW4用BGP协议向HG255d通告联通路由,无论哪一个挂掉都会自动切换到另外一个,无需人工干预。

由于GW2和GW4不在同一网段,用Openvpn的P2P tunnel模式互联。

GW4的openvpn配置文件

dev tun42

# 198.18.0.1 is our local VPN endpoint (gw2).
# 198.18.0.2 is our remote VPN endpoint (gw4).

remote x.x.x.x(gw2的ip)

ifconfig 198.18.0.2 198.18.0.1

# Our up script will establish routes once the VPN is alive.

port 11996
proto udp

secret /root/p2p_vpn/static.key

ping-timer-rem
persist-tun
persist-key

GW2的openvpn配置文件

dev tun24

# 198.18.0.1 is our local VPN endpoint (gw2).
# 198.18.0.2 is our remote VPN endpoint (gw4).
ifconfig 198.18.0.1 198.18.0.2

# Our up script will establish routes once the VPN is alive.
remote x.x.x.x(gw4的ip)

port 11996

#proto tcp-server
proto udp

secret /root/p2p_vpn/static.key

ping-timer-rem
persist-tun
persist-key


# Verbosity level.
# 0 -- quiet except for fatal errors.
# 1 -- mostly quiet, but display non-fatal network errors.
# 3 -- medium output, good for normal operation.
# 9 -- verbose, good for troubleshooting
verb 3

GW2和HG255d之间由于是经过广域网的,并且HG255d是动态ip,所以用openvpn的CS结构,TUN模式。采用证书认证,tls加密。关于证书的制作方法网上有很多,再次就省略了。

GW2的openvpn配置文件

mode server
tls-server
### network options
port 11994
proto tcp
dev tun0

### Certificate and key files
ca /etc/easy-rsa/keys/ca.crt
cert /etc/easy-rsa/keys/server.crt
key /etc/easy-rsa/keys/server.key
dh /etc/easy-rsa/keys/dh1024.pem
crl-verify /etc/easy-rsa/keys/crl.pem

server 198.18.16.0 255.255.255.0
client-config-dir /root/openvpn/client-config

;dns
push "dhcp-option DNS 198.18.2.1" # Change this to your router's LAN IP Address
client-to-client

### (optional) compression (Can be slow)
#comp-lzo
persist-key
persist-tun

verb 3
keepalive 10 120
duplicate-cn
max-clients 100

HG255d的配置文件

client
tls-client
dev tun0
proto tcp
remote gw2.d2okkk.net 11994
resolv-retry infinite
nobind
ca /tmp/vpn/ca.crt
cert /tmp/vpn/d2o-nas.crt
key /tmp/vpn/d2o-nas.key
dh /tmp/vpn/dh1024.pem
#comp-lzo
max-routes 1000
persist-tun
persist-key
verb 3
connect-retry 300
connect-retry-max 1000

script-security 2
up /tmp/vpn/linkup.sh
down /tmp/vpn/linkdown.sh

GW4与HG255d的vpn也是相同的原理,在此就省略了。

接下来才是重点,BGP的配置。

在openwrt中有quagga的软件,官方原版的可以直接opkg安装。网上大神的版本可能需要自己编译,毕竟这个东西很少人会用到。大神一般不会集成到固件里面。

opkg update
opkg install quagga-zebra
opkg install quagga-bgpd

装好之后直接修改配置文件。

GW2的/etc/quagga/bgpd.conf

password 登录密码
!!AS号 65002
router bgp 65002
!
!!router id 198.18.2.1
 bgp router-id 198.18.2.1
!
!!GW2的直连网段
 network 198.18.2.0/24
 network 198.18.16.0/23
!
!!重分布内核路由到BGP(GW2本身有静态路由指到联通网关,默认走电信网关)
!!重分布的时候加个route-map过滤下,好习惯
 redistribute kernel route-map kernel_into_bgp
!!建立邻居HG255d
 neighbor 198.18.16.98 remote-as 65008
 neighbor 198.18.16.98 description D2O-Home
!
!!由于openvpn的tunnel模式是点对多点连接,所以客户端与服务端之间并非直连,要加多跳参数,否则会有问题。
!!此问题折腾了笔者一个晚上
 neighbor 198.18.16.98 ebgp-multihop 10
!
!!过滤通告给hg255d的路由,只需把从内核重分布过来的联通路由通告给Hg255d,其余的过滤掉。
 neighbor 198.18.16.98 route-map tel-client out
!
!!建立邻居GW4
 neighbor 198.18.0.2 remote-as 65004
 neighbor 198.18.0.2 description GW4
!
!!过滤通告给GW4的路由。
!
 neighbor 198.18.0.2 route-map gw-out out

!!route-map和prefix-list

route-map gw-out permit 5
 match ip address prefix-list d2o-network

ip prefix-list d2o-network permit 198.18.0.0/16 le 32

route-map kernel_into_bgp permit 10
 match ip address prefix-list uni

route-map tel-client permit 10
 match ip address prefix-list uni

!!联通路由条目的前缀列表,太长,在此省略
ip prefix-list uni permit xxx.xxx.xxx.xxx/x

GW4的配置文件也是同理,在此省略。读者自行脑补,或者日后有空我再补上。。

HG255d的配置文件 /etc/quagga/bgpd.conf

!
password 密码
!
!!HG255d的AS号65008
router bgp 65008
 bgp router-id 198.18.8.251
 network 198.18.8.0/24
 network 198.18.12.0/24
!!keepalive time和hold time
 timers bgp 20 60
!
!!邻居
 neighbor 198.18.16.1 remote-as 65002
 neighbor 198.18.16.1 description GW2
 neighbor 198.18.16.1 ebgp-multihop 10
 neighbor 198.18.16.1 route-map gw-out out
 neighbor 198.18.18.1 remote-as 65004
 neighbor 198.18.18.1 description GW4
 neighbor 198.18.18.1 ebgp-multihop 10
 neighbor 198.18.18.1 route-map gw-out out
!
ip prefix-list d2o-network seq 5 permit 198.18.0.0/16 le 32
!
route-map gw-out permit 5
 match ip address prefix-list d2o-network

全部配置完成之后所有节点启动quagga。然后可以telnet到quagga的bgpd控制台,看到熟悉的界面,思科命令。。

/etc/init.d/quagga start
telnet locahost 2605

稍等片刻就可与看到BGP邻居已经建立,并且接收到路由了(图中未实现双上联)。


回到ssh界面,输入ip route。可以看到路由已经导入到内核里面了



未尽之处,欢迎评论交流。


Enjoy !!

原文首发CSDN博客,转载请保留出处并保持文章完整!!


参考:

http://openmaniak.com/openvpn_routing.php

http://martybugs.net/wireless/openwrt/quagga.cgi

http://www.nongnu.org/quagga/docs/docs-info.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章