[轉貼]詳解-OpenVPN中的routing

這文章的前半段還有看懂一些,之後的文章就不OK了
備忘起來慢慢看

網路概論我超不熟的啦>”<

 

原文出處http://cheaster.blogspot.com/2009/11/openvpnrouting.html

在網路上有很多教學,會叫你把vpn當做default-route-gateway…但,這樣很容易一失敗就造成server本身外連有問題…如果外連有問題,你想遠端修改都不行…所以,我強烈建議不熟routing是啥東東西,不要太輕易就把server本機的default-route給改掉…

以linux上來看,假設本機實體網路卡eth0使用的ip-address為[192.168.1.1/32][gateway=192.168.1.254],vpn網卡tun0/tap0使用的ip-address為[10.8.0.1/24]/p–t–p[10.8.0.2/24]=gateway,指令[route -n]=表a

表a:
dest/mask,gateway,dev
10.8.0.2/32,0.0.0.0,tun0
10.8.0.0/24,10.8.0.2,tun0
192.168.1.0/24,0.0.0.0,eth0
0.0.0.0/0,192.168.1.254,eth0

上面這一塊,有上過網路管理課程的朋友一定很了解,我就大至上講一下,routing-table就是告訴電腦的封包該往哪走…用白話一點描述就是

  1. 封包-a想去10.8.0.1~10.8.0.255的地方,必須到10.8.0.2的門口排隊
  2. 封包-b想去192.168.1.1~192.168.1.255的地方,必須到0.0.0.0的門口排隊
  3. 不想去上面二個地方,而想去別處的,就通通到192.168.1.254的門口排隊

想去的地方,就是routing-table上的dest(目的地),門口就是gateway,dev指的就是你的實體設備(電腦中叫網路卡)

所以我以vpn+nat的方式來表述一下

vpn-client[10.8.0.10/32]/tun0-vpn-server[10.8.0.1/32]/tun0-vpn-gateway[10.8.0.2/32]
eth0-實體網路[192.168.1.1/32]/eth0-實體網路-gateway[192.168.1.254/32]
表a就是這一台啟動vpn服務的routing-table

以一般我們vpn-server-conf的預設,若無特別設定的話,client端除了本身自有的網路產生的路由表(routing-table),還會因為連上vpn-service時產生的dest:10.8.0.0/24,gateway:vpn_gateway(絕對不會是10.8.0.2/32,因為vpn的gateway是vpn-service去操控的,只要你設定正常…基本上不用理)

所以到這面為止,綜合basic-setting的話,你會發現,vpn只有讓10.8.0.0/24互通而已…也就是client[10.8.0.10]可以連到server[10.8.0.0/24]…這也就是server.conf中client-to-client的用意(不過,不啟用client-to-client也會有這個routing…因為這算是vpn-lan中的default-route…client-to-client只是告訴vpn-service,client們可以互相連繫)

但我用vpn是為了可以方面連到學校內部,因為學校有一些內部的管理只能允許校內ip,所以,vpn就得配合nat的方式出去

在[OpenVPN–純架設-by ssl]的routing/nat/forward做過說明了…所以,在此我就先當做你server端的vpn-input/output/forward/nat已設定在iptables上了…接著,我就來說說怎麼設定routing-table

在server.conf中,你會看到一些用[push “xxxxxxxxxxxxxxxxxx”]的東東,這push的意思就是把後面引號中的東西設定到client去…若你在server.conf看到[xxxxxxxxxxxxxx]沒引號也沒push的話,那代表是設定在server上…以上我舉幾個例子

a—[讓vpn-client可以透過vpn的tunnel連到學校192.168.10.0/24區域]

在server.conf寫:
push “192.168.10.0 255.255.255.0”
上面的意思轉成手動寫routing-table的話就是
[route add 192.168.10.0/24 vpn_gateway dev tun0]

b—[讓vpn-client可以透過vpn的tunnel連到學校192.168.10.0/24區域,但192.168.10.5/32不希望client用vpn-tunnel]

在server.conf寫:
push “192.168.10.5 255.255.255.255 net_gateway”
push “192.168.10.0 255.255.255.0”
跟a的意思一樣,只是192.168.10.5/32特別指定不要用vpn_gateway,而照client的default_gateway走

以上兩個,只要你本身server的forward與nat在iptables設定正確的話…你可以在client用trace-route去測,正確的trace-route的表應該是

client-windows-xp
cmd<—-tracert 192.168.10.1
1 1ms 1ms 1ms —- vpn_gateway(10.8.0.1)
2 ?ms ?ms ?ms —- 192.168.1.254(server-eth0-gateway)
3 ?ms ?ms ?ms —- 192.168.10.1
當然,2跟3中間會因為你經過的網路設備而有其他的gateway會回應

