能不能实现访问某个端口的数据包单走一个路由???(已解决)

发表于:2007-07-04来源:作者:点击数: 标签:
比如LINUX做的网关上有两条路由A、B defaultGW为A,另一个静态路由是B 我想实现,当访问TCP协议80端口时,走路由B,其他全走A,可以吗? 我看了看关于路由策略的东西,只有from和to,没有上升到应用层的端口部分 想用iptables的SNAT做转换,但仍然无法改变路

比如LINUX做的网关上有两条路由A、B
default GW为A,另一个静态路由是B

我想实现,当访问TCP协议80端口时,走路由B,其他全走A,可以吗?

我看了看关于路由策略的东西,只有from和to,没有上升到应用层的端口部分
想用iptables的SNAT做转换,但仍然无法改变路由链路

难道真的没办法了吗?

 q1208c 回复于:2004-04-27 15:04:37
用iptables 呀!

 platinum 回复于:2004-04-27 15:25:32
我试过了不行,不妨你说说如何实现?

 q1208c 回复于:2004-04-27 15:32:34
iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 80 -j ACCPET
iptables -A FORWARD -i eth1 -o eth2 -p tcp --dport 80 -j REJECT

 platinum 回复于:2004-04-27 15:39:23
REJECT到哪?
所有人(CLIENT)都是在同一个C里,同一个GW,都连LINUX
LINUX上,有两个出口路由A、B
现在已经过滤了一部分,某几个IP走B,其他人走A
我想让走A的人中,访问80端口的人也走B出去

 q1208c 回复于:2004-04-27 15:52:48
没明白。是不是每个人的机器上有两个路由呀?

那就在一个路由做REDIRECT行不行呢?

 platinum 回复于:2004-04-27 16:31:43
每个人的机器上就一个路由,路由是连到LINUX上的,在LINUX上做路由策略

我做策略,只能针对到IP,比如,哪些特殊IP通过LINUX的时候从路由B走,其余从DEFAULT的A走

我想实现对端口的控制,访问80端口的走路由B,不知道行不行

 q1208c 回复于:2004-04-27 16:38:45
行呀!加上 --dport 不就行了么。

 platinum 回复于:2004-04-27 16:45:24
举个例子吧
假如LINUX上的default gw是1.1.1.1,第二个路由是2.2.2.2,本地网接口是5.5.5.5

客户机(WINDOWS)只要设置GW为5.5.5.5就可以了
LINUX下怎么实现80端口走2.2.2.2呢?

你来写一下

 q1208c 回复于:2004-04-27 16:52:47
iptables -A FORWARD -i eth0 -o eth2 --dport 80 -j ACCEPT
iptables -P FORWARD drop
iptables -A FORWARD -i eth0 -o eth2 -j ACCEPT

 platinum 回复于:2004-04-27 16:56:26
没用,走的还是default GW,我试过
我默认的全是ACCEPT,上网的时候也还是走default gw那条路由
除非我ip rule add from x.x.x.x table yyyy
这样才换成yyyy路由表里的路由

问题是我要以端口为依据,而不是IP

 q1208c 回复于:2004-04-27 17:20:48
[quote:248084fcf2="q1208c"]iptables -A FORWARD -i eth0 -o eth2 --dport 80 -j ACCEPT
iptables -P FORWARD drop
iptables -A FORWARD -i eth0 -o eth2 -j ACCEPT[/quote:248084fcf2]

--dport 80不是端口么?

因为如果是80就forward 到eth2了呀!难道你的IP不是在同一个网口上的??
下面那个可能有点问题,改成这样
iptables -A FORWARD -i eth0 -o eth0 -j ACCEPT
这样行么?

 platinum 回复于:2004-04-27 17:30:27
我说一下拓扑,可能我没说清楚
3个网卡
ETH0,负责走路由A
ETH1,负责走路由B
ETH2,办公网络,是个C类

默认网关是A,我需要把访问80端口的IP走路由B

 q1208c 回复于:2004-04-27 17:41:18
