本文為大家介紹配置路由時(shí)指定源地址的命令(路由 源地址 目的地址),下面和小編一起看看詳細(xì)內(nèi)容吧。
配置路由時(shí)指定源地址
如果你在一塊網(wǎng)卡上配置了多個(gè)ip地址,數(shù)據(jù)包發(fā)出時(shí)會(huì)使用哪個(gè)?在linux上,使用iproute2工具設(shè)置src參數(shù),強(qiáng)制封裝源地址:
ip 路由添加1.2.3.4/32 通過4.3.2.1 src 3.3.3.3
但在windows 上,一切都是由內(nèi)部邏輯自動(dòng)選擇的,其原理如下:
對(duì)于單個(gè)網(wǎng)卡,選擇與默認(rèn)網(wǎng)關(guān)在同一網(wǎng)段內(nèi)最匹配的ip地址作為源;
當(dāng)有多個(gè)網(wǎng)卡時(shí),首先選擇默認(rèn)網(wǎng)關(guān)所在的網(wǎng)卡作為發(fā)送網(wǎng)卡,然后根據(jù)單網(wǎng)卡原則在該網(wǎng)卡上選擇一個(gè)ip地址作為源。
所以,如果你的目的地址是1.2.3.4,默認(rèn)網(wǎng)關(guān)是4.3.2.1,本地連接上有兩個(gè)ip地址:4.3.2.2和3.3.3.3,顯然會(huì)選擇4.3.2.2作為源ip地址,所以在發(fā)送數(shù)據(jù)包時(shí),4.3.2.2將作為數(shù)據(jù)包的源ip地址。
但是,有時(shí)候?yàn)榱藢?shí)現(xiàn)自己的一些策略或者技巧,不想讓系統(tǒng)自動(dòng)為我封裝源ip地址,比如在使用openvpn的時(shí)候就很明顯了。
首先我們來(lái)看一下所謂默認(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地址實(shí)際上是封裝在以太網(wǎng)幀中的,而默認(rèn)網(wǎng)關(guān)只是用來(lái)獲取mac地址的,所以如果可以靜態(tài)指定一個(gè)mac地址,那么默認(rèn)網(wǎng)關(guān)就可以任何。所以有一個(gè)方法:
1、生成一個(gè)與路由選擇的源ip地址在同一網(wǎng)段的假默認(rèn)網(wǎng)關(guān),即假下一跳;
2. 為假網(wǎng)關(guān)ip地址建立到真實(shí)網(wǎng)關(guān)mac地址的靜態(tài)arp映射;
這樣源ip地址的選擇過程就完全符合windows的選擇邏輯,我們從內(nèi)核外部繞過它的限制,這樣本地連接上配置的任何地址都可以被選為源ip地址.
為了實(shí)現(xiàn)手動(dòng)配置的過程變成自動(dòng)過程,編程是必不可少的,但是我不想調(diào)用復(fù)雜的api(為了實(shí)現(xiàn)一個(gè)很簡(jiǎn)單的功能,我不得不做很多準(zhǔn)備工作.),只能寄希望于腳本,但是windows命令行功能太弱了,很尷尬。問了同事,百度,谷歌,反復(fù)嘗試,折騰了太久,終于寫了個(gè)批處理腳本,發(fā)現(xiàn)windows xp的腳本功能還是很強(qiáng)大的,power shell就更不用說(shuō)了。腳本如下(不回顯):
[清楚的]
設(shè)置目的地=%1
設(shè)置掩碼=%2
設(shè)置origw=%3
設(shè)置源=%4
: 獲取默認(rèn)網(wǎng)關(guān)(默認(rèn)網(wǎng)關(guān)可以自動(dòng)發(fā)現(xià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地址
: 獲取mac
設(shè)置mac=
for /f 'skip=3 tokens=2' %%i in ('arp -a %origw%') do set mac=%%i
回聲%mac%|findstr /-
: 這里有問題。其實(shí)ping不通也沒關(guān)系(比如網(wǎng)關(guān)禁止ping)。我們只需要它的mac 地址。
: 如果連mac地址都不允許解析,那就不要做默認(rèn)網(wǎng)關(guān)。所以,正確的做法應(yīng)該是搞反擊,連續(xù)
: 兩次獲取mac地址失敗視為失敗。
如果錯(cuò)誤級(jí)別1 (
ping %origw% -n 1
如果errorlevel 1 轉(zhuǎn)到結(jié)束
轉(zhuǎn)到getmac
)
設(shè)置gw=
設(shè)置我=
: 生成一個(gè)假的網(wǎng)關(guān)地址(很簡(jiǎn)單的算法,要使用的源ip地址減1)
for /f 'delims=.tokens=4' %%i in ('echo %source%') do set /a host=%%i-1
設(shè)置我=
設(shè)j=
設(shè)k=
對(duì)于/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%
: 添加路由
路由添加%destination% mask %mask% %gw%
:結(jié)束
將上述腳本保存為'route2.bat',直接使用即可。
事實(shí)上,主機(jī)選擇一個(gè)與默認(rèn)網(wǎng)關(guān)不屬于同一網(wǎng)段的ip作為源ip地址并不是一種常見的做法。一個(gè)網(wǎng)段的默認(rèn)網(wǎng)關(guān)在路由時(shí)會(huì)造成問題,除非它把下一跳指向一個(gè)與ip地址所在主機(jī)在同一網(wǎng)段的地址,否則可能會(huì)因?yàn)槟康牡刂凡豢蛇_(dá)而丟包。
另外,上面的腳本在靜態(tài)建立arp映射的時(shí)候有個(gè)問題,就是沒有關(guān)聯(lián)windows的“dead gateway detection”功能,所以網(wǎng)關(guān)失效后可以notofy,或者網(wǎng)關(guān)沒有failed, just replaced 買機(jī)器換了mac,這時(shí)候需要更新mac映射。
好了,配置路由時(shí)指定源地址的命令(路由 源地址 目的地址)的介紹到這里就結(jié)束了,想知道更多相關(guān)資料可以收藏我們的網(wǎng)站。