一.参考链接:
----按如下链接可以配置,在redhat linux可以实现目标地址为哪个块网卡地址,就从哪块网卡回去:
http://bbs.chinaunix.net/thread-3661955-2-1.html[^]
----实际测试,即使不做任何配置,只配置一个默认网关,虽然icmp,tcp的流量从管理口进入,从业务口返回,也是没有问题的,可以正常接收ICMP和TCP会话建立(对于交换式的UDP不方便测试,没有测试)
二.测试环境:
                                     / (eth0)PC2
PC1(eth0)------------router
                                     \(eth1)PC2

linux策略路由案例_策略路由

A.PC1 :

----windows xp
eth0:10.1.1.8/24 默认网关:10.1.1.1(路由器地址)
B.router
e0/0:10.1.1.1/24
e0/1:172.16.100.1/24
e0/2:192.168.100.1/24
C.PC2:
----Linux AS4 2.6.9-78.EL0000001Wed Jul 9 15:27:01 EDT 2008 i686 i686 i386 GNU/Linux
eth0:172.16.100.8/24 没有设置默认网关,规划走管理流量
eth1:192.168.100.8/24 默认网关:192.168.100.1,规划走业务流量

三.配置步骤:
A.添加路由表:
#vi /etc/iproute2/rt_tables
251 APP
252 MAN
B.两个路由表设置不同的默认路由:
ip route add default via 172.16.100.1 dev eth0 table APP
ip route add default via 192.168.100.1 dev eth1 table MAN
C.两个路由表设置策略路由:
ip rule add from 172.16.100.8 table APP
ip rule add from 182.168100.8 table MAN
----注意:这个地方是rule,不是route
D.将上述语句写到开机脚本中:
# vi /etc/rc.local
ip route add default via 172.16.100.1 dev eth0 table APP
ip route add default via 192.168.100.1 dev eth1 table MAN
ip rule add from 172.16.100.8 table APP
ip rule add from 182.168100.8 table MAN

四.效果测试:
A.配置前,用PC1去ping PC2的管理口地址时,回包是从业务口回的
-----因为只有业务口配置了默认路由
[root@AS4 ~]# tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
11:00:40.672269 IP 10.1.1.8 > 172.16.100.8: icmp 40: echo request seq 26368
11:00:41.714285 IP 10.1.1.8 > 172.16.100.8: icmp 40: echo request seq 26624
11:00:42.715187 IP 10.1.1.8 > 172.16.100.8: icmp 40: echo request seq 26880
11:00:43.714274 IP 10.1.1.8 > 172.16.100.8: icmp 40: echo request seq 27136
B.配置后,用PC1去ping PC2的管理口地址时,回包也从管理口回的
----因为配置了策略路由,从管理口发出的包,走MAN路由表,而MAN路由表配置的默认路由为管理口对端的地址
[root@AS4 ~]# tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
11:05:42.460413 IP 10.1.1.8 > 172.16.100.8: icmp 40: echo request seq 27392
11:05:42.483457 IP 172.16.100.8 > 10.1.1.8: icmp 40: echo reply seq 27392
11:05:43.454196 IP 10.1.1.8 > 172.16.100.8: icmp 40: echo request seq 27648
11:05:43.454250 IP 172.16.100.8 > 10.1.1.8: icmp 40: echo reply seq 27648
11:05:44.462939 IP 10.1.1.8 > 172.16.100.8: icmp 40: echo request seq 27904
11:05:44.462996 IP 172.16.100.8 > 10.1.1.8: icmp 40: echo reply seq 27904
11:05:45.457045 IP 10.1.1.8 > 172.16.100.8: icmp 40: echo request seq 28160
11:05:45.457555 IP 172.16.100.8 > 10.1.1.8: icmp 40: echo reply seq 28160


案例:

功能说明:
由Linux实现流量分割,
1, 到202.96.209.133的数据从Linux路由器的eth2到路由器A,再到202.96.209.133。
2, 到Internet其他地方的数据从Linux路由器的eth1到路由器B,再到Internet。

实现方法:
打开Linux的路由功能:# echo 1 >/proc/sys/net/ipv4/ip_forward
首先添加一条规则,指定从172.16.16.2来的数据查找路由表5:
# ip ru add from 172.16.16.2 lookup 5

1,实现第一个功能
(1),在路由表5中添加一条路由,到202.96.209.133的数据经过192.168.1.1:
# ip ro add 202.96.209.133 via 192.168.1.1 table 5
(2),这样就完成了路由的设置,因为172.16.16.2是私有地址,所以在Linux路由器的出口eth2处应该对其进行NAT的设置,如下:
# iptables -t nat -A POSTROUTING -s 172.16.16.2 -d 202.96.209.133 -j SNAT --to 192.168.1.3
(3),刷新路由缓存:
# ip ro flush cache

2, 实现第二个功能(在第一个的基础上)
(1),在路由表5中添加默认路由:
# ip ro add default via 10.10.10.2 table 5
(2),在Linux路由器的出口eth1处进行NAT设置:
# iptables -t nat -A POSTROUTING -s 172.16.16.2 -j SNAT --to 10.10.10.1
(3),刷新路由缓存:
# ip ro flush cache
注意:如果路由缓存不刷新的话,路由命令不能马上生效!


脚本如下:

--------------------------------------------------------------------------------

#!/bin/sh  echo 1 >/proc/sys/net/ipv4/ip_forward  ip ru add from 172.16.16.2 lookup 5  ip ro add 202.96.209.133 via 192.168.1.1 table 5  iptables -t nat -A POSTROUTING -s 172.16.16.2 -d 202.96.209.133 -j SNAT --to 192.168.1.3  ip ro add default via 10.10.10.2 table 5  iptables -t nat -A POSTROUTING -s 172.16.16.2 -j SNAT --to 10.10.10.1  ip ro flush cache


--------------------------------------------------------------------------------


你也可以将上面脚本中的几行iptables命令合为一行如下:
#iptables -t nat -A POSTROUTING -s 172.16.16.2 -j MASQUERADE
那么脚本如下:

--------------------------------------------------------------------------------

#!/bin/sh
echo 1 >/proc/sys/net/ipv4/ip_forward
ip ru add from 172.16.16.2 lookup 5
ip ro add 202.96.209.133 via 192.168.1.1 table 5
ip ro add default via 10.10.10.2 table 5
iptables -t nat -A POSTROUTING -s 172.16.16.2 -j MASQUERADE
ip ro flush cache

--------------------------------------------------------------------------------



可以使用tracert命令进行测试。不同点在于路由的第二跳,到202.96.209.133时,第二跳为:192.168.1.1,到其他地方时第二跳为:10.10.10.2。

注意:linux路由器是不能上网的,因为没有为他自己指定专门的路由或默认路由。为Linux路由器指定路由的命令如下:
ip ro add default via 192.168.1.1
ip ro flush cache

文章2:

实验名称:Linux下实现基于源地址的策略路由
操作系统:RedHat 7.2
所使用的内核:2.4.18
必须的模块: iproute2,iptables
作者:lna@networksbase.com
功能描述:首先你必须明白策略路由和路由策略是两个不同的概念,策略路由是根据IP包中的源地址,端口号等来实现的;而路由策略可以理解为路由表中的一系列路由动作。

普通的路由是根据IP包中的目的地址来判断的,如:如果数据包是到http://linux.networksbase.com的,那么发送到网关192.168.1.1,如果到其他地方发送到192.168.2.1。
但很多时候我们需要对数据包的源地址也要作出判断,如:网络中有几条出口线路,那么优先权高的人走速率快的链路,其他人走速率慢的链路,这个时候就需要策略路由。


描述:实验中有两个局域网:LAN 1和LAN 2,我们要实现如下功能:
1,LAN 1中的192.168.2.25和192.168.2.128从路由器A上网;
2,LAN 1中的其他用户从路由器B上网;
3,LAN 2中的所有用户从路由器A上网
实现:
首先你要打开Linux服务器的路由功能,命令如下:
echo 1> /proc/sys/net/ipv4/ip_forward


然后设置LAN 1和LAN 2的IP伪装
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 172.16.3.0/24 -j MASQUERADE


1,设置192.168.2.25和192.168.2.128的路由:
ip rule add from 192.168.2.25 lookup 5
ip rule add from 192.168.2.128 lookup 5
这两句话的意思是将来自192.168.2.25和192.168.2.128的数据查找路由表5
ip route add default via 192.168.0.1 table 5
定义路由表5的路由策略。


2,设置LAN 1中其他用户的路由:
ip rule add from 192.168.2.0/24 lookup 6
这句话的意思是让来自192.168.2.0的数据查找路由表6
ip route add default via 192.168.1.1 table 6
定义路由表6的路由策略。


3,设置LAN 2的路由:
ip rule add from 172.16.3.0/24 lookup 6
这句话的意思是让来自LAN 2的数据查找路由表6
ip route add default via 192.168.1.1 table 6(这条命令上面已经用过了!)
4,刷新路由:
ip route flush cache
5,脚本如下:

--------------------------------------------------------------------------------

#!/bin/sh  echo 1> /proc/sys/net/ipv4/ip_forward  iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE  iptables -t nat -A POSTROUTING -s 172.16.3.0/24 -j MASQUERADE  ip rule add from 192.168.2.25 lookup 5  ip rule add from 192.168.2.128 lookup 5  ip route add default via 192.168.0.1 table 5  ip rule add from 192.168.2.0/24 lookup 6  ip rule add from 172.16.3.0/24 lookup 6  ip route add default via 192.168.1.1 table 6  ip route flush cache

--------------------------------------------------------------------------------

6,更明显一些,我们可以将上面脚本中的iptables命令行替换为下面的行
iptables -t nat -A POSTROUTING -s 192.168.2.25/24 -j SNAT --to 192.168.0.51
iptables -t nat -A POSTROUTING -s 192.168.2.128/24 -j SNAT --to 192.168.0.51
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to 192.168.1.51
iptables -t nat -A POSTROUTING -s 172.16.3.0/24 -j SNAT --to 192.168.0.51
那么新脚本如下:

--------------------------------------------------------------------------------

#!/bin/sh  echo 1> /proc/sys/net/ipv4/ip_forward  iptables -t nat -A POSTROUTING -s 192.168.2.25/24 -j SNAT --to 192.168.0.51  iptables -t nat -A POSTROUTING -s 192.168.2.128/24 -j SNAT --to 192.168.0.51  iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to 192.168.1.51  iptables -t nat -A POSTROUTING -s 172.16.3.0/24 -j SNAT --to 192.168.0.51  ip rule add from 192.168.2.25 lookup 5  ip rule add from 192.168.2.128 lookup 5  ip route add default via 192.168.0.1 table 5  ip rule add from 192.168.2.0/24 lookup 6  ip rule add from 172.16.3.0/24 lookup 6  ip route add default via 192.168.1.1 table 6  ip route flush cache


转自:http://rfyiamcool.blog.51cto.com/1030776/768562