Linux下静态路由问题
win847
Linux下静态路由问题
这段时间在研究Linux平台下静态路由添加的问题,目前在我们平台上添加静态路由是通过route add命令来实现的,在使用route add时发现了一些问题,请大家帮忙一起看一下
环境如下:
假设PC1有一张网卡,IP为192.168.1.100,mask为255.255.255.0,gateway为192.168.1.1,dev为eth0
如果没有设定静态路由的话,对google(IP为203.208.39.104)做ping测试发现正常
使用route add -net 203.208.39.104 netmask 255.255.255.255 dev eth0,增加一条静态路由
发现不能ping通203.208.39.104
删除该路由,使用route add -net 203.208.39.104 netmask 255.255.255.255 gw 192.168.1.1,增加一条静态路由
发现可以ping 通203.208.39.104
这里的问题是为什么设定dev类型的路由不能通?
下面做了两个实验
1.使用ethereal抓包工具发现,当使用route add -net 203.208.39.104 netmask 255.255.255.255 dev eth0增加一条静态路由时,Ping 203.208.39.104这个地址会发送广播包(arp)来询问
203.208.39.104地址的MAC地址,这个时候当然不会有响应。
2.使用route add -net 203.208.39.104 netmask 255.255.255.255 gw 192.168.1.1增加一条静态路由时,Ping 203.208.39.104这个地址直接将这个Ping包发送给网关192.168.1.1,这个时候网关就会
送出去然后会收到正常的回复
从上面的试验的结果可以看出,当使用dev来设定路由时,Linux的路由表中关于这条路由并没有gateway的值,这个时候会把丢到这个dev的报文当作局域网的报文来处理。使用gw来设定时,Linux路由表
中关于这条路由有gateway的值,这个时候IP层会根据Dest IP和gw所在的dev的接口进行判断。如果是同网段内就会发ARP包,然后根据回复丢出去,如果不在同一网段内就会直接将报文转给Gateway进行
处理
这里带来的问题是:如果需要增加的静态路由的Dest IP网段和dev不在同一网段就必须使用gw的方式增加路由,请问使用dev方式来增加静态路由主要用于那些场合?
谢谢!
baidu874
网络设备在传输数据的时候,首先会判断目标地址是否和自己在同一网段,如果在同一网段,那么就会通过ARP广播来查找目标IP对应的MAC地址,然后将数据包送往目标地址
如果是不同网段,那么设备就会查询自己的路由表,找到相应的路由,然后按照路由的设置将数据包送往下一跳。
从你的例子来说,你要访问google(IP为203.208.39.104),很显然和本机不在同一网段,那么就要查找路由表,在你不增加任何路由的情况下,因为你设置了网关,那么就有一条类似
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
的默认路由(缺省路由)
这条路由的意思就是说,去所有的地方,下一跳都是192.168.1.1 那么很显然就能够通了。
而你增加了一条静态路由的时候,可能产生的是如下类型的路由
203.208.39.104 0.0.0.0 255.255.255.255 U 1 0 0 eth0
那你的意思就是说这台主机是连接在eth0这个接口上的,因为你没有指明下一跳,你的设备就不知道把数据该怎么转发出去。所以肯定就不通了。
在linux上,基本上很少会直接添加直连路由,因为你给接口配置IP地址的时候,直连路由都会自动生成,所以基本上没有机会让你添加这种路由。
win847
目前我们的应用是在一台ADSL Router上面,ADSL Route有8条PVC,但是只能有一条PVC可以设定为default route,这个时候gateway就是default route的PVC。但是如果其他PVC也可以获取IP的话,如果设定一条静态路由,dev选择其他的PVC就会出现我描述的现象。使用其他PVC的Gateway则能正常转发,所以我才想了解使用dev设定静态路由问题
但是有ISP期望是说设定以dev的静态路由后,Dest IP能够转给这个dev的gateway进行转发,请问这个要求对于基于dev的路由选路是否合理?还是这个需求是需要特别定制的?
另外关于ISP设定基于dev静态路由的另外一个原因是,当前这条PVC的gateway可能会发生变化,所以设定基于gw的静态路由可能会发生失效,ISP期望基于dev的静态路由能够每次获取IP时自动判断当前的gateway,使用当前的gateway来设定静态路由
baidu874
很遗憾我查了一下PVC参数的意思,但是还没有太理解。你的这个应用是在ISP吗?一条PVC上可以承载多个PPP连接?
还是简单说,你其实就是用了一台路由器,上面接了8条ADSL线路?
如果是第二种情况,那也谈不上设置路由的问题,因为ADSL使用的是PPPoE协议,这个协议根本就没有网关概念,一旦建立了PPP连接,所有的数据都会送往AC。
请问您能把问题再给我解释清楚一点吗?
lijizheng
[quote]原帖由 [i]win847[/i] 于 2010-1-13 20:29 发表 [url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=7198759&ptid=1153597][img]http://linux.chinaunix.net/bbs/images/common/back.gif[/img][/url]
请问使用dev方式来增加静态路由主要用于那些场合?[quote]
主要用在主机有多个同网段IP网卡场合。例如,做双机时,一般主机实IP和浮动IP为同网段地址。如果不指定源接口(dev),那发出去包的源地址就会是实IP、而非对外合法的浮动IP。这就有可能被防火墙所拦截、到达不了目标网段或主机。所以要这样设置:
route del default
route add default gw ${GATEWAY} dev eth0:0
即指定源接口。这里,eth0为原来的实接口,eth0:0为绑定浮动IP的的虚接口。
为了省事,我也曾用一条命令来设置过:
route add default dev eth0:0
即保留原来的缺省网关设置,只加一条指定源接口的路由。但这在网关为三层交换机时可以,网关为防火墙DMZ口时就不行了。只能用前一种写法。原因尚未深究。
emmoblin
pppoe拨号,就看成是一条网线就行了。
win847
[quote]原帖由 [i]baidu874[/i] 于 2010-1-14 10:00 发表 [url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=7198958&ptid=1153597][img]http://linux.chinaunix.net/bbs/images/common/back.gif[/img][/url]
很遗憾我查了一下PVC参数的意思,但是还没有太理解。你的这个应用是在ISP吗?一条PVC上可以承载多个PPP连接?
还是简单说,你其实就是用了一台路由器,上面接了8条ADSL线路?
如果是第二种情况,那也谈不上 ... [/quote]
我们是ADSL Modem。 PVC就是虚电路的意思,你可以理解为有8条实际的物理通路。现在每条PVC上只会承载一个PPP的连接,但是8条PVC都可以建立PPP或者Mpoa的连接。
最简单的解释就是把Modem看作一台PC,每条PVC可以看作一张物理网卡,这台PC上有8张网卡可以出去这样子
baidu874
[quote]原帖由 [i]win847[/i] 于 2010-1-14 16:16 发表 [url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=7199250&ptid=1153597][img]http://linux.chinaunix.net/bbs/images/common/back.gif[/img][/url]
我们是ADSL Modem。 PVC就是虚电路的意思,你可以理解为有8条实际的物理通路。现在每条PVC上只会承载一个PPP的连接,但是8条PVC都可以建立PPP或者Mpoa的连接。
最简单的解释就是把Modem看作一台PC,每条 ... [/quote]
问题就在这里,你的8条PVC都可以建立PPP连接
可是PPP连接的特点就是一旦链路建立,那么所有的数据都会由本端发往对端。也就是说,默认情况下,你只可能走一条PVC,并且你不能给PPP链路增加一个静态路由(恩,这个我印象是这样的,不能确认)。
win847
[quote]原帖由 [i]baidu874[/i] 于 2010-1-14 16:21 发表 [url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=7199253&ptid=1153597][img]http://linux.chinaunix.net/bbs/images/common/back.gif[/img][/url]
问题就在这里,你的8条PVC都可以建立PPP连接
可是PPP连接的特点就是一旦链路建立,那么所有的数据都会由本端发往对端。也就是说,默认情况下,你只可能走一条PVC,并且你不能给PPP链路增加一个静态路由(恩 ... [/quote]
但是某些应用会指定走第几条PVC出去,比如Internet访问走PVC0,IPTV点播走PVC1。
这样的话可以设定default route为PVC0,但是IPTV就需要指定静态路由使其可以从PVC1出去
baidu874
那也不能通过静态路由来实现。
缺省路由只能有一条,这是毫无疑问的。
不过对于你的应用,可以用策略路由来实现。
我举个简单的例子给你:假设只有两条线路
你用线路1(eth1)当作主路由的默认路由,然后用线路2(eth2)来做策略路由,要求内部所有的http数据走线路2,其余的数据走线路1,那么可以用下面这种方法:
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 100
ip route add 0/0 via 172.16.1.254 table 100 #这里假设是有网关的那种,不过在你的网络中,应该就是一个dev的路由,这句话的意思是增加一个路由表叫100,其中有一条默认路由
ip rule add fwmark 100 table 100 #增加一条ip策略,所有打标100的数据,都通过路由表100转发
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
当然,这只是一个基本的例子,因为http应用相对简单,完全可以用端口来识别,但是如果你们的应用比较特殊,那可能你还得增加iptables的layer7识别功能,然后按照需求对需要做特殊处理的数据进行打标,再利用ip route2的功能,将数据通过不同的PVC接口送出。
win847
[quote]原帖由 [i]baidu874[/i] 于 2010-1-15 10:10 发表 [url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=7199647&ptid=1153597][img]http://linux.chinaunix.net/bbs/images/common/back.gif[/img][/url]
那也不能通过静态路由来实现。
缺省路由只能有一条,这是毫无疑问的。
不过对于你的应用,可以用策略路由来实现。
我举个简单的例子给你:假设只有两条线路
你用线路1(eth1)当作主路由的默认路由,然后 ... [/quote]
谢谢你的回答,目前关注的是静态路由基于DEV添加时不会带上gateway是否合理的问题,在CSDN上有人介绍说基于DEV的路由设定一般比较少,特殊的情况如下:
如果你在同一个局域网内部署了两个网段的,比如:192.168.1.0/24,和203.208.39.0/24, 如果有一台机器192.168.1.2想发数据给203.208.39.2, 这里就需要你添加一条静态路由:
route add -net 203.208.39.0 netmask 255.255.255.0 dev eth0
那么此时直接ARP就可以得到203.208.39.2的MAC地址,从而直接就可以进行通信了.
而如果你这样添加的话:
route add -net 203.208.39.0 netmask 255.255.255.0 gw 192.168.1.1
那么你的发给203.209.39.2的时个就不会直接ARP然后用MAC交互,而是ARP取得192.168.1.1的MAC,从而把数据交给了gw. gw再跟据自己的路由器决定把这个数据包发给下一站, 此时这个报文能否发给你本地的203.209.39.2就又跟gw的路由表设置有关了. 如果gw上没有一条类似route add -net 203.208.39.0 netmask 255.255.255.0 dev eth0的路由, 那这个报文就基本不可能发到你本地的那台IP为203.209.39.2的机器上了.
所以我的主要目的是要了解基于DEV配置静态路由的应用多不多,一般是什么?
还有的培训资料上将只有下一跳所属的接口是点对点的,比如PPP,HDLC等接口,才可以填Interface(DEV),否则必须填写下一跳的地址(gateway),请问这种说法对不对?
route add -net [Dest IP] netmask [mask] DEV nas2
这种路由添加会不会存在问题?(nas2为ADSL Modem的一个WAN端口)
baidu874
你还是没有弄明白,我前面已经说了,PPP协议就是点对点的协议,一旦连接建立,所有的数据都会发往对端,而实际上如果你用ifconfig看地址信息的时候,你可以看到PPP接口的子网掩码是255.255.255.255,路由表中你也看不到有网关的默认路由,但是你应该可以看到一条0.0.0.0的缺省路由,而对应的接口,就是你的ppp接口。
你所说的dev路由,实际就是接口直连路由。
你举的那个局域网通讯的例子,实际上手工添加路由,并不能解决两台主机通讯,能不能通讯,还得看192.168.1.X网段和203.209.39.X网段的网关都指向谁。
最简单的解决这种网络通讯问题的方法,是在你的linux上增加一个子接口:
ifconfig eth0:1 203.209.39.1 netmask 255.255.255.0
然后你的所有客户主机网关(192段指向物理网卡的192段的ip,203段指向子接口203的ip)指向这台linux,那么两个网段就能够正常通讯了。
所以你说的需要配置DEV的静态路由的应用多不多,基本上不会碰到。