如果你trace-route的第一個gateway不是vpn_gateway的話,那你最好檢查一下你client的routing-table…因為,如果你client本身所在的網路就是在192.168.10.0/24的話,基本上,應該不會走vpn_gateway
又或者你自己已有設定routing-table在client端…要記住一件事,routing-table的優先順序會從最小範圍先走<—不懂啥意思,沒關係,我再舉個例子,我假設有底下routing-table-表b,如果我現在要連1.1.1.1,1.1.2.1,1.3.1.1,4.1.1.1,1.1.1.129會怎麼走

routing-table-表b
dest,gateway
1——1.1.1.0/24,gw-a
2——1.1.1.128/25,gw-e
3——1.1.0.0/16,gw-b
4——1.0.0.0/8,gw-c
5——0.0.00/0,gw-d

1.1.1.1—->gw-a
1.1.2.1—->gw-b
1.3.1.1—->gw-c
4.1.1.1—->gw-d
1.1.1.129–>gw-e
其實重點只有1.1.1.1跟1.1.1.129…這兩是同一個class-c,為什麼1.1.1.1會走gw-a,而1.1.1.129不走gw-a而走gw-e
因為routing-table中的1—>1.1.1.0/24—>範圍是指1.1.1.0~1.1.1.255—>256
而2—->1.1.1.128/25—>範圍是指1.1.1.128~1.1.1.255—>128
routing會挑範圍小的先走…就是這意思…(不過上面的算法應該是不會把網路位址跟廣播位址算進去啦)

以上…就是小小的說明在OpenVPN中,怎麼設定server/client的路由走向…
設定的好的話,基本上可以在server把openvpn的服務多開幾個,設定多個tun/tap的虛擬網卡,server.conf也可以寫多個不同的…記得port要用不同的,然後你就可以控制什麼使用者用啥port連入vpn-server時,會走什麼樣的routing…這樣也不怕會有人偷渡…

當然,server可以多config開多,client也行…但如果你server或client是windows的,記得要手動新增vpn虛擬網卡,各設定檔之間是不能共用一個虛擬網卡的,記得,dhcp給的ip最好也自己設定一下…反正虛擬ip蠻多可以用的…

class-A->10.0.0.0/8
class-B->172.16.0.0/11
class-C->192.168.0.0/16

應該吧…不然就google查一下就行了 在網路上有很多教學,會叫你把vpn當做default-route-gateway…但,這樣很容易一失敗就造成server本身外連有問題…如果外連有問題,你想遠端修改都不行…所以,我強烈建議不熟routing是啥東東西,不要太輕易就把server本機的default-route給改掉…

以linux上來看,假設本機實體網路卡eth0使用的ip-address為[192.168.1.1/32][gateway=192.168.1.254],vpn網卡tun0/tap0使用的ip-address為[10.8.0.1/24]/p–t–p[10.8.0.2/24]=gateway,指令[route -n]=表a

表a:
dest/mask,gateway,dev
10.8.0.2/32,0.0.0.0,tun0
10.8.0.0/24,10.8.0.2,tun0
192.168.1.0/24,0.0.0.0,eth0
0.0.0.0/0,192.168.1.254,eth0

上面這一塊,有上過網路管理課程的朋友一定很了解,我就大至上講一下,routing-table就是告訴電腦的封包該往哪走…用白話一點描述就是

  1. 封包-a想去10.8.0.1~10.8.0.255的地方,必須到10.8.0.2的門口排隊
  2. 封包-b想去192.168.1.1~192.168.1.255的地方,必須到0.0.0.0的門口排隊
  3. 不想去上面二個地方,而想去別處的,就通通到192.168.1.254的門口排隊

想去的地方,就是routing-table上的dest(目的地),門口就是gateway,dev指的就是你的實體設備(電腦中叫網路卡)

所以我以vpn+nat的方式來表述一下

vpn-client[10.8.0.10/32]/tun0-vpn-server[10.8.0.1/32]/tun0-vpn-gateway[10.8.0.2/32]
eth0-實體網路[192.168.1.1/32]/eth0-實體網路-gateway[192.168.1.254/32]
表a就是這一台啟動vpn服務的routing-table

以一般我們vpn-server-conf的預設,若無特別設定的話,client端除了本身自有的網路產生的路由表(routing-table),還會因為連上vpn-service時產生的dest:10.8.0.0/24,gateway:vpn_gateway(絕對不會是10.8.0.2/32,因為vpn的gateway是vpn-service去操控的,只要你設定正常…基本上不用理)

