免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3824 | 回复: 10
打印 上一主题 下一主题

iptables DNAT 高难度问题,关键字:双线接入,DNAT, 策略路由 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-15 12:09 |只看该作者 |倒序浏览
网络拓扑如下:




问题描述:
1. A1,A2为外网机器,IP分别为3.3.3.3, 4.4.4.4 ;
2. B 为Linux防火墙,双线接入(对应于两个ISP:电信,网通),有三张网卡,分别对应两个外网接口和一个内网接口,外网I1(1.1.1.1)接口的默认出口网关为GW1(1.1.1.100),外网I2(2.2.2.2)接口的默认出口网关为GW2(2.2.2.100), I3(192.168.1.1)为内网接口;
3. C 为内网某机器,IP 为 192.168.1.2, 缺省网关为防火墙内网地址 192.168.1.1;
4.防火墙 B 的设置
   a. 路由设置:
      1) 基于目的地址的路由 : 默认到 A1 的路由为 GW1 , 即 route add 3.3.3.3 gw 1.1.1.100 , 默认到A2 的路由为GW2,即route add 4.4.4.4 gw 2.2.2.100 , 即图中粗线所示;
      2) 基于源地址的策略路由:即 由I1 发出的数据走GW1, 由I2 发出的数据走GW2 , 即图中虚线所示;
      3) 基于源地址的策略路由优先级要高于基于目的地址的路由
   b. DNAT 设置 :防火墙 外网 P1端口映射到内网IP 192.168.1.2 的P1 端口
   c. IP 伪装 : 内网机器192.168.1.2 能通过防火墙访问外网

如上设置后, 外网A1,A2 同时连接防火墙的I1 , I2 接口本身是没有任何问题(四种方式均能ping通);

问题出现在连接DNAT端口上,
  A1只能连接I1的P1端口,不能连I2的P1端口,原因是数据返回给A1的时候走的是GW1,连接无法建立;
  A2只能连接I2的P1端口,不能连I1的P1端口,原因是数据返回给A2的时候走的是GW2,连接无法建立;

问题提出:如何能让A1,A2能同时访问I1,I2的P1端口, 即让防火墙跟踪DNAT数据,类似于策略路由机制,从哪里个接口过来来就从哪个接口返回?

sorry 看不到图片的请看附件

[ 本帖最后由 thrack 于 2006-4-15 23:14 编辑 ]

ipt.jpg (24.98 KB, 下载次数: 47)

网络拓扑图

网络拓扑图

论坛徽章:
0
2 [报告]
发表于 2006-04-15 14:16 |只看该作者
难到不难,关键是不知道你怎么做的,都做了什么,有什么没做的,写的对不对
最好贴出你的所有路由、策略路由、防火墙的配置

btw: 这不是 iptables 的问题,是 iptables、iproute 等多方面结合的问题

论坛徽章:
0
3 [报告]
发表于 2006-04-15 14:51 |只看该作者
OK,多谢版主回应。

电信接口为 eth0 1.1.1.1(假定)
网通接口为 eth1 2.2.2.2(假定)
内网接口为eth2  192.168.1.1

[root@fw ~]# ip rule list
0:      from all lookup local
1500:   from 1.1.1.1 lookup chinatelcom
1600:   from 2.2.2.2 lookup cncgroup
32766:  from all lookup main
32767:  from all lookup default

[root@fw ~]# ip route list table chinatelcom
default via 1.1.1.100 dev eth0

[root@fw ~]# ip route list table cncgroup
default via 2.2.2.100 dev eth1


[root@fw ~]# ip route list table main       
4.4.4.4/32 via 2.2.2.100 dev eth1  #目的地址为4.4.4.4/32则走eth1,其余走eth0
default via 1.1.1.100 dev eth0        #缺省走eth0


[root@fw ~]# ip route list table default


[root@fw ~]# iptables -L -n -t nat -v
Chain PREROUTING (policy ACCEPT 836K packets, 72M bytes)
pkts bytes target     prot opt in     out     source               destination
   23  1216 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:3389 to:192.168.1.2        #将外网3389映射到内网192.168.1.2 3389

Chain POSTROUTING (policy ACCEPT 19707 packets, 1317K bytes)
pkts bytes target     prot opt in     out     source               destination
169K   15M MASQUERADE  all  --  *      *       192.168.0.0/16       0.0.0.0/0        #ip 伪装
    0     0 SNAT       all  --  *      *       192.168.0.0/16       192.168.1.2       to:192.168.1.1 #方便内网访问

Chain OUTPUT (policy ACCEPT 20047 packets, 1478K bytes)
pkts bytes target     prot opt in     out     source               destination


[root@fw ~]# iptables -L -n  -v
Chain INPUT (policy ACCEPT 11 packets, 700 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 10 packets, 1484 bytes)
pkts bytes target     prot opt in     out     source               destination

