绑定网卡

 

  前一段时间在看有关双网卡的资料,一直想整理一下,但是老是忘了,趁着现在还记得一点点,写下来,以便以后参考,或者给其他朋友一点帮助。

       说明:要求通过双网卡访问同一个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 另外一种实现方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值