注:本文主要目的是給程序員講述一些局域網/VPN的基本知識,並不涉及到具體的實操。關於如何安裝VPN服務器、配置VPN客戶端及修改Windows路由表等具體實操內容,請自行搜索。
RFC
局域網地址為什么是192.168.X.X?簡單地說這是RFC的建議,具體請查看: https://tools.ietf.org/html/rfc5735#section-4
准確說,不只有192.168.X.X,一共有3段地址可以作為局域網的地址:
所以看到10開頭的或者192.168開頭的IPv4地址,那就可以認為是局域網地址了,比較特殊的是172開頭的,因為它的掩碼是12,不是8的整數倍,所以光看到172開頭的地址還不能馬上確定是不是局域網地址,要看是否在172.16.X.X至172.31.X.X之間。
既然是建議,那就不是技術上的硬性要求,那么我能不能把局域網地址設置成別的?答案是肯定的。
比如你可以設置成20.8.13.46,看起來像個公網地址對不?但這樣並不會有什么好處,反而很可能會引起沖突,想一下假如這真的是一個你要訪問的公網地址,那你可能就訪問不到了,因為你的網絡適配器認為這是個局域網地址,不會走網關到公網去。
我們有個客戶的局域網就是類似這種“非標”的,不按套路出牌,造成了不少困擾。
另外提一下RFC,RFC是Request For Comments的意思,意思就是“草案”,Internet開始構建的時候,全世界的工程師們起草的各種文檔,不斷討論更新和修正,所以叫RFC,時過境遷,很多文檔都成為了事實上的標准,但RFC這個名字慣性太大,保留了下來。
為什么要弄3個網段?
因為這3個網段正好對應了A類、B類和C類地址。
A類地址組成的局域網可以容納海量主機,B類地址能容納的主機數量也很多,C類地址則只可以容納254台主機。
事實上,就算你用了A類地址,你也可以設置子網掩碼為24(255.255.255.0的表示,即24個1)來使得這個A類地址和C類地址一樣,只容納254台主機。
但不管怎么說,這是一種廣泛被接受的約定,所以當系統看到一個A類地址的時候,如果沒有額外的配置說明,就默認它的子網掩碼是8,同理,默認B類地址子網掩碼為16,C類為24。
那我們應該選擇哪個網段好呢?我認為用B類地址最為靈活!為什么?要解釋可不是那么容易,接着看吧。
為什么連上公司的VPN就上不了網?
嗯?怎么突然扯這么一個風馬牛不相關的問題?沒事,接着看唄。
為什么連上公司的VPN就上不了網?這是一個困擾了很多人的問題,“通俗”(但不正確)的說法就是一旦連上了VPN,就相當於接入了目標的內網去,當然不能正常訪問其它網絡了。我首先聲明這種說法並不正確,下面具體來說說。
站在我們的視角來說,VPN干了兩件事情:
1,創建一個虛擬網卡,未連接的時候這個網卡是灰色的,即未啟用,這個虛擬網卡我們稱之為VPN網絡適配器
2,連接VPN的時候,虛擬網卡啟用,並修改Windows的路由表使得部分或全部網絡訪問都透過VPN網絡適配器
VPN網絡適配器可以在Windows的控制面板的“控制面板\網絡和 Internet\網絡和共享中心”里的“更改適配器設置”里看到。我們程序員先了解到這里即可,至於VPN客戶端如何與VPN服務器打交道,使用怎樣的隧道協議,過程如何,這個是另一個超級大的話題了,這里不表。
從“適配器”這個驅動層面的東西來看,VPN是比較“底層”的,我們的程序不需要關心這個,不像代理服務器,需要在程序里設。
現在,連VPN就上不了網這個問題應該怎么解釋?根據前面提到的那1、2兩步,我們不難知道,問題出在第2步上,比如你在家里,你要連接公司的內網,IP地址是192.168.20.0/24,現在連接,成功,你能輕松訪問192.168.20.112這台主機了,但不幸的是,根據Windows當前的路由表配置,你的任何網絡訪問都會走VPN網絡適配器,於是你訪問taobao.com也會走VPN,但公司的網絡限制了對taobao.com的訪問啊,所以就出現這個問題了。
解
很顯然,此問題有兩種解,一是讓你們公司IT開放對taobao.com的訪問;二是自己修改Windows路由表,使得對其它網絡(包括公網)的訪問不走VPN。顯然你只能采取第二種方案。
修改路由表是解決這類問題的必殺技,這是可以肯定的,但有時候會比較麻煩,假如你用的VPN客戶端不是Windows自帶的,而是公司/客戶提供的,每次連接的時候,它就會在你的Windows的路由表中塞入一大堆很令人費解的配置,這些亂七八糟配置使得你的正常網絡的訪問變得不可能,你要一條條把這些配置刪除,然后把必要的一條路由規則加進去,符合這條規則的才走VPN,否則走原先默認的適配器,這樣是可以的,但是但是,這種VPN一旦斷開,你重連的時候,你會發現你辛辛苦苦配的Windows路由表又被它重置了,每次都如此,讓人無法接受,前面我提到的那個用“非標”局域網地址的客戶的VPN就是這樣的……這種情況很難有好的解,現在我們討論另一種更普遍的情況,那就是使用的是Windows自帶的VPN客戶端。
可以在前面提到的控制面板的對應的VPN網絡適配器里進行下圖這樣的設置,把“在遠程網絡上使用默認網關”這個選項去掉。
這樣在VPN連接的時候它就基本上不會修改Windows的路由表,我是說基本上不會,實際上,它會默認加一條路由規則,我研究下來是這樣的一條規則:
假如你連接的網絡是192.168.20.0/24,那它就會加這么一條規則:
192.168.20.0/24 => VPN Adapter
因為Windows認為192開頭的這個地址是個C類地址,掩碼自然是24,這個時候如果服務主機就在192.168.20.0/24這個網段上,你可以直接訪問,並且你訪問別的網絡照舊,不會受VPN的影響,很好!
但你要注意,很可能你VPN連接到的只是一個VPN LAN的虛擬網絡,而真實的服務器的地址是在192.168.21.0/24這個網段,這時候你發現你訪問不了服務器,因為對192.168.21.0/24這個地址段的訪問不符合路由規則,不走VPN。怎么辦?
方法一,自行增加一條路由規則:
192.168.21.0/24 => VPN Adapter
這次不算很麻煩,因為規則明確且只有一條,你可以把這條規則作為永久規則,即便VPN斷開之后,它依舊還在,不受影響。但要自己設規則,還是有些麻煩,萬一有些人就是不會呢?能不能更加簡單點?
方法二,重新規划IP地址!
嗯!繞了半天,終於回來了!
以10.X.X.X作為局域網地址的情況
假如連接目標為10.186.2.0/24,而服務主機所在的網段是10.186.3.0/24,我們看看實際發生什么事。
由於10開頭的地址被視作A類地址,它的子網掩碼是8。Windows自動增加的路由規則是:
10.0.0.0/8 => VPN Adapter
你嘗試訪問10.186.3.0/24網段的時候,是符合這條路由規則的,因此你可以訪問10.186.3.0/24網段的主機。
是不是很神奇?設置成192.168.X.X有問題,換成10.X.X.X就好了。
但是,這里面可能有問題!那就是前面一直沒提到的地址沖突的問題。
假如你所在的局域網也是10.X.X.X這樣的地址,那就糟糕了,你會發現你本地網絡都沒法訪問了,原因就是符合了這條路由規則,走了VPN。
那使用192.168.X.X地址有沒有可能出現沖突?當然有,比如你的本地網絡是192.168.1.0/24,目標網絡也是192.168.1.0/24,這非常有可能啊,網管們都喜歡這么設置,那么沖突是肯定的。
以172.X.X.X作為局域網地址的情況
我前面提到了,並不是172開頭的地址都表示是局域網地址,只有172.16.X.X到172.31.X.X才是。大家注意,172是屬於B類地址,它默認的掩碼是16,這就很有趣了,請看下面這個圖:
按照我的掩碼設計,A、B、C、D是4個不同的網絡,而根據B類地址默認的掩碼,A和B是同一個網絡,C和D是同一個網絡。假如我是網管,我就用IP地址的第二個數字來區分廠區,廠區和廠區間不直連,而廠區內再用IP地址的第三個數字來區分不同的內網,這就是我前面所說的“靈活”。
現在你在圖中的“你的位置”,即A網中,由於直接的物理連接,你是能直接訪問B網的,現在你要用VPN撥到D網,想想會怎樣?按前面說的,Windows會創建這么一條路由規則:
172.19.0.0/16 => VPN Adapter
OK不OK?非常OK,你能順利訪問D網,且訪問本地的A網和B網都不受影響。你要注意的只是好好規划地址,避免直接的沖突就行,比如用172.21.14.0/24這種偏冷門的地址。