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

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