双⽹卡在同⼀⽹段的解决办法-iproute2有效如下图:tcpreplay使⽤两个⽹卡采⽤同⼀⽹段ip,系统会默认使⽤eth0⽹卡通信。
为是两个⽹卡⼯作正常,使⽤iproute2改路由表。
在tcpreplay服务器:
ip rule add from 172.25.197.23/32 table 10
ip route add to 172.25.197.183/32 dev eth0 table 10
#ip rule add from 172.25.197.23/32 table 10
ip route add to 172.25.197.184/32 dev eth1 table 20
ip rule add from 172.25.197.70/32 table 20
同时在CG上添加路由:
route add -host 172.25.197.70 gw 172.25.197.184
route add -host 172.25.192.33 gw 172.25.197.184
route add -host 172.25.192.96 gw 172.25.197.184
LG添加路由:
route add -host 172.25.197.23 gw 172.25.197.183
为使tcp发包更快更多ubuntu服务器还要租以下修改:
sysctl -w p_wmem="4096 2000000 4194304"
sysctl -w p_rmem="4096 3000000 6291456"
另外软件需要检查hostname的,需要修改:
/etc/hosts 和/etc/hostname ⽂件。
版权所有,转载必须加上原⽹址。
Tany 2013-07-02
另外附上转载别⼈的:
eth0: ip 192.168.0.1 ; eth1: ip 192.168.0.2 gateway:192.168.0.254
/sbin/route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.0.254 dev eth0
/sbin/route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.0.254 dev eth1
/
sbin/ip route add to 0.0.0.0/0 via 192.168.0.254 dev eth0 table 10
/sbin/ip rule add from 192.168.0.1/32 table 10
/sbin/ip route add to 0.0.0.0/0 via 192.168.0.254 dev eth1 table 20
/sbin/ip rule add from 192.168.0.2/32 table 20
仅供参考!
-------------------------------------------------------------------------------------
介绍 iproute2
3.1 为什么使⽤ iproute2?
现在,绝⼤多数 Linux 发⾏版和绝⼤多数 UNIX都使⽤古⽼的arp, ifconfig和route命令。虽然这些⼯具能够⼯作,但它们在Linux2.2和更⾼版本的内核上显得有⼀些落伍。⽐如,现在GRE隧道已经成为了路由的⼀个主要概念,但却不能通过上述⼯具来配置。
使⽤了iproute2,隧道的配置与其他部分完全集成了。
2.2 和更⾼版本的Linux 内核包含了⼀个经过彻底重新设计的⽹络⼦系统。这些新的代码让Linux 在操作系统的竞争中取得了功能和性能上的优势。实际上,Linux新的路由、过滤和分类代码,从功能和性能上都不弱于现有的那些专业的路由器、防⽕墙和流量整形产品。
随着新的⽹络概念的提出,⼈们在现有操作系统的现有体系上修修补补来实现他们。这种固执的⾏为导致了⽹络代码中充斥着怪异的⾏为,这有点像⼈类的语⾔。过去,Linux模仿了SunOS 的许多处理⽅式,并不理想。
这个新的体系则有可能⽐以往任何⼀个版本的Linux都更善于清晰地进⾏功能表达。
3.2 iproute2 概览
Linux有⼀个成熟的带宽供给系统,称为Traffic Control(流量控制)。这个系统⽀持各种⽅式进⾏分类、排序、共享和限制出⼊流量。
我们将从 iproute2 各种可能性的⼀个简要概览开始。
3.3 先决条件
你应该确认已经安装了⽤户级配置⼯具。这个包的名字在RedHat和Debian中都叫作“iproute”,也可以在这个地⽅到:
ftp://ftp.inr.ac.ru/ip-routing/iproute2-2.2.4-now-ss??????.
你也可以试试在这⾥最新版本。
iproute 的某些部分需要你打开⼀些特定的内核选项。应该指出的是,RedHat6.2及其以前的所有发⾏版中所带的缺省内核都不带有流量控制所需要的绝⼤多数功能。
⽽RedHat 7.2在缺省情况下能满⾜所有要求。
另外,确认⼀下你的内核⽀持netlink ,Iproute2需要它.
3.4 浏览你的当前配置
这听上去确实让⼈惊喜:iproute2已经配置好了!当前的ifconfig和route命令已经正在使⽤新的系统调⽤,但通常使⽤了缺省参数(真⽆聊)。
新的⼯具ip成为中⼼,我们会让它来显⽰我们的⽹卡配置。
3.4.1. 让ip显⽰我们的链路
[ahu@home ahu]$ ip link list
1: lo: mtu 3924 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: dummy: mtu 1500 qdisc noop
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
3: eth0: mtu 1400 qdisc pfifo_fast qlen 100
link/ether 48:54:e8:2a:47:16 brd ff:ff:ff:ff:ff:ff
4: eth1: mtu 1500 qdisc pfifo_fast qlen 100
link/ether 00:e0:4c:39:24:78 brd ff:ff:ff:ff:ff:ff
3764: ppp0: mtu 1492 qdisc pfifo_fast qlen 10
你的结果可能有所区别,但上述显⽰了我家⾥NAT路由器的情况。我将只解释输出中并⾮全部直接相关的部分。因为并不是所有部分都与我们的话题有关,所以我只会解释输出的⼀部分。我们⾸先看到了 loopback 接⼝。 While your computer may function somewhat without one, I'd advise against it. MTU (
最⼤传输单元)尺⼨为 3924 字节,并且不应该参与队列。这是因为loopback 接⼝完全是内核想象出来的、并不存在的接⼝。
现在我们跳过这个⽆关的接⼝,它应该并不实际存在于你的机器上。然后就是两个物理⽹络接⼝,⼀个接在我的 cable modem 上,另⼀个接到我家⾥的以太⽹端上。再下⾯,我们看见了⼀个 ppp0 接⼝。
应该指出,我们没有看到 IP 地址。iproute 切断了“链路”和“IP 地址”两个概念的直接联系。当使⽤ IP 别名的时候,IP地址的概念显得更加不相关了。
尽管如此,还是显⽰出了标识以太⽹卡硬件的 MAC 地址。
3.4.2. 让ip显⽰我们的 IP 地址
[ahu@home ahu]$ ip address show
1: lo: mtu 3924 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
2: dummy: mtu 1500 qdisc noop
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
3: eth0: mtu 1400 qdisc pfifo_fast qlen 100
link/ether 48:54:e8:2a:47:16 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.1/8 brd 10.255.255.255 scope global eth0
4: eth1: mtu 1500 qdisc pfifo_fast qlen 100
link/ether 00:e0:4c:39:24:78 brd ff:ff:ff:ff:ff:ff
3764: ppp0: mtu 1492 qdisc pfifo_fast qlen 10
link/ppp
inet 212.64.94.251 peer 212.64.94.1/32 scope global ppp0
这⾥包含了更多信息。显⽰了我们所有的地址,以及这些地址属于哪些⽹卡。“inet”表⽰Internet (IPv4)。还有很多其它的地址类型,但现在还没有涉及到。
让我们先就近看看eth0。上⾯说它与IP地址10.0.0.1/8相关联。这是什么意思呢?“/8”表⽰IP地址表⽰⽹络地址的位数。因为⼀共是32个 bit,所以我们的这个⽹络有了24 bit的主机空间。
10.0.0.1 的开始8bit是10.0.0.0,也就是我们的⽹络地址,我们的⼦⽹掩码是255.0.0.0。
其它的bit直接连接在这个⽹卡上,所以10.250.3.13可以直接通过eth0联络到,就象10.0.0.1⼀样。
对于ppp0,仍是相同的概念,虽然数字看上去有所不同。它的地址是212.64.94.251,不带⼦⽹掩码。这意味着这是⼀个点到点的连接,⽽且除了 212.64.94.251之外的地址是对端的。当然,还有很多信息。它还告诉我们这个链路的另⼀端只有⼀个地址:212.64.94.1。/32意思是说没有表⽰⽹络的bit。
掌握这些概念是绝对重要的。如果有问题,不妨先参考以下这个HOWTO⽂件开头曾经提到的那些⽂档。
你应该注意到了“qdisc”,它是基于对列规范的⼀个概念。它在后⾯会变得很重要。
3.4.3. 让ip显⽰路由
好的,现在我们已经知道如何到了,然后我们就可以到达212.64.94.1。但这还不够,我们还得说明如何到全世界。可以通过我们的ppp连接到Internet,212.64.94.1愿意把我们的数据包发给全世界,并把回应的数据包传回给我们。
[ahu@home ahu]$ ip route show
212.64.94.1 dev ppp0 proto kernel scope link src 212.64.94.251
10.0.0.0/8 dev eth0 proto kernel scope link src 10.0.0.1
127.0.0.0/8 dev lo scope link
default via 212.64.94.1 dev ppp0
字⾯的意思相当清楚。前4⾏的输出明确地说明了ip address show的意思,最后⼀⾏说明了世界的其它部分可以通过我们的缺省⽹关212.64.94.1到。我们通过“via”这个词断定这是⼀个⽹关,我们要把数据包交给它。这就是我们要留⼼的问题
下⾯列出以前route 命令的输出作为参考:
[ahu@home ahu]$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use
Iface
212.64.94.1 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
10.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 212.64.94.1 0.0.0.0 UG 0 0 0 ppp0
ARP 是由 RFC 826 所描述的“地址解析协议”。ARP是⽹络上的计算机在居域⽹中⽤来解析另⼀台机器的硬件地址/位置的时候使⽤的。互联⽹上的机器⼀般都是通过机器名解析成IP地址来互相到的。这就能够解决foo⽹络能够与bar⽹络通讯。但是,仅仅依靠IP地址,却⽆法得到⼀台计算机在⼀个⽹络中的物理位置。这时候就需要ARP。
让我们举⼀个⾮常简单的例⼦。假定我有⼀个⽹络,⾥⾯有⼏台机器。其中的两台在我的⼦⽹上,⼀台叫foo,IP地址是10.0.0.1,另⼀台叫 bar,IP地址是10.0.0.2。现在,foo想ping⼀下bar 看看是不是正常,但是呢,foo只知道bar的IP地址,却并不知道bar的硬件 (MAC)地址。所以foo 在ping bar之前就会先发出ARP询问。这个ARP询问就像在喊:“Bar(10.0.0.2)!你在哪⾥(你的MAC地址是多少)?!” 结果这个⼴播域中的每台机器都能听到foo的喊话,但是只有
bar(10.0.0.2)会回应。Bar会直接给foo发送⼀个ARP回应,告诉它“Foo (10.0.0.1),我的Mac地址是00:60:94:E9:08:12”。经过这种简单的交谈,机器就能够在局域⽹中定位它要通话的对象。Foo会⼀直使⽤这个结果,直到它的ARP缓冲忘掉这个结果(在Unix系统上通常是15分钟之后)。
现在我们来看⼀看具体的⼯作过程。你可以这样察看你的ARP表(缓冲):
[root@espa041 /home/src/iputils]# ip neigh show
9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachableroute add 添加路由
9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud reachable
你可以看到,我的机器 espa041 (9.3.76.41) 知道如何到 espa042 (9.3.76.42) 和 espagate (9.3.76.1)。现在让我们往缓冲中添加另⼀台机器。
[root@espa041 /home/paulsch/.gnome-desktop]# ping -c 1 espa043
PING espa043.austin.ibm (9.3.76.43) from 9.3.76.41 : 56(84) bytes of data.
64 bytes from 9.3.76.43: icmp_seq=0 ttl=255 time=0.9 ms
-
-- espa043.austin.ibm ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.9/0.9/0.9 ms
[root@espa041 /home/src/iputils]# ip neigh show
9.3.76.43 dev eth0 lladdr 00:06:29:21:80:20 nud reachable
9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable
9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud reachable
由于espa041试图联络espa043,espa043的硬件地址已经添加到ARP缓冲⾥了。所以直到espa043的记录失效以前(也就是两个机器间长时间没有通讯),espa041 知道如何到
espa043,也就不必频繁地进⾏ARP询问了。
现在让我们来删除 espa043 的ARP缓冲:
[root@espa041 /home/src/iputils]# ip neigh delete 9.3.76.43 dev eth0
[root@espa041 /home/src/iputils]# ip neigh show
9.3.76.43 dev eth0 nud failed
9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable
9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud stale
现在espa041 已经忘记了espa043 的MAC地址,如果下次它要与espa043 通讯,需要再次发送ARP询问。你在espagate (9.3.76.1) 上也会发现以上输出已经变成了"stale"状态。这意味着MAC地址仍然是在册,但是接下来第⼀次通讯的时候需要确认⼀下。
第4章规则——路由策略数据库
如果你有⼀个⼤规模的路由器,你可能不得不同时满⾜不同⽤户对于路由的不同需求。路由策略数据库可以帮助你通过多路由表技术来实现。
如果你想使⽤这个特性,请确认你的内核配置中带有 "IP: advanced router" 和 "IP: policy routing" 两项。
当内核需要做出路由选择时,它会出应该参考哪⼀张路由表。除了 "ip" 命令之外,以前的"route" 命令也能修改 main 和 local 表。
缺省规则:
[ahu@home ahu]$ ip rule list
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
上⾯列出了规则的优先顺序。我们看到,所有的规则都应⽤到了所有的包上 (“from all”)。我们前⾯已经看到了 "main" 表,就是“ip route ls”命令的输出,但是“local”和“default”是初次见到。
如果我们想做点有趣的事情,就可以⽣成⼀些指向不同路由表的规则,取代系统中的路由规则。
对于内核如何处理⼀个IP包匹配多个规则的精确意义,请参见Alexey关于 ip-cref⽂档。
4.1. 简单的源策略路由
让我们再来⼀个真实的例⼦。我有两个Cable Modem,连接到了⼀个 Linux的NAT (“伪装”) 路由器上。这⾥的室友们向我付费使⽤ Internet。假如我其中的⼀个室友因为只想访问 hotmail ⽽希望少付⼀些钱。对我来说这没有问题, 他们肯定只能使⽤那个⽐较次的 Cable Modem。
那个⽐较快的cable modem 的IP地址是 212.64.94.251, PPP 链路,对端IP是212.64.94.1。⽽那个⽐较慢的cable modem 的IP 地址是212.64.78.148,对端是195.96.98.253。
local 表:
[ahu@home ahu]$ ip route list table local
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
local 10.0.0.1 dev eth0 proto kernel scope host src 10.0.0.1
broadcast 10.0.0.0 dev eth0 proto kernel scope link src 10.0.0.1
local 212.64.94.251 dev ppp0 proto kernel scope host src 212.64.94.251
broadcast 10.255.255.255 dev eth0 proto kernel scope link src 10.0.0.1
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 212.64.78.148 dev ppp2 proto kernel scope host src 212.64.78.148
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
有很多明显的事实,其实可能还需要进⼀步说明。好了,这样就⾏了。“default” 表为空。
让我们看看“main”路由表:
[ahu@home ahu]$ ip route list table main
195.96.98.253 dev ppp2 proto kernel scope link src 212.64.78.148
212.64.94.1 dev ppp0 proto kernel scope link src 212.64.94.251
10.0.0.0/8 dev eth0 proto kernel scope link src 10.0.0.1
127.0.0.0/8 dev lo scope link
default via 212.64.94.1 dev ppp0
我们现在为我们的朋友创建了⼀个叫做“John”的规则。其实我们完全可以使⽤纯数字表⽰规则,但是不⽅便。我们可以向 /etc/iproute2/rt_tables ⽂件中添加数字与名字的关联:
# echo 200 John >> /etc/iproute2/rt_tables
# ip rule add from 10.0.0.10 table John
# ip rule ls
0: from all lookup local
32765: from 10.0.0.10 lookup John
32766: from all lookup main
32767: from all lookup default
现在,剩下的事情就是为 John 的路由表创建路由项了。别忘了刷新路由缓存:
# ip route add default via 195.96.98.253 dev ppp2 table John
# ip route flush cache
这样就做好了。⾄于如何在 ip-up 阶段实现就留给读者⾃⼰去研究吧。
4.2. 多重上连ISP的路由
下图是很常见的配置,同⼀个局域⽹(甚⾄是同⼀台计算机)通过两个ISP连接到互联⽹上。 ________
+------------+ /
| | |
+-------------+ ISP 1 +-------
__ | | | /
___/ \_ +------+-------+ +------------+ |
_/ \__ | if1 | /
/ \ | | |
| 局域⽹ -----+ Linux 路由器 | | 国际互联⽹
\_ __/ | | |
\__ __/ | if2 | \
\___/ +------+-------+ +------------+ |
| | | \
+-------------+ ISP 2 +-------
| | |
+------------+ \________
这种情况下通常会出现两个问题。
4.2.1. 流量分割
⾸先是如何保证:回应来⾃某⼀个ISP的数据包时,仍然使⽤相同的ISP。
让我们先定义⼀些符号。令第⼀块⽹卡(上图的if1)的名字叫 $IF1,⽽第⼆块⽹卡叫做 $IF2 。然后设置 $IF1 的IP地址为 $IP1,$IF2 的IP地址为 $IP2。并且,令ISP1 的⽹关地址为
$P1,ISP2 的⽹关地址为 $P2。最后,令$P1的⽹络地址为 $P1_NET ,令$P2的⽹络地址为
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论