所以到這面為止,綜合basic-setting的話,你會發現,vpn只有讓10.8.0.0/24互通而已…也就是client[10.8.0.10]可以連到server[10.8.0.0/24]…這也就是server.conf中client-to-client的用意(不過,不啟用client-to-client也會有這個routing…因為這算是vpn-lan中的default-route…client-to-client只是告訴vpn-service,client們可以互相連繫)

但我用vpn是為了可以方面連到學校內部,因為學校有一些內部的管理只能允許校內ip,所以,vpn就得配合nat的方式出去

在[OpenVPN–純架設-by ssl]的routing/nat/forward做過說明了…所以,在此我就先當做你server端的vpn-input/output/forward/nat已設定在iptables上了…接著,我就來說說怎麼設定routing-table

在server.conf中,你會看到一些用[push “xxxxxxxxxxxxxxxxxx”]的東東,這push的意思就是把後面引號中的東西設定到client去…若你在server.conf看到[xxxxxxxxxxxxxx]沒引號也沒push的話,那代表是設定在server上…以上我舉幾個例子

a—[讓vpn-client可以透過vpn的tunnel連到學校192.168.10.0/24區域]

在server.conf寫:
push “192.168.10.0 255.255.255.0”
上面的意思轉成手動寫routing-table的話就是
[route add 192.168.10.0/24 vpn_gateway dev tun0]

b—[讓vpn-client可以透過vpn的tunnel連到學校192.168.10.0/24區域,但192.168.10.5/32不希望client用vpn-tunnel]

在server.conf寫:
push “192.168.10.5 255.255.255.255 net_gateway”
push “192.168.10.0 255.255.255.0”
跟a的意思一樣,只是192.168.10.5/32特別指定不要用vpn_gateway,而照client的default_gateway走

以上兩個,只要你本身server的forward與nat在iptables設定正確的話…你可以在client用trace-route去測,正確的trace-route的表應該是

client-windows-xp
cmd<—-tracert 192.168.10.1
1 1ms 1ms 1ms —- vpn_gateway(10.8.0.1)
2 ?ms ?ms ?ms —- 192.168.1.254(server-eth0-gateway)
3 ?ms ?ms ?ms —- 192.168.10.1
當然,2跟3中間會因為你經過的網路設備而有其他的gateway會回應

如果你trace-route的第一個gateway不是vpn_gateway的話,那你最好檢查一下你client的routing-table…因為,如果你client本身所在的網路就是在192.168.10.0/24的話,基本上,應該不會走vpn_gateway
又或者你自己已有設定routing-table在client端…要記住一件事,routing-table的優先順序會從最小範圍先走<—不懂啥意思,沒關係,我再舉個例子,我假設有底下routing-table-表b,如果我現在要連1.1.1.1,1.1.2.1,1.3.1.1,4.1.1.1,1.1.1.129會怎麼走

routing-table-表b
dest,gateway
1——1.1.1.0/24,gw-a
2——1.1.1.128/25,gw-e
3——1.1.0.0/16,gw-b
4——1.0.0.0/8,gw-c
5——0.0.00/0,gw-d

1.1.1.1—->gw-a
1.1.2.1—->gw-b
1.3.1.1—->gw-c
4.1.1.1—->gw-d
1.1.1.129–>gw-e
其實重點只有1.1.1.1跟1.1.1.129…這兩是同一個class-c,為什麼1.1.1.1會走gw-a,而1.1.1.129不走gw-a而走gw-e
因為routing-table中的1—>1.1.1.0/24—>範圍是指1.1.1.0~1.1.1.255—>256
而2—->1.1.1.128/25—>範圍是指1.1.1.128~1.1.1.255—>128
routing會挑範圍小的先走…就是這意思…(不過上面的算法應該是不會把網路位址跟廣播位址算進去啦)

以上…就是小小的說明在OpenVPN中,怎麼設定server/client的路由走向…
設定的好的話,基本上可以在server把openvpn的服務多開幾個,設定多個tun/tap的虛擬網卡,server.conf也可以寫多個不同的…記得port要用不同的,然後你就可以控制什麼使用者用啥port連入vpn-server時,會走什麼樣的routing…這樣也不怕會有人偷渡…

當然,server可以多config開多,client也行…但如果你server或client是windows的,記得要手動新增vpn虛擬網卡,各設定檔之間是不能共用一個虛擬網卡的,記得,dhcp給的ip最好也自己設定一下…反正虛擬ip蠻多可以用的…

class-A->10.0.0.0/8
class-B->172.16.0.0/11
class-C->192.168.0.0/16

