配置路由時(shí)如何指定源地址
配置路由時(shí)如何指定源地址
歡迎大家來(lái)到學(xué)習(xí)啦,本文為大家介紹配置路由時(shí)如何指定源地址,歡迎大家閱讀,希望能幫到你。
如果你的一塊網(wǎng)卡上配置了多個(gè)IP地址,那么在數(shù)據(jù)包發(fā)出時(shí)會(huì)使用哪一個(gè)呢?在Linux上,使用iproute2工具可以設(shè)置src參數(shù)強(qiáng)制封裝源地址:
ip route add 1.2.3.4/32 via 4.3.2.1 src 3.3.3.3
但是在Windows上,一切都是內(nèi)部邏輯自動(dòng)選擇的,其原則如下:
單網(wǎng)卡時(shí),選擇和默認(rèn)網(wǎng)關(guān)在同一網(wǎng)段的最匹配IP地址為源;
多網(wǎng)卡時(shí),首先選擇默認(rèn)網(wǎng)關(guān)所在的網(wǎng)卡作為發(fā)送網(wǎng)卡,然而在該網(wǎng)卡上按照單網(wǎng)卡原則選擇一個(gè)IP地址作為源。
因此,如果你的目標(biāo)地址是1.2.3.4,默認(rèn)網(wǎng)關(guān)是4.3.2.1,本地連接上兩個(gè)IP地址:4.3.2.2和3.3.3.3,很顯然,4.3.2.2會(huì)作為源IP地址被選擇,這樣在發(fā)包的時(shí)候,4.3.2.2將作為數(shù)據(jù)包的源IP地址。
然而有時(shí)候?yàn)榱藢?shí)現(xiàn)自己的一些策略或者小技巧,并不希望系統(tǒng)為我如此自動(dòng)地封裝源IP地址,比如顯而易見(jiàn)地是在使用Open的時(shí)候。
首先我們看下所謂的默認(rèn)網(wǎng)關(guān)的本質(zhì)意義是什么。默認(rèn)網(wǎng)關(guān)其實(shí)是一個(gè)更加特殊的“下一跳”,它其實(shí)就是一個(gè)下一跳地址,這個(gè)地址的目的在于將數(shù)據(jù)包扔給下一跳(廢話),其實(shí)它只是一個(gè)輔助作用,真正起作用的是由它解析到的MAC地址,因?yàn)镸AC地址才會(huì)真正封裝在以太幀當(dāng)中,那個(gè)默認(rèn)網(wǎng)關(guān)只是用來(lái)得到這個(gè) MAC地址的,因此如果能靜態(tài)指定一個(gè)MAC地址,那么這個(gè)默認(rèn)網(wǎng)關(guān)可以是任意的。于是就有了一個(gè)辦法:
1.為一條路由生成一個(gè)和欲選擇的源IP地址在同一個(gè)網(wǎng)段的假的默認(rèn)網(wǎng)關(guān),即假的下一跳;
2.為該假網(wǎng)關(guān)IP地址建立一條靜態(tài)的到真網(wǎng)關(guān)的MAC地址的arp映射;
如此一來(lái),源IP地址的選擇過(guò)程將完全符合Windows的選擇邏輯,我們也就從內(nèi)核外部繞開(kāi)了它的限制,從而可以選擇任意的本地連接上配置的地址作為源IP地址。
為了將手工配置的過(guò)程實(shí)現(xiàn)成一個(gè)自動(dòng)的過(guò)程,編程是必不可少的,然而我又不想去調(diào)用那復(fù)雜的API(為了實(shí)現(xiàn)一個(gè)很簡(jiǎn)單的功能不得不做超級(jí)多的準(zhǔn)備工作...),只能寄希望于腳本了,然而Windows命令行功能實(shí)在太弱,很為難。問(wèn)同事,百度,google,一遍遍地嘗試,折騰了太久,終于寫(xiě)出一個(gè)批處理腳本,發(fā)現(xiàn)Windows XP的腳本功能還是很強(qiáng)大的,更不必說(shuō)Power Shell了。腳本如下(沒(méi)有echo off):
[plain]
set destination=%1
set mask=%2
set origw=%3
set source=%4
::獲取默認(rèn)網(wǎng)關(guān)(可以自動(dòng)發(fā)現(xiàn)默認(rèn)網(wǎng)關(guān),太花哨,不提倡)
:::GetGW
::set origw=
::for /f "delims=: tokens=2" %%i in ('"ipconfig | find /i "default gateway"| findstr [0-9]."') do set origw=%%i
::獲取默認(rèn)網(wǎng)關(guān)的MAC地址
:GetMac
set mac=
for /f "skip=3 tokens=2" %%i in ('arp -a %origw%') do set mac=%%i
echo %mac%|findstr \-
::這里有個(gè)問(wèn)題,實(shí)際上ping失敗(比如網(wǎng)關(guān)禁止ping)也無(wú)所謂,我們需要的只是它的MAC地址
::如果連MAC地址都不讓解析,那就別當(dāng)默認(rèn)網(wǎng)關(guān)了。因此正確的做法應(yīng)該搞一個(gè)計(jì)數(shù)器,連續(xù)
::兩次獲取MAC失敗就算失敗。
if ERRORLEVEL 1 (
ping %origw% -n 1
if ERRORLEVEL 1 goto end
goto GetMac
)
set gw=
set i=
::生成假網(wǎng)關(guān)地址(很簡(jiǎn)單的一個(gè)算法,欲使用的源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%
::設(shè)置假網(wǎng)關(guān)的arp映射
arp -s %gw% %mac%
::添加路由
route add %destination% mask %mask% %gw%
:end
將上述腳本保存為"route2.bat"就可以直接用了。
其實(shí),選擇和默認(rèn)網(wǎng)關(guān)不屬于同一網(wǎng)段的IP作為源IP地址對(duì)于主機(jī)而言并非一個(gè)常規(guī)的做法,如果如此一來(lái),在數(shù)據(jù)包返回的時(shí)候,當(dāng)初選擇的源IP地址作為目標(biāo)地址,本網(wǎng)段的默認(rèn)網(wǎng)關(guān)在路由的時(shí)候會(huì)出現(xiàn)問(wèn)題,除非它將下一跳指向該IP地址所在的主機(jī)的相同網(wǎng)段的地址,否則數(shù)據(jù)包可能會(huì)因?yàn)槟繕?biāo)地址不可達(dá)而被丟棄。
另外,上述的腳本在靜態(tài)建立arp映射的時(shí)候有一個(gè)問(wèn)題,那就是沒(méi)有和Windows的“死網(wǎng)關(guān)檢測(cè)”功能關(guān)聯(lián),這樣就可以在網(wǎng)關(guān)失效后被Notofy了,或者說(shuō)網(wǎng)關(guān)并沒(méi)有失效,只是換了臺(tái)機(jī)器,換了MAC,此時(shí)就需要更新那個(gè)MAC映射了。