配置路由時指定源位址

2021-12-30 06:59:26 字數 2471 閱讀 8509

配置路由時指定源位址

ip route add 1.2.3.4/32 via 4.3.2.1 src 3.3.3.3

但是在windows上,一切都是內部邏輯自動選擇的,其原則如下:

單網絡卡時,選擇和預設閘道器在同一網段的最匹配ip位址為源;

多網絡卡時,首先選擇預設閘道器所在的網絡卡作為傳送網絡卡,然而在該網絡卡上按照單網絡卡原則選擇乙個ip位址作為源。

因此,如果你的目標位址是1.2.3.4,預設閘道器是4.3.2.1,本地連線上兩個ip位址:4.3.2.2和3.3.3.3,很顯然,4.3.2.2會作為源ip位址被選擇,這樣在發包的時候,4.3.2.2將作為資料報的源ip位址。

然而有時候為了實現自己的一些策略或者小技巧,並不希望系統為我如此自動地封裝源ip位址,比如顯而易見地是在使用openvpn的時候。

首先我們看下所謂的預設閘道器的本質意義是什麼。預設閘道器其實是乙個更加特殊的「下一跳」,它其實就是乙個下一跳位址,這個位址的目的在於將資料報扔給下一跳(廢話),其實它只是乙個輔助作用,真正起作用的是由它解析到的mac位址,因為mac位址才會真正封裝在以太幀當中,那個預設閘道器只是用來得到這個mac位址的,因此如果能靜態指定乙個mac位址,那麼這個預設閘道器可以是任意的。於是就有了乙個辦法:

1.為一條路由生成乙個和欲選擇的源ip位址在同乙個網段的假的預設閘道器,即假的下一跳;

2.為該假閘道器ip位址建立一條靜態的到真閘道器的mac位址的arp對映;

如此一來,源ip位址的選擇過程將完全符合windows的選擇邏輯,我們也就從核心外部繞開了它的限制,從而可以選擇任意的本地連線上配置的位址作為源ip位址。

為了將手工配置的過程實現成乙個自動的過程,程式設計是必不可少的,然而我又不想去呼叫那複雜的api(為了實現乙個很簡單的功能不得不做超級多的準備工作...),只能寄希望於指令碼了,然而windows命令列功能實在太弱,很為難。問同事,百度,google,一遍遍地嘗試,折騰了太久,終於寫出乙個批處理指令碼,發現windows xp的指令碼功能還是很強大的,更不必說power shell了。指令碼如下(沒有echo off):

[plain] 

set destination=%1  

set mask=%2  

set origw=%3  

set source=%4  

::獲取預設閘道器(可以自動發現預設閘道器,太花哨,不提倡)  

:::getgw  

::set origw=  

::for /f "delims=: tokens=2" %%i in ('"ipconfig | find /i "default gateway"| findstr  [0-9]."') do set origw=%%i  

::獲取預設閘道器的mac位址  

:getmac  

set mac=  

for /f "skip=3 tokens=2" %%i in ('arp -a %origw%') do set mac=%%i  

echo %mac%|findstr \-  

::這裡有個問題,實際上ping失敗(比如閘道器禁止ping)也無所謂,我們需要的只是它的mac位址  

::如果連mac位址都不讓解析,那就別當預設閘道器了。因此正確的做法應該搞乙個計數器,連續  

::兩次獲取mac失敗就算失敗。  

if errorlevel 1 (  

ping %origw% -n 1  

if errorlevel 1 goto end  

goto getmac  

)    

set gw=  

set i=  

::生成假閘道器位址(很簡單的乙個演算法,欲使用的源ip位址減去1)  

for /f "delims=. tokens=4" %%i in ('echo %source%') do set /a host=%%i-1  

set i=  

set j=  

set k=  

for /f "delims=. tokens=1,2,3" %%i in ('echo %source%') do set gw=%%i.%%j.%%k.%host%  

::設定假閘道器的arp對映  

arp -s %gw% %mac%  

::新增路由  

route add %destination% mask %mask% %gw%  

:end  

將上述指令碼儲存為"route2.bat"就可以直接用了。

其實,選擇和預設閘道器不屬於同一網段的ip作為源ip位址對於主機而言並非乙個常規的做法,如果如此一來,在資料報返回的時候,當初選擇的源ip位址作為目標位址,本網段的預設閘道器在路由的時候會出現問題,除非它將下一跳指向該ip位址所在的主機的相同網段的位址,否則資料報可能會因為目標位址不可達而被丟棄。

另外,上述的指令碼在靜態建立arp對映的時候有乙個問題,那就是沒有和windows的「死閘道器檢測」功能關聯,這樣就可以在閘道器失效後被notofy了,或者說閘道器並沒有失效,只是換了臺機器,換了mac,此時就需要更新那個mac映**。

Windows配置路由時可以指定源位址啦

ip route add 1.2.3.4 32 via 4.3.2.1 src 3.3.3.3 但是在windows上,一切都是內部邏輯自動選擇的,其原則如下 單網絡卡時,選擇和預設閘道器在同一網段的最匹配ip位址為源 多網絡卡時,首先選擇預設閘道器所在的網絡卡作為傳送網絡卡,然而在該網絡卡上按照單...

git 新增源位址和檢視源位址

git remote set url add origin就是往當前git專案的config檔案裡增加一行記錄 config檔案開啟方式有兩種 使用命令git config e在當前git專案的根目錄下,檔案位於 git config git目錄為隱藏檔案 你每執行一次git remote set ...

配置 Docker 映象加速源位址

docker 安裝官方文件 根據例項的作業系統型別,參考相應的文件進行安裝。檢視 linux 是 centos 還是 ubuntu uname a 檢視系統資訊 lsb release a 命令存在表示為ubuntu系統 cat etc redhat release 檔案存在為centos作業系統 ...