應該吧…不然就google查一下就行了

在〈[轉貼]詳解-OpenVPN中的routing〉中有 4 則留言

  1. 實在抱歉…我粉久之後才發現你有在我blogspot上留言…
    也很抱歉我寫的openvpn-routing讓你看不懂…
    不過,說實在的,我blogspot上的東西通常都是我個人的抱怨文跟備忘錄,所以有一些東西我並不會寫得太大眾化…
    不過我是沒想過我寫的東西也有被人轉貼的一天…哈
    你的blog也很不錯…我加入最愛了…(更新的也比我勤呀)
    版主回覆:(04/13/2010 06:00:13 AM)
    大大你過獎了,至少我對於routing有一些基礎的瞭解
    沒有拜讀您的文章,我可能還搞不清楚甚麼是routing呢?
    有個問題想請教,
    1. 如何在OpenVPN能夠調整其Metric?
    我想要讓VPN client能透過server的網路來上網 redirect-gateway(這部分是我已經做出來的)
    但我想要讓那VPN client先去尋找原本的網路routing table
    如果沒有才選擇跑到VPN上
    2. 關於VPN的防火牆和ip_foward設定
    如何讓VPN client連到其背後的電腦的網路芳鄰(SMB)
    a. 將SMB封包作NAT偽裝的可行性
    b. 或是讓VPN client抓到跟其背後的電腦同網段,該如何做呢?
    c. 使用SAMBA做WINS溝通其二個網段,我有做成功,但該連線的網路,防火牆會直接被擋掉(因為不同網段)
    以上的問題,請大大解惑

  2. 關於你的問題1
    我是認為,不用太認定metric…因為,metric的比較是在條件同時符合的時候才會以最小值為優先…
    也就是假設下表為一台電腦routing-table,而此電腦有一封包要連向192.168.0.1
    name/dest/mask/gateway/metric
    a/192.168.0.0/255.255.255.0/192.168.0.254/1
    b/192.168.0.0/255.255.255.0/10.1.1.254/30
    dest=192.168.0.1的條件都是落在192.168.0.0/24,所以a與b都match,所以連線方向會看metric,以小的為優先通道,也就是會往192.168.0.254走
    但基本上,routing的比對是先以範圍為優先比對條件
    name/dest/mask/gateway/metric
    a/192.168.0.0/255.255.255.0/192.168.0.254/1
    b/192.168.0.0/255.255.255.224/10.1.1.254/30
    假設上表為一台電腦的路由表,而此電腦有一封包想連到192.168.0.1
    單純上來看,192.168.0.1的目的地會使a跟b都符合,但是,a(192.168.0.0/24)範圍是0~255,而b(192.168.0.0/27)為0~31,b的match範圍比a小,所以要送到192.168.0.1的封包會先往10.1.1.254送,如果10.1.1.254沒回應的話,才會往192.168.0.254送
    (上面的部份應該了解厚?…不了解的話再跟我說一下)
    而你目前主要的問題,我認為是因為你做了redirect-gateway的關係,這個設定是「強制」讓client所有的網路封包都往vpn-gateway送,我看過openvpn-document,這個設定如果enable,那你再另外設route-policy是無用的…
    所以,我的文章就有說過,如果想要更有效率的使用vpn,儘量花時間去設定route-policy,而不要使用redirect-gateway
    至於你的問題2
    我不是很懂??
    你是想要讓vpn-client透過vpn的加密性來連接上非vpn-client的電腦的網芳??
    還是同是vpn-client的多台電腦讓網芳是連通的??
    那你的vpn-server的os是???因為我想多少會有一些關係
    另外就是,我vpn-server不是windows…而是unix-like的os…
    我想,我可能要找時間弄一台windows的os來試試
    版主回覆:(05/22/2010 02:55:05 PM)
    我之前用OpenVPN的是用windows的版本,他好像只能做到網路連線的互通,至於要透過它
    上網(NAT),Windows找不到合適的軟體去達到NAT的角色和完整的防火牆設定,最後還是回到Linux上,現在我是使用Fedora12做為OpenVPN的server,有實做成功。
    ————
    大大的敘述我換個方式說,看看這樣對不對
    所以metric的前提是,如果有個『範圍』較小的網段,會送到該Gateway
    如果『範圍』大小一樣的話才會選擇其優先值來送封包摟?
    我子網路遮罩的觀念還需要加強,正在拜讀文章中,大大這樣的敘述看得懂
    我是做了redirect-gateway的沒錯,因為我想要把部份流量導到VPN上去
    我觀察XP內建的VPN連線(忘記是不是叫做IPsec?)的路由表,發現VPN的gateway是在一般gateway還後面的。
    換句話說,以網頁瀏覽為例,他會先找現有的gateway有沒有回應,如果沒有,才會到VPN那端去尋找
    我只想要達到這樣的規則即可,因為VPN那端的連線一定是比較慢
    而如果所有封包過去的話,整個上網品質一定會低落
    只是想藉由VPN達到替代上網和和連鍊非vpn-client的網芳
    這樣二個主要目的
    那取代redirect-gateway的route-policy該要如何設定呢?
    感謝狐狸大大的回應,讓我有更清楚些了

  3. 我另外想問…
    1-你指的smb跟直接在win-os中的網路上的芳鄰那個東西是一樣的嗎???
    2-假試1是一樣的,那你有試過直接用ip連線網芳嗎\\ip-address
    我印象中,同一個區網中的網芳是利用廣播(boardcast)詢問對方的…
    但不同區網的話,好像得利用tcp/ip的方式來連
    (印象中啦…不太確定)
    版主回覆:(05/22/2010 02:55:52 PM)
    問題1 沒錯,smb = win-os中的網路上的芳鄰
    問題2測試結果….
    ip連線網芳\\ip-address是OK的
    我想,WINS的作用是在蒐集NetBIOS name吧,然後再解析成IP
    如果VPN的中間都沒有設規則去擋它的話,就可以連線
    會問這問題純脆敝人的觀念錯誤,我以為網芳的模式只能在同個Router底下才能連接

  4. 其實也並無什麼觀念錯誤…而是windows把人的使用電腦的方式簡化太多…
    在我的印象中…網路芳鄰是有分二種方式詢問
    1)廣播方式–boardcast
     這個就像版大你知道的,同一個網路區段底下可以接在網路上的芳鄰上看到
    2)TCP/IP
     就是在下說的\\ip-address
    另外還有一種是可以用\\hostname的方式詢問,不過這個方式應該是在1)的方式底下
    簡單的說,就是windows在osi七層中搞了很多簡化方式…如果網路架構比較不熟的人,的確會在上面翻來覆去
    ===以下是再上一篇的回覆
    其實,windows-server是有NAT的…但workstation我就不確定有沒有了…
    windows-server-NAT你可以看這一篇
    http://blog.weithenn.org/2009/03/windowswindows-2003-server-nat.html
    「所以metric的前提是,如果有個『範圍』較小的網段,會送到該Gateway
    如果『範圍』大小一樣的話才會選擇其優先值來送封包摟?」
    —-其本概念是正確的
    「我是做了redirect-gateway的沒錯,因為我想要把部份流量導到VPN上去」
    「那取代redirect-gateway的route-policy該要如何設定呢?」
    —-這二個會牽扯到一個問題,就是你認為vpn是應該怎麼做?
    以我的做法,我認為vpn是「有限制力的網路」,所以,我才不會用redirect-gateway來把所有的封包都往vpn-gateway走,我是直接使用routing的方式,只讓某一些網段往vpn-gateway走就好…
    就在我的文章中我說有過,可能是我表達方式比較差
    簡單的說,我不會啟用redirect-gateway,所以,如果我push都不設定的話,其本上,就算我開啟了vpn,除了是跟vpn同一段的目的地的是往vpn-gateway走之外,其他我的網路封包都是走我本地端的isp網路的gateway出去的…那這時候就來考慮,我要去哪個目的地才要往vpn-gateway
    例)我要64.233.160.0/19(這是google註冊網段)都往vpn-gateway
     那就在server的config中設定push "64.233.160.0 255.255.224.0"
     設定好啟動server,然後你再連上vpn之後,你就會看到你電腦的routing-table會多64.233.160.0/19的routing,而gateway是指定到vpn-gateway…這時候你可以分別在vpn連線的前後來做一次trace-route試試,如果設定正確的話,你會發現,在vpn連線前,你trace-route http://www.google.com.tw的話,他是會走isp-gateway的…但再vpn連線後,trace的結果就是往vpn-gateway
    當然,你要redirect-gateway也是可以的,只是,redirect-gateway enable之後,你的所有封包是先往vpn-gateway走的
    那你就相反的就是判斷,那一個網路區段的範圍你是不要讓它走向vpn-gateway而直接往isp-gateway…那你在server’s config就要改成用push "xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy net_gateway"…net_gatway只要打上去,就是告訴server說,這個區段的都是要往client端的isp-gateway走
    *註:net_gateway就是指定用字,並非要打上isp-gateway-ip喲
    以上

留言功能已關閉。