實(shí)路出真知 FreeBSD8下Bridge配置openVPN
原創(chuàng)【51CTO.com 獨(dú)家特稿】公司的辦公網(wǎng)絡(luò)是192.168.4.0/24,均只用單網(wǎng)卡eth0,通過(guò)Juniper防火墻映射公網(wǎng)IP上網(wǎng),即內(nèi)網(wǎng)內(nèi)所有的機(jī)器的網(wǎng)關(guān)均是防火墻的固定IP-192.168.4.3,目前想通過(guò)外網(wǎng)撥號(hào)(VPN服務(wù)器IP為192.168.4.46)進(jìn)公司內(nèi)部局域網(wǎng)進(jìn)行辦公,另外還要求能夠連通到公司內(nèi)部的192.168.10.0、192.168.20.0、192.168.21.0網(wǎng)段的服務(wù)器,要求比之前復(fù)雜;而同事們的撥號(hào)環(huán)境又一樣,有的是小區(qū)環(huán)境,有的是ADSL,還有的是電信3G無(wú)線上網(wǎng);我將大家的需求歸納了下,即:
推薦專題:企業(yè)內(nèi)網(wǎng)開(kāi)發(fā)環(huán)境部署與管理全攻略(FreeBSD+PHP)
一、要求能夠在ADSL撥號(hào)或小區(qū)環(huán)境下順利的VPN到公司的openVPN服務(wù)器中;
二、公司的辦公環(huán)境是192.168.4.0,撥上來(lái)要求能夠連到192.168.21.0,192.168.20.0,192.168.10.0的服務(wù)器網(wǎng)段;
三、公司的網(wǎng)絡(luò)環(huán)境已定型,不可能在路由器或防火墻上作更改;
四、考慮到路由穿透的問(wèn)題,即最低限度要做到局對(duì)局。
基于以上考慮,我們準(zhǔn)備采取openVPN的網(wǎng)橋模式。
公司的辦公拓補(bǔ)很簡(jiǎn)單,如下圖:
以下資料參考chinaunix網(wǎng)友溫占考的翻譯文章,特此注明。
◆使用路由還是橋接的VPN?
路由和橋接的主要不同參看FAQ,橋接的詳細(xì)信息參看Ethernet Bridging。總的來(lái)說(shuō),路由對(duì)大多數(shù)人來(lái)說(shuō)是一種更好的方式,因?yàn)樗葮蚪有矢咭哺菀自O(shè)置(僅OpenVPN配置文件本身)。路由還可以給每個(gè)客戶端設(shè)置不同的訪問(wèn)權(quán)限。推薦使用路由,除非你需要使用依賴于橋接的特性,比如:VPN需要處理非IP協(xié)議,例如IPX協(xié)議。在VPN上運(yùn)行的程序依賴于網(wǎng)絡(luò)廣播(例如局域網(wǎng)游戲)。不建立Samba或WINS服務(wù)器,而允許在VPN上瀏覽Windows共享文件。
◆TUN設(shè)備和TAP設(shè)備的不同?
TAP設(shè)備是一塊虛擬的以太網(wǎng)卡,TUN設(shè)備是一個(gè)虛擬的點(diǎn)到點(diǎn)IP鏈接。
◆什么是橋接?
橋接是在一個(gè)子網(wǎng)上創(chuàng)建一個(gè)虛擬的、廣域的以太網(wǎng)LAN一種技術(shù)。橋接的實(shí)踐信息,參看Ethernet Bridging Mini-HOWTO,形象的解釋就是它就是連通不同局域網(wǎng)的橋梁,當(dāng)外網(wǎng)用戶VPN過(guò)來(lái)時(shí),如果能夠連通openVPN機(jī)器,那么openVPN能夠連通的機(jī)器,外網(wǎng)用戶都應(yīng)該能夠連通。#p#
◆橋接和路由的不同?
橋接和路由是通過(guò)VPN連接系統(tǒng)的兩種方法。
橋接的優(yōu)點(diǎn):廣播可以穿越VPN--允許依賴局域網(wǎng)廣播的軟件運(yùn)行,比如Windows的NetBIOS文件共享和網(wǎng)上鄰居。無(wú)需配置路由:可以和以太網(wǎng)上的任何協(xié)議一起工作,包括IPv4, IPv6, Netware IPX, AppleTalk等等。
Relatively easy-to-configure solution for road warriors.
橋接的缺點(diǎn):比路由效率低,擴(kuò)展性不太好。
路由的優(yōu)點(diǎn):高效和可擴(kuò)展、更好的MTU調(diào)節(jié)
路由的缺點(diǎn):要使跨越VPN的網(wǎng)絡(luò)瀏覽工作,客戶端必須使用一個(gè)WINS服務(wù)器(比如samba)。必須設(shè)置連接每一個(gè)子網(wǎng)的路由。依賴于廣播的軟件不能看到在VPN另一邊的機(jī)器。僅支持IPv4, 如果連接兩邊的tun驅(qū)動(dòng)明確支持IPv6,則也支持IPv6.
◆橋接和路由在配置上有什么不同?
當(dāng)客戶端通過(guò)橋接方式連接遠(yuǎn)端網(wǎng)絡(luò)時(shí),它被分配一個(gè)遠(yuǎn)端物理以太子網(wǎng)的IP地址,從而能夠和遠(yuǎn)端子網(wǎng)其它機(jī)器交互就象它是連接在本地一樣。橋接需要特殊的OS-相關(guān)的工具用來(lái)將物理以太網(wǎng)卡和虛擬的TAP設(shè)備橋接起來(lái)。在Linux下,brtcl就是這樣一個(gè)工具。
對(duì)于Windowx XP或更高版本,從"控制面板->網(wǎng)絡(luò)連接"中選中TAP-Win32網(wǎng)卡和以太網(wǎng)卡,點(diǎn)擊鼠標(biāo)右鍵,選擇轎接。而客戶端通過(guò)路由方式連接時(shí),它使用自己的獨(dú)立子網(wǎng), 并且在客戶機(jī)和遠(yuǎn)端網(wǎng)關(guān)上都設(shè)置了路由,從而可以使數(shù)據(jù)包無(wú)縫地穿越VPN??蛻舳丝梢圆恢皇且慌_(tái)機(jī)子,它可以是幾臺(tái)機(jī)子組成的一個(gè)子網(wǎng)。
橋接和路由很相似,主要的不同是路由的VPN不傳送IP廣播包,但是橋接的VPN傳送IP廣播包。
要使用橋接方式,連接的兩端都必須使用--dev tap,如果使用路由方式,可以使用--dev tap也可以使用--dev tun,但是連接的兩端必須一致. 對(duì)于路由方式而言,--dev tun的效率要更高一些。
Ethernet Bridging
橋接概覽
以太網(wǎng)橋接將一個(gè)以太網(wǎng)接口和一個(gè)或多個(gè)虛擬TAP接口結(jié)合(combine)并將它們橋接為一個(gè)橋接接口。以太網(wǎng)橋接代表一個(gè)物理以太網(wǎng)交換機(jī) (switch)的軟件模擬,以太網(wǎng)橋可以 認(rèn)為是在一臺(tái)機(jī)器上共享一個(gè)IP子網(wǎng)連接多個(gè)以太網(wǎng)卡(物理的或虛擬的)的軟件交換機(jī),
通過(guò)將在不同地方的一個(gè)物理以太網(wǎng)卡和一個(gè)OpenVPN的TAP接口橋接,可以將兩個(gè)以太網(wǎng)絡(luò)在邏輯上合并為好象是一個(gè)以太子網(wǎng)。
一、這里交待下openVPN的操作系統(tǒng)及網(wǎng)絡(luò)分配等。
openVPN服務(wù)器采用64bit的FreeBSD8,分配的IP為192.168.4.46,通過(guò)防火墻NAT上網(wǎng),網(wǎng)關(guān)為192.168.4.3,單網(wǎng)卡,無(wú)公網(wǎng)IP;Freebsd8下配置網(wǎng)卡跟linux一樣,用腳本控制較簡(jiǎn)單,腳本如下:
[root@openvpn ~]# cat /root/addbr0.sh
#!/bin/sh
kldload if_tap
ifconfig bridge0 create
ifconfig bridge0 addm re0
ifconfig bridge0 192.168.4.241 netmask 255.255.255.0 broadcast 192.168.4.255
/usr/local/sbin/openvpn --config /usr/local/etc/server.conf --daemon openvpn
ifconfig bridge0 addm tap0ifconfig bridge0 deletem tap0
/usr/local/sbin/openvpn --config /usr/local/etc/server.conf --daemon openvpn
ifconfig bridge0 addm tap0
#p#
這里說(shuō)明一下,跟bridge0分配的也是192.168.4.0網(wǎng)段的機(jī)器,這里我看網(wǎng)上大部分的文章都是用IP,即192.168.4.46,我建議另一個(gè)IP配置,這個(gè)IP不能跟局域網(wǎng)的IP發(fā)生沖突,腳本成功運(yùn)行后,可用命令ifconfig 檢查下,成功的配置應(yīng)該如下:
二、安裝過(guò)程我簡(jiǎn)略帶過(guò),不會(huì)的朋友請(qǐng)參考googel的相關(guān)搜索結(jié)果或我的上一篇文章《實(shí)路出真知 配置openVPN時(shí)應(yīng)該注意的事項(xiàng)》,Server端的配置如下,這是重頭戲,相關(guān)語(yǔ)法我會(huì)詳細(xì)介紹。
[root@openvpn ~]# cat /usr/local/etc/server.conf | grep -v "^#" | grep -v "^;" | sed '/^$/d'
port 1194
proto udp
dev tap0
ca /usr/local/src/openvpn-2.0.9/easy-rsa/2.0/keys/ca.crt
cert /usr/local/src/openvpn-2.0.9/easy-rsa/2.0/keys/server.crt
key /usr/local/src/openvpn-2.0.9/easy-rsa/2.0/keys/server.key # This file should be kept secret
dh /usr/local/src/openvpn-2.0.9/easy-rsa/2.0/keys/dh1024.pem
ifconfig 192.168.4.241 255.255.255.0
server-bridge 192.168.4.241 255.255.255.0 192.168.4.244 192.168.4.246
push "redirect-gateway"
client-to-client
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log-append openvpn.log
verb 3
以上腳本運(yùn)行時(shí)已成功啟動(dòng)了openVPN,并分配了網(wǎng)橋bridge0地址--192.168.4.241,可用命令lsof -i:1194檢驗(yàn)下。#p#
這里我將server.conf詳細(xì)參數(shù)說(shuō)明下,這里也是用bridge配置的重點(diǎn)
;locala.b.c.d ##申明本機(jī)使用的IP地址,也可以不說(shuō)明
port1194 ##申明使用的端口,默認(rèn)1194
;prototcp ##申明使用的協(xié)議,默認(rèn)使用UDP,如果使用HTTP proxy,必須使用TCP協(xié)議
proto udp
dev tap ##申明使用的設(shè)備可選tap和tun,tap是二層設(shè)備,支持鏈路層協(xié)議。#tun是ip層的點(diǎn)對(duì)點(diǎn)協(xié)議,限制稍微多一些,本人習(xí)慣使用TAP設(shè)備
;devtun
;dev-nodeMyTap #windows下需要像這樣指定設(shè)備名
##OpenVPN使用的ROOT CA,使用build-ca生成的,用于驗(yàn)證客戶是證書(shū)是否合法
ca /user/local/src/openvpn-2.0.9/easy-rsa/keys/ca.crt
#Server使用的證書(shū)文件
cert /usr/local/src/openvpn-2.0.9/easy-rsa/keys/server.crt
#Server使用的證書(shū)對(duì)應(yīng)的key,注意文件的權(quán)限,防止被盜
key /usr/local/src/openvpn-2.0.9/easy-rsa/keys/server.key
#This file should be kept secret
#CRL文件的申明,被吊銷(xiāo)的證書(shū)鏈,這些證書(shū)將無(wú)法登錄
crl-verify vpncrl.pem
#上面提到的生成的Diffie-Hellman文件
dh /user/local/src/openvpn-2.0.9/easy-rsa/keys/dh1024.pem
#防止openvpn重新啟動(dòng)后"忘記"Client曾經(jīng)使用過(guò)的IP地址
ifconfig-pool-persistipp.txt
#Bridge狀態(tài)下類似DHCPD的配置,為客戶分配地址,由于這里工作在橋接模式
server-bridge 192.168.4.241 255.255.255.0 192.168.4.244 192.168.4.246
#openVPN中有個(gè)參數(shù)是push,它表示通過(guò)VPN Server往Client push路由, client通過(guò)pull指令獲得Server push的所有選項(xiàng)并應(yīng)用(這一點(diǎn)很重要,這樣其他服務(wù)器添加一下路由就可以登陸了, 否則無(wú)效,這個(gè)最好和你的內(nèi)網(wǎng)斷一至,否則也不生效),但在網(wǎng)橋模式下這個(gè)就不需要配置了,這個(gè)主要用于其路由模式。
#如果可以讓VPN Client之間相互訪問(wèn)直接通過(guò)openvpn程序轉(zhuǎn)發(fā)
client-to-client
#NAT后面使用VPN,如果VPN長(zhǎng)時(shí)間不通信,NAT Session可能會(huì)失效,
#導(dǎo)致VPN連接丟失,為防止之類事情的發(fā)生,keepalive提供一個(gè)類似于ping的機(jī)制,
#下面表示每10秒通過(guò)VPN的Control通道ping對(duì)方,如果連續(xù)120秒無(wú)法ping通,
#認(rèn)為連接丟失,并重新啟動(dòng)VPN,重新連接
#(對(duì)于mode server模式下的openvpn不會(huì)重新連接)。
keepalive10 120
#對(duì)數(shù)據(jù)進(jìn)行壓縮,注意Server和Client一致
comp-lzo
#定義最大連接數(shù)
max-clients100
#定義運(yùn)行openvpn的用戶
usernobody
groupnobody
#通過(guò)keepalive檢測(cè)超時(shí)后,重新啟動(dòng)VPN,不重新讀取keys,保留第一次使用的keys
persist-key
#通過(guò)keepalive檢測(cè)超時(shí)后,重新啟動(dòng)VPN,一直保持tun或者tap設(shè)備是linkup的,
#否則網(wǎng)絡(luò)連接會(huì)先linkdown然后linkup
persist-tun
#定期把openvpn的一些狀態(tài)信息寫(xiě)到文件中,以便自己寫(xiě)程序計(jì)費(fèi)或者進(jìn)行其他操作
statusopenvpn-status.log
#記錄日志,每次重新啟動(dòng)openvpn后刪除原有的log信息
log
openvpn.log
#相當(dāng)于debug level,具體查看manual
verb3
客戶端的配置文件較簡(jiǎn)單, 我們這里就不能詳細(xì)闡述了,如下:
[root@openvpn]# cat client.txt | grep -v "^;" | grep -v "^#" | sed '/^$/d'
client
dev tap0
proto udp
remote 192.168.4.46 1194
#內(nèi)網(wǎng)通過(guò)防火墻NAT作的DMZ映射出去
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert zacharyz.crt
key zacharyz.key
comp-lzo
verb 3
測(cè)試結(jié)果:
我們測(cè)試時(shí)分配的是聯(lián)通的公網(wǎng)IP,測(cè)試時(shí)發(fā)現(xiàn)只要一撥號(hào),無(wú)論是ADSL還是小區(qū)環(huán)境,結(jié)果只要能連通192.168.4.46的機(jī)器,它所能連通的網(wǎng)段均都能連通,由于 我只需要ssh環(huán)境即可完成日常工作,但其它同事需要遠(yuǎn)程桌面環(huán)境,所以準(zhǔn)備將其更改完電信的公網(wǎng)IP;另整個(gè)環(huán)境部署工作完成時(shí),得到了我們部門(mén)經(jīng)理Manager Z的幫助,這里 表示感謝。這篇文章主要介紹的是橋接模式下的openVPN,如果只需要路由模式,請(qǐng)參考我在51cto的另一篇openVPN相關(guān)文章,請(qǐng)注意二者的區(qū)別;整個(gè)openVPN在64bit的Freebsd8下完成。
實(shí)際投入運(yùn)用結(jié)果:
將openVPN映射的外網(wǎng)改成電信IP后,發(fā)現(xiàn)丟包現(xiàn)象完全沒(méi)有了;通過(guò)ADSL撥號(hào)上來(lái),192.168.21.0/192.168.4.0/192.168.10.0/10.0.0.0這些網(wǎng)段的服務(wù)機(jī)和客戶機(jī)全通了;比路由模式確實(shí)簡(jiǎn)單方便多了,如果有openVPN網(wǎng)橋需求的同志可參考這篇線上環(huán)境文章。
整個(gè)環(huán)境搭配總結(jié):
一、同事們的上網(wǎng)環(huán)境不一樣,有的是長(zhǎng)城帶寬,還有的是廣電網(wǎng),我是天翼3G,還有的是ADSL共享上網(wǎng),使用效果大家還是非常滿意的,openVPN的穿透非常強(qiáng),什么的硬件防火墻或路由器都穿透了;
二、電信服務(wù)器對(duì)應(yīng)電信的撥號(hào)客戶端效果不錯(cuò),如果是聯(lián)通對(duì)電信,那就是個(gè)杯具了;
三、盡量讓環(huán)境搭得讓大家舒服些,我在服務(wù)器添加了"push dns"選項(xiàng),就是可以讓大家一邊上內(nèi)網(wǎng),一邊聊QQ,工作和娛樂(lè)兩不誤;
四、以后有環(huán)境的話我會(huì)用openVPN作機(jī)房的網(wǎng)關(guān),用于多機(jī)房的VPN連接。
【51CTO.com獨(dú)家特稿,非經(jīng)授權(quán)謝絕轉(zhuǎn)載!合作媒體轉(zhuǎn)載請(qǐng)注明原文出處及出處!】