[ 本帖最后由 thrack 于 2006-4-15 15:02 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-04-15 15:12 |只看该作者
iptables 部分没有问题

1500:   from 1.1.1.1 lookup chinatelcom
1600:   from 2.2.2.2 lookup cncgroup
我觉得这两个做的有问题,实际根本没有效果
因为是路由,不是 NAT,所以你看不到数据包里面原地址是上面两个的数据,即便要写也要写外面的真实 IP

不知道你分别对进入两块网卡的数据包打 MARK,然后根据 MARK 将出去的数据包送往指定的 GW 是否可行
这样可以保证从哪个 eth 进来还从那个 eth 出去,不同的 eth 有不同的 GW,间接实现你的需求
我暂时还没想到更好的方法,我再考虑一下。。。

论坛徽章:
0
5 [报告]
发表于 2006-04-15 16:23 |只看该作者
原帖由 platinum 于 2006-4-15 15:12 发表
iptables 部分没有问题

1500:   from 1.1.1.1 lookup chinatelcom
1600:   from 2.2.2.2 lookup cncgroup
我觉得这两个做的有问题,实际根本没有效果
因为是路由,不是 NAT,所以你看不到数据包里面原地址是 ...



1.1.1.1 和 2.2.2.2 是假定的真实IP来的,这两行是起作用的,而且对应任意外网地址能连接这两个ip是非常关键的:)

打mark的方式,可能不行, 因为是数据从内网的机器上返回给公网,能保证返回的数据上有mark么?
不是很清楚mark的机制,不过先得试下, 看能不能用上,先谢了:)

[ 本帖最后由 thrack 于 2006-4-15 16:34 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-04-15 18:00 |只看该作者
电信接口为 eth0 1.1.1.1(假定)
网通接口为 eth1 2.2.2.2(假定)
这不是你自己假定的网关地址吗?

你收到的数据包中的原地址不可能是 1.1.1.1 或者 2.2.2.2 啊

论坛徽章:
0
7 [报告]
发表于 2006-04-15 18:16 |只看该作者
原帖由 platinum 于 2006-4-15 18:00 发表
电信接口为 eth0 1.1.1.1(假定)
网通接口为 eth1 2.2.2.2(假定)
这不是你自己假定的网关地址吗?

你收到的数据包中的原地址不可能是 1.1.1.1 或者 2.2.2.2 啊


呵呵,如图,假定的网关是这两个
gw1 1.1.1.100
gw2 2.2.2.100



用mark试了下,好像不行

iptables -t mangle -I FORWARD -i eth0 -p tcp --dport 3389 -j MARK --set-mark 10
iptables -t mangle -I FORWARD -i eth1 -p tcp --dport 3389 -j MARK --set-mark 20

ip rule add fwmark 10 pref 120 table chinatelcom
ip rule add fwmark 20 pref 130 table cncgroup

[ 本帖最后由 thrack 于 2006-4-15 18:19 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-04-22 09:54 |只看该作者
终于想到一种可行的解决方案了, 拿出来分享一下,希望对碰到类似问题的网管有所帮助:

1.在目标机器上增加两个IP绑定 如 192.168.1.3 192.168.1.4 (原有的192.168.1.2为缺省,不变)

2. 网关上增加策略路由 从 192.168.1.3 过来的走电信接口, 从 192.168.1.4 过来的走网通接口 , 即
ip rule add from 192.168.1.3 pref 1700 table chinatelcom
ip rule add from 192.168.1.4 pref 1800 table cncgroup

3.DNAT 设置, 清除之前DNAT设置, 将从eth0 进来的访问3389 的请求DNAT到 192.168.1.3 , 从eth1 进来的访问3389 的请求DNAT到192.168.1.4, 即
iptables -t nat -I PREROUTING -p tcp -i eth0 --dport 3389 -j DNAT --to-destination 192.168.1.3
iptables -t nat -I PREROUTING -p tcp -i eth1 --dport 3389 -j DNAT --to-destination 192.168.1.4


经过此番烦琐的设置后,即可解决同时连两个DNAT接口的问题


引申问题: 该方法的确比较烦琐,目标机器要有3个IP,且又是增加路由的又是修改DNAT的...
            看看能否在GW和DNAT机器联动,数据进来时在GW加TOS,目标机器根据进来的TOS返回数据时仍然携带该TOS来策略路由?
           btw: 昨晚试过,目标机器为Windows,返回时不携带原有的TOS

欢迎大家就此发表意见.

论坛徽章:
0
9 [报告]
发表于 2006-11-03 16:24 |只看该作者
原帖由 thrack 于 2006-4-22 09:54 发表
终于想到一种可行的解决方案了, 拿出来分享一下,希望对碰到类似问题的网管有所帮助:

1.在目标机器上增加两个IP绑定 如 192.168.1.3 192.168.1.4 (原有的192.168.1.2为缺省,不变)

2. 网关上增加策略路由 从 ...


你这个方法肯定是不行的, 你的策略路由的网关不是192网段,怎么可以直接走1。1.1。x或者 2.2.2x呢?

论坛徽章:
0
10 [报告]
发表于 2006-11-30 15:08 |只看该作者
原帖由 5iwww 于 2006-11-3 16:24 发表


你这个方法肯定是不行的, 你的策略路由的网关不是192网段,怎么可以直接走1。1.1。x或者 2.2.2x呢?



呵呵,这种方法已经用了大半年了,基本正常.
TCP的话还没有什么问题,UDP就有问题了:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP