2009-11-09

詳解-OpenVPN中的routing

因為有細細的玩,所以有發現routing是一個很嚴重的問題

在網路上有很多教學,會叫你把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查一下就行了

4 則留言:

j796160836 提到...

謝謝大大的文章,可以借轉文章嗎?

死狐狸 提到...

哦…我是不反對啦

只不過,我寫的東西通常是我自己以為的情況,但實際上適不適用任何人,這可能就是使用的人要自己測試的

熊 提到...

請問一下,因為我實在不懂網管的東西
我家的區網設定是192.168.0.x
有一台router + NAS 位在 192.168.0.1
有一台win10 PC,位在 192.168.0.5
現在我在win10 PC裝了open vpn
我要如何讓vpn的client電腦連到我的NAS? (192.168.0.1的samba share)

我試過open vpn派發的網段在192.168.0.0
這樣client只連的到Win10本身的SMB分享
也試過open vpn派發的網段在192.168.1.0
但這樣我什麼都連不到 XD

感謝喔!

死狐狸 提到...

如果你在使用 pc 時可以確定與 nas 是正常連線的話…

那應該有問題的是你 vpn 的 route-table 的設定

有幾項你注意看一下…

1) vpn 本身就是一個內區域

2) 要走到 vpn 以外的地方就要靠 routing table

3) 內區域不要和外區域用一樣的 ip 設定,也就是你 nas 和 pc 與 router 之間是 192.168.0.0/24 ,vpn 就不要使用 192.168.0.0/24 的網段,不然路由表會讓 vpn 走不出去。

上面三個確定之後,你可以在 server.conf 去 「push "192.168.0.0 255.255.255.0"」,讓 vpn-client 多出一個可以走往 192.168.0.0/24 的會往 vpn-gateway 走…

或者…你要設定 default-route …但這會變成只要你使用 vpn 之後,所有的 vpn-client 的流量都會從 vpn-tunnel 出去…default-route 的寫法應該是 [push "redirect-gateway"]

因為使用 openvpn 已經有一些時日了,不太確定,你可以試試先