前一段时间在看有关双网卡的资料,一直想整理一下,但是老是忘了,趁着现在还记得一点点,写下来,以便以后参考,或者给其他朋友一点帮助。
说明:要求通过双网卡访问同一个IP如,www.163.com,或192.168.2.100
分析:通常要求都是通过不同的网卡访问不同网段,如一个网卡访问内网,一个网卡访问外网,这种方式可以通过路由策略(策略路由?)实现,即通过设置不同网段的IP走不同的路由。但这里不行,因为在程序中,我们只能绑定源IP,不能绑定路由,而操作系统在选择让数据通过哪个网卡时,是根据路由表。(注意,绑定源IP,并不能绑定网卡,两者是有区别的)
是不是就没有办法了呢?非也
在windows XP我没有找到对应的办法,但在linux中却有。在linux有个叫iptable的东西,防火墙,可以通过它来实现我们的目标。网上有一篇很经典的关于iptable的介绍的文章,以下几个关键字可以帮你找到他: iptable 1.1.9 指南。当然现在的版本不止1.19,但都是相通的。既然iptable是一个防火墙,通过它可以控制数据的流向。刚才讲过,linux系统在选择数据通过那个网卡时是根据目标地址及路由表。在这里目标地址固定,只能想办法改变网卡对应的路由表。在linux允许存在多个路由表,可以用以下指令实现:
ip route add 127.0.0.0/8 dev lo table 2
ip route add $ALLIP1/$NUM1 dev $ETH0 table 2
ip route add $ALLIP2/$NUM2 dev $ETH1 table 2
ip route add 0.0.0.0/0 via $GW1 dev $ETH0 table 2
这样的话,我们可以为网卡1设置一个路由表,网卡2设置另一个路由表,想让数据默认从网卡1走时,使用路由表1,想让数据默认从网卡2时,使用路由表2,这就解决了问题。做一个更严格的限定,就是当源IP为1时,使用路由表1,当源IP为2时,使用路由表2。接下来就是如何让系统使用我们自己定义的路由表了。这时就要通过iptable了。
# 给来自不同子网计算机的 IP 数据报打上不同的标记
iptables -t mangle -A OUTPUT-s $IP1 -j MARK --set-mark 2
通过iptable,我们可以根据一定的规则来给数据包打上不同的标志。上面指令的大概意思是增加一条规则,该规则在OUTPUT阶段起作用,匹配规则的数据包是源IP为$IP1,当匹配该规则的数据包来时,就跳到MARK阶段,设置标志为2。-t 表示类型(type), -A 表示添加(add, OUTPUT是mangle的一个阶段,-s 表示源(source),-j表示跳转到 ,--set-mark 设置标志
然后通过
ip rule add fwmark 2 table 2
让带不同标记的 IP 数据报应用不同的路由表。到这里就大功告成了。
当然了匹配规则不止可以是源IP也可以是其他的,具体的看iptable的手册。
具体的脚本如下:
####################################################
#!/bin/sh
IP1=192.168.2.192
GW1=192.168.2.1
NETMASK1=255.255.255.0
ALLIP1=192.168.2.0
NUM1=24
ETH0=eth0
IP2=192.168.4.153
GW2=192.168.4.1
NETMASK2=255.255.255.0
ALLIP2=192.168.4.0
NUM2=24
ETH1=eth1
# =第 1部分
# 针对“默认通过 ip1 访问”策略的路由表,路由表编号为 2
ip route add 127.0.0.0/8 dev lo table 2
ip route add $ALLIP1/$NUM1 dev $ETH0 table 2
ip route add $ALLIP2/$NUM2 dev $ETH1 table 2
ip route add 0.0.0.0/0 via $GW1 dev $ETH0 table 2
# =第 2 部分======================
# 针对“主要通过 ip2 访问”策略的路由表,路由表编号为 3
ip route add 127.0.0.0/8 dev lo table 3
ip route add $ALLIP2/$NUM2 dev $ETH1 table 3
ip route add $ALLIP1/$NUM1 dev $ETH0 table 3
ip route add 0.0.0.0/0 via $GW2 dev $ETH1 table 3
ip route flush cache
# =第 3 部分=====================
# 给来自不同IP 的数据报打上不同的标记
iptables -t mangle -A OUTPUT -s $IP1 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -s $IP2 -j MARK --set-mark 3
# =第 4 部分=======================
# 让带不同标记的 IP 数据报应用不同的路由表
ip rule add fwmark 1 table 1
ip rule add fwmark 2 table 2
ip rule add fwmark 3 table 3
####################################################
以上的方法简单的说就是,设置两张路由表,通过内核的处理使IP1使用路由表1,IP2使用路由表2。
顺带说一下,在vista中,绑定源IP就可以绑定网卡。因为vista用了TCP/IP 另外一种实现方式。