(原创)通过iptables与iproute2协同实现根据应用的策略路由

发表于:2007-07-04来源:作者:点击数: 标签:
通过iptables与iproute2协同实现根据应用的策略路由 (简洁明了版本前提了解多路由表的概念了解策略路由的概念熟悉iptables和iproute2工具包) 假设, 网络 中有两个外部接口,IP地址分别为eth0172.16.1.1/24,eth110.0.0.1/24,连接内部 网络 的接口为eth2192.1

通过iptables与iproute2协同实现根据应用的策略路由
(简洁明了版本 前提 了解多路由表的概念 了解策略路由的概念 熟悉iptables和iproute2工具包)

    假设,网络中有两个外部接口,IP地址分别为eth0 172.16.1.1/24,eth1 10.0.0.1/24,连接内部网络的接口为eth2 192.168.1.1。现在设计这样一个策略,将所有来自内部网络的web服务的数据,走向172.16.1.1这个出口。其他的数据走向10.0.0.1 这个出口。
    
#接口设置
ifconfig eth0 172.16.1.1 .netmask 255.255.255.0
ifconfig eth1 10.0.0.1 netmask 255.255.255.0
ifconfig eth2 192.168.1.1 netmask 255.255.255.0
echo 1 >/proc/sys/net/ipv4/ip_forward

#将web服务类的数据包打上标示100
#这一步,很关键,用于实现策略路由的是iproute2工具包,但是iproute2工具包是无法根据端口来进行匹配的,因此,需要借助iptables来配合
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 100

#增加多路由表 假设172.16.1.1 这一出口的网关是172.16.1.254
ip route add 0/0 via 172.16.1.254 table 100

#设置路由策略 凡是数据包标记位上是100的数据,查询100号路由表
ip rule add fwmark 100 table 100

#NAT 如果需要的话,进行NAT 不需要的话,就直接路由
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE


     这篇帖子主要是说明了把iptables和iproute2协同以后可以做出很多很强的应用。你可以利用iptables强劲的对数据报的识别能力来将不同类型的数据包打上你自己定义的标示,然后利用iproute2的策略路由的功能来对路由进行人为的干预。
    如果你发现你对这篇帖子里写的东西不是很清楚,但是却又对这一应用很感兴趣,那么,欢迎跟我取得联系。

 fushuyong 回复于:2005-01-02 21:25:38
顶一下,只是希望能有更多的人能看到这篇帖子。

 fushuyong 回复于:2005-01-03 09:56:35
呵呵,还是只有我一个人回,还好版主给我加了精华。谢谢版主。2004年我来论坛来得少,2005年里我决定来论坛写点东西,零散的东西就不写了,争取发出来的帖子就能加精华,主要的目的只有一个,希望别人看了我的帖子以后觉得实用,觉得有用,觉得能用,这我就很开心了。

 零二年的夏天 回复于:2005-01-03 10:39:31
很感谢朋友的分享精神。
也欢迎大家把好的经验体会与大家分享。
:D

 blue_stone 回复于:2005-01-03 12:36:21
帖子不错,感谢楼主,如果我想让一个数据包走那里近就走那里,该怎么实现?

 fushuyong 回复于:2005-01-03 14:40:22
走哪里近就走哪里?是完全动态的吗?这个需要你预先规划好策略,策略可能比较复杂。如果需要做到完全动态的话,那可能要自己做下二次开发

 imtj 回复于:2005-01-03 14:44:28
非常不错,这样一来就很容易实现硬件路由器才能够实现的流量均衡了,谢谢分享!

 skylove 回复于:2005-01-03 16:26:50
用iproute2的ip from 和 ip to 就可以独立完成的,可以不用iptables打标签

 fushuyong 回复于:2005-01-03 21:19:55
ip from 和ip to 只能实现源地址和目的地址策略吧 ,只能到IP这一层无法到端口这一层吧?

 skylove 回复于:2005-01-03 21:57:25
的确是无法到端口,如果需要指定端口,那么是需要用你的方法,让iptables做标记的

 happyhunter 回复于:2005-01-03 22:11:18
请问楼主,如果本机同时开了squid做缓存,你的策略路由就不起效果了,你觉得怎么解决这个问题?

 netfrihor 回复于:2005-01-04 07:22:14
好贴,谢谢楼主分享

 急不通 回复于:2005-01-04 09:52:46
好贴!

 fushuyong 回复于:2005-01-04 12:42:22
如果开启了squid,的确会出现你所说的问题。但是,既然已经suqid了web的流量,那么自然在网络的设计上也不需要对80号端口的数据进行策略路由。我在这里重点的只是想希望说明一下,通过iptables的打标示的功能,再配合iproute2可是实现很灵活的路由策略,而具体的是用来区分什么服务,譬如我举的例子里是讲的web服务,80号端口。可能你需要区分21号端口,或者23号端口等等,都可以按照这个方法来。

 好好先生 回复于:2005-01-04 13:02:33
[quote:4189c073ad="fushuyong"]呵呵,还是只有我一个人回,还好版主给我加了精华。谢谢版主。2004年我来论坛来得少,2005年里我决定来论坛写点东西,零散的东西就不写了,争取发出来的帖子就能加精华,主要的目的只有一个,希望别人看了我的帖子以..........[/quote:4189c073ad]

呵呵,如果是“完整”版,应该就是原创精华了,像我这样笨的人更希望看完整版,而不是简洁版。 :mrgreen: 

BTW:期待你的更多的精华……

 fushuyong 回复于:2005-01-04 16:41:22
要完整版啊,恩,我去整理一下,写多了你别嫌我罗嗦就好了。

 gydoesit 回复于:2005-01-04 22:04:45
我也要.并且我关心的是如果一条断了怎么办?另外,优先级及恢复.

 KindGeorge 回复于:2005-01-08 14:35:53
好贴,我顶.
本人对linux高级路由及iptables,tc等很感兴趣,已经研究一段时间.
也期待你的更多的精华帖子.谢谢你

 钢盅锅子 回复于:2005-01-08 22:53:07
haha,不错~
我想了两天,最后也这么弄了,要是早看到就好了

 RobinWang 回复于:2005-01-10 08:47:38
真是好东西,正是我需要的。
期待完整版

 eagerlinuxer 回复于:2005-01-10 09:58:30
不给完整版也行,给点相关的资料吧。英文的也行。

 jackylau 回复于:2005-01-11 15:31:34
可楼主怎么还没有把你的完整版给发出来,让我们也好见识一下呀!

 Raistlin 回复于:2005-01-13 15:18:49
呼唤完整版~~~楼主加油

 jackylau 回复于:2005-08-04 11:44:12
完整版怎么还没出来? :em08:

原文转自:http://www.ltesting.net