[quote:588fd14685="platinum"]我说一下拓扑,可能我没说清楚
3个网卡
ETH0,负责走路由A
ETH1,负责走路由B
ETH2,办公网络,是个C类

默认网关是A,我需要把访问80端口的IP走路由B[/quote:588fd14685]

iptables -P FORWARD DROP
iptables -A FORWARD -i eth2 -o eth1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth2 -o eht0 -j ACCEPT

 platinum 回复于:2004-04-27 17:43:47
不行,试了

 q1208c 回复于:2004-04-27 17:45:45
[quote:d041a87b44="platinum"]不行,试了[/quote:d041a87b44]
它是怎么走的??因为它应该FORWARD不过去了呀!

 platinum 回复于:2004-04-27 18:46:57
和FORWARD没关系
不知道LINUX上有没有ROUTER中的备份路由的概念(不用ROUTER模拟软件)

我这样试的
iptables -t nat -I POSTROUTING -p tcp --dport 80 -j SNAT --to 2.2.2.2
结果还是出不去,但default GW改为2.2.2.2,HTTP就能出去了,改回1.1.1.1,依然出不去

和FORWARD没关系,FORWARD只是内部NAT之前的一个FILTER

 yongpeng 回复于:2004-04-27 23:37:07
your will need to use advance ip routing and iptables mangle rules :

e.g :

# ip route add table 3 default via 2.2.2.2

# iptables -t mangle -A PREROUTING -p tcp --dport 80 -s 192.168.99.0/24 -j MARK --set-mark 1

# ip rule add fwmark 1 table 3


in fact, it will not work properly because of arp cache issue and iptables doesn't support load balance by default , e.g. one of your client go to http port of ip 202.1.1.1, so this ip will be inside your system arp entry and will cache it for sometimes, so before your system release the arp cache, whenever you go to this ip, it is take only the previuos routing path even you use other port than http, and your iptables & advance ip routing rules will not allow. so you will still need the julian's route patch to make it work.

hope help

 platinum 回复于:2004-04-28 07:47:51
非常感谢yongpeng大哥!
请问必须要julian's route patch to make it work吗?
这个东西是怎么找?需要打到KERNEL里吗?

 platinum 回复于:2004-04-28 07:54:35
另外我又看了一下IP命令手册
里面写了
tos TOS或者dsfield TOS选择匹配的TOS值 
fwmark MARK选择要匹配的fwmark值 
这个TOS又是什么呢?
查了iptables资料
[quote:f6a15faa8a]
TOS
用来设置IP包的首部八位tos。只能用于mangle表。
[/quote:f6a15faa8a]
是不是就是SYN等那8种?

 platinum 回复于:2004-04-28 09:06:04
问题解决
主要用的是
iptables -t mangle -A PREROUTING -p tcp --dport 80 ......

ip rule add fwmark.....

首先对特殊包进行MARK
然后在策略路由里,将MARK的包进行换路由操作就可以了

 q1208c 回复于:2004-04-28 09:11:30
[quote:5a3421bd82="platinum"]问题解决
主要用的是
iptables -t mangle -A PREROUTING -p tcp --dport 80 ......

ip rule add fwmark.....

首先对特殊包进行MARK
然后在策略路由里,将MARK的包进行换路由操作就可以了[/quote:5a3421bd82]

你加了那个 patch 了么? :?:

 platinum 回复于:2004-04-28 09:26:39
没有,那个可能是做负载均衡用的,就像我写的那个ISP多重上连要打的PATCH一样

 yongpeng 回复于:2004-04-28 10:27:57
TOS is something to do with change the ip package, just like NAT is something to do with change the ip addr header. it mostly use in control the priority of ip package and you can use it to allow tcp type of service (http, ftp ...) going faster. 

take a look http://www.ssi.bg/~ja/ ;for the explaination and patch.

i do a quick example for your reference on why it will not work properly if without this patch.

assume everything you done properly and without patch yet, then the following case will happen to you.

        
first default gateway       : 1.1.1.1
second default gateway  : 2.2.2.2

your internet ip from outside your network : 3.3.3.3


when you telnet from 3.3.3.3 to 1.1.1.1, it will work.
again, you telnet to 3.3.3.3 to 2.2.2.2, it will not work.

i did face this problem before patch the kernel, you can find the answer in Julian's website.

 yongpeng 回复于:2004-04-28 10:48:50
sorry, i forgot to mention :

if you only got one default gw and other just static route, then 
you need not apply Julian's patch. Julian's Patch is useful for multiple default gw and load balancing.

 fadeblue 回复于:2004-04-28 13:28:41
只能在交换机上做

 platinum 回复于:2004-04-28 13:38:00
我现在已经成功了,但是没打补丁,也没用负载均衡的东西
我也看过一篇文章,然后自己写了一个“多重上连ISP”,也是说的LOAD BALANCE,其中也说必须要打补丁,否则效果不好

看来LINUX默认的这个东西还是有问题的

 xiaoyafeng 回复于:2004-04-28 14:49:22
连tos 的概念都没有。。。。。。。

 lingg2002 回复于:2004-04-28 21:22:23
tcpic详解第一卷的25页有tos的介绍

 xiaoyafeng 回复于:2004-04-29 10:08:10
我是说楼主,有空先去看看rfc。

 platinum 回复于:2004-04-29 10:21:40
[quote:6023ba3082="xiaoyafeng"]我是说楼主,有空先去看看rfc。[/quote:6023ba3082]
这个主题和其解决方案,与TOS没关系,也没用到过,没接触过

TOS以后如果用到了,有时间还是要看的

 austinfay 回复于:2004-04-30 15:29:12
怎么解决的,楼主不总结一下么?

 我是笨笨 回复于:2004-04-30 15:44:58
[quote:28adb2f787="platinum"]问题解决
主要用的是
iptables -t mangle -A PREROUTING -p tcp --dport 80 ......

ip rule add fwmark.....

首先对特殊包进行MARK
然后在策略路由里,将MARK的包进行换路由操作就可以了[/quote:28adb2f787]

笨笨看到了楼主的总结,基本上明白了……
楼主的想法有点怪异,但LINUX却实现了,觉得LINUX的路由功能真是强大啊
 :oops:

 wangrujun 回复于:2004-04-30 16:56:42
在交换机上实现方便吗?

 顺风_飞扬 回复于:2004-04-30 22:19:49
[quote:03d9abda1b="我是笨笨"]

笨笨看到了楼主的总结,基本上明白了……
楼主的想法有点怪异,但LINUX却实现了,觉得LINUX的路由功能真是强大啊
 :oops:[/quote:03d9abda1b]
 楼主的想法并不怪异,其实在大的局域网里(几千以上)通过做NAT上网,这种方法很好!!

 我是笨笨 回复于:2004-04-30 23:30:42
原来是这样!!!
明白了!!!!!!!

看来LINUX的功能真是强大啊!!!!!!!
我爱死他了!!!!!!!!!!!!!!!!!!!!!!!!!!!
(如果一个老板非逼着员工用WINDOWS实现,估计那个员工要哭死了)
 :mrgreen:

 windstar 回复于:2005-02-21 01:18:38
[quote:7c7456eaca="我是笨笨"]原来是这样!!!
明白了!!!!!!!

看来LINUX的功能真是强大啊!!!!!!!
我爱死他了!!!!!!!!!!!!!!!!!!!!!!!!!!!
(如果一个老板非逼着员工用WINDOWS实现,估计那个员工..........[/quote:7c7456eaca]

达到目的的方法有很多撒

要达到www访问分流的目的,最简单的方式可以让底下的client用proxy撒,当然解决方案不如linux下这么好了哈,肯定还是有其他的办法的

 采风 回复于:2005-02-21 09:46:52
好帖子,给人非常好的思路 :roll:

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