Windows配置路由时可以指定源地址

如果你的一块网卡上配置了多个IP地址,那么在数据包发出时会使用哪一个呢?在Linux上,使用iproute2工具可以设置src参数强制封装源地址:

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的时候。那么怎么办呢?在《彻底征服Windows上OpenVPN客户端的源地址选择问题》http://blog.csdn.net/dog250/article/details/9823205中,我已经通过网桥接口的方式解决了这个问题,在不涉及双网卡或者多网卡的情形下,我的意思是在单网卡时(更加符合常见情况),任意选择源IP地址将是一个更加通用的问题了。可是怎么办到呢?其实也不难。

首先我们看下所谓的默认网关的本质意义是什么。默认网关其实是一个更加特殊的“下一跳”,它其实就是一个下一跳地址,这个地址的目的在于将数据包扔给下一跳(废话),其实它只是一个辅助作用,真正起作用的是由它解析到的MAC地址,因为MAC地址才会真正封装在以太帧当中,那个默认网关只是用来得到这个MAC地址的,因此如果能静态指定一个MAC地址,那么这个默认网关可以是任意的。于是就有了一个办法:

1.为一条路由生成一个和欲选择的源IP地址在同一个网段的假的默认网关,即假的下一跳;

2.为该假网关IP地址建立一条静态的到真网关的MAC地址的arp映射;

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Network/lyjs/

如此一来,源IP地址的选择过程将完全符合Windows的选择逻辑,我们也就从内核外部绕开了它的限制,从而可以选择任意的本地连接上配置的地址作为源IP地址。

为了将手工配置的过程实现成一个自动的过程,编程是必不可少的,然而我又不想去调用那复杂的API(为了实现一个很简单的功能不得不做超级多的准备工作...),只能寄希望于脚本了,然而Windows命令行功能实在太弱,很为难。问同事,百度,google,一遍遍地尝试,折腾了太久,终于写出一个批处理脚本,发现Windows XP的脚本功能还是很强大的,更不必说Power Shell了。脚本如下(没有echo off):

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映射了。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索openvpn
, 网卡
, 地址
, 选择
, 网关
, 一个
, 默认脚本映射
, 网段
, java获取多网卡ip
地址选择
配置路由指定接口地址、windows路由表配置、windows静态路由配置、windows 路由配置、路由器设置指定ip上网,以便于您获取更多的相关知识。

时间: 2024-09-25 18:16:53

Windows配置路由时可以指定源地址的相关文章

WINDOWS实现路由之配置接口筛选器 图解

上一篇:路由接口和筛选器路由配置接口筛选器的步骤 如下:(1)展开"路由和远程访问",展开服务器,展开"IP路由选择",展开"常规",选中要添加筛选器的接口,单击鼠标右键,选择"属性".如图5-14所示.498)this.w idth=498;' onmousewheel = 'javascript:return big(this)' height=450 alt="WINDOWS实现路由之配置接口筛选器 图解&qu

WINDOWS实现路由之配置静态路由 图解

上一篇:启用路由功能查看静态路由表正如我们 前面提到的,在一个小型网络中,管理员通过 手动添加.修改和删除来更新路由表中的条目,如网络中添加了一个路由器,管理员需手工添加该路由器的条目到路由表中.选择"开始->"程序"->"管理工具"->"路由和远程访问",展开服务器,展开"IP路由选择",选中"静态路由表",单击鼠标右键,选择"显示IP路由选择表".如图5-

WINDOWS实现路由之动态路由协议

上一篇:静态路由器动态 路由协议的特点(1)动态路由协议可自动的更新它的路由表并把更 新的消息发给它知道的其他动态路由协议.(2)目的是 网络管理员的管理工作.(3)必须有一个路由协议 例如RIP或OSPF.RIP路由信息选择协议RIP是距离矢量路由协议,通过判断数据包 经过的跳数(路由器)来决定跨越最小的路由.RIP设计用于小型到重型网际网络中交换路由选择信息.RIP的配置和部署相当简单.RIP的缺点是不能将网络扩大到大或特大型网络.RIP路由器使用的最大跃点计数是15跳,16个跃点或更大的网

Windows 7登陆时创建TEMP临时个人配置文件夹

如果Windows 7登录时在C:\user目录下创建一个名为TEMP的临时个人配置文件夹, 这是因为账号和原来的个人配置文件的关联配破坏,系统会自动将注册表中原来的键值备份(在原来的后面加.bak),然后新建一个注册表键值,并将个人配置文件指定为C:\user\TEMP 如果出现这种情况,请将按照以下步骤操作 1. 以其它账号登陆系统 2. 备份出问题的个人配置文件夹到一个适当的位置,然后删除该个人配置问价夹 3. 打开注册表管理器,到\HKEY_LOCAL_MACHINE\SOFTWARE\

Windows 8联网时出现“未识别网络”问题

  故障现象: Windows 8联网时出现"未识别网络"的情况. 原因分析: 一.拨号上网 直接拨号上网出现此故障,为机器无法获得IP地址(宽带连接是使用PPPOE协议的连接外网,本地连接使用的是TCP/IP协议.拨号时本地连接的物理连接正确,可是有可能没有获取到上层设备分配的局域网IP.则提示无法上网)网卡有问题.系统有问题.驱动有问题.猫有问题等. 二.连接路由器上网 连接路由器上网出现此提示,证明机器已经获得IP地址(内网已经连接正常,但是无法访问外网),系统有故障,路由器有故

虚拟机-查询路由时显示网关地址为0.0.0.0,是什么意思呢?

问题描述 查询路由时显示网关地址为0.0.0.0,是什么意思呢? 查询路由时显示网关地址为0.0.0.0,是什么意思呢? 这个是在虚拟机上查到的,谢谢大家解答. 解决方案 之前我也在windows安装了苹果虚拟机,共享的是主机net,在终端查询也是这样,同求解啊.... 解决方案二: 注意,你的子网掩码是255.255.255.0,而左边前三个的都是192.168.1.0,它不是一个有效的主机IP(你的网段的第一个有效主机IP是192.168.1.1),而是一个子网段地址,因此它们的网关是0.0

《Adobe Audition CS6中文版经典教程》——1.3 Windows配置

1.3 Windows配置 与较新的Macs不同,Windows系统通常有几种驱动程序:为保持向后兼容而遗留下来的驱动程序(主要是MME和DirectSound),以及高性能的驱动程序(WDM/KS,这不同于另一类称作WDM的驱动程序).然而,对于Windows音乐应用程序,最流行的高性能音频驱动程序是ASIO(Advanced Stream Input/Output,高级流输入/输出),它由软件开发商Steinberg创建.实际上,所有专业音频接口设备都包含ASIO驱动程序,很多包含WDM/K

WINDOWS实现路由之静态路由器

上一篇:路由的 基本概念静态路由器:必须手工配置路由表,并且不与动态路由器交换信息.查看路由表每个运行的TCP/IP协议的主机都保留着路由表来控制如何与其他网络段主机进行通信.选择"开始"->"运行",输入"cmd",输入"route print",将显示路由表中的内容.如图所示.498)this.w idth=498;' onmousewheel = 'javascript:return big(this)' heig

导入文本文件时如何指定字段类型?(二)

导入文本文件时如何指定字段类型?   问题: 我有一个文本文件需要导入 Access ,但是文本文件中有一列数据原本是文本,但是导入数据库后自动变成了"双精度"类型,我该如何让各个字段按我需要的数据类型生成哪?如何让 ACCESS 按照我规定的构架.规格从文本文件.XLS文档中导入数据?  方法二: 用 Schema.ini 文件也可以达到要求. 作用:Schema.ini用于提供文本文件中记录的构架信息.每个 Schema.ini 项都用于指定表的五个特征之一:1.文本文件名2.文件