這文章的前半段還有看懂一些,之後的文章就不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就是告訴電腦的封包該往哪走…用白話一點描述就是
- 封包-a想去10.8.0.1~10.8.0.255的地方,必須到10.8.0.2的門口排隊
- 封包-b想去192.168.1.1~192.168.1.255的地方,必須到0.0.0.0的門口排隊
- 不想去上面二個地方,而想去別處的,就通通到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就是告訴電腦的封包該往哪走…用白話一點描述就是
- 封包-a想去10.8.0.1~10.8.0.255的地方,必須到10.8.0.2的門口排隊
- 封包-b想去192.168.1.1~192.168.1.255的地方,必須到0.0.0.0的門口排隊
- 不想去上面二個地方,而想去別處的,就通通到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查一下就行了