免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 7810 | 回复: 21

[网络管理] iptables DNAT 外网访问正常,内网不行,牛人请进! [复制链接]

论坛徽章:
0
发表于 2007-01-14 16:19 |显示全部楼层
上网方式是adsl,通过端口映射访问内网机器,从而开放web服务,公网访问可以,内网不能访问,配置如下:

端口映射
/sbin/iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80  -j DNAT --to 192.168.1.253:80

这样解决不行
/sbin/iptables -t nat -A POSTROUTING -d 192.168.1.253 -p tcp --dport 80 -s 192.168.1.0/24 -j SNAT  192.168.1.1

请大家看看,有啥办法解决

[ 本帖最后由 wolf1980 于 2007-1-14 17:55 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2007-01-14 16:40 |显示全部楼层
iptables-save 結果貼一貼?

论坛徽章:
0
发表于 2007-01-14 16:53 |显示全部楼层
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.1.188:3389
-A PREROUTING -i ppp0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.253:80
-A POSTROUTING -s 192.168.1.0/255.255.255.0 -o ppp0 -j MASQUERADE
-A POSTROUTING -s 192.168.1.0/255.255.255.0 -d 192.168.1.253 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.1.2:80
-A POSTROUTING -o ppp0 -j MASQUERADE
COMMIT
# Completed on Sun Jan 14 17:05:21 2007
# Generated by iptables-save v1.2.7a on Sun Jan 14 17:05:21 2007
*filter
:INPUT DROP [1:404]
:FORWARD ACCEPT [1544:942676]
:OUTPUT ACCEPT [87:12001]
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i ppp0 -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -i ppp0 -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A INPUT -i ppp0 -p icmp -m icmp --icmp-type 3/4 -j ACCEPT
-A INPUT -i ppp0 -p icmp -m icmp --icmp-type 4 -j ACCEPT
-A INPUT -i ppp0 -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A INPUT -i ppp0 -p icmp -m icmp --icmp-type 12 -j ACCEPT
-A INPUT -i ppp0 -p icmp -m icmp --icmp-type 14 -j ACCEPT
-A INPUT -i ppp0 -p icmp -m icmp --icmp-type 16 -j ACCEPT
-A INPUT -i ppp0 -p icmp -m icmp --icmp-type 18 -j ACCEPT
-A INPUT -i ppp0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i ppp0 -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -i ppp0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i ppp0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i ppp0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i ppp0 -p tcp -m tcp --dport 110 -j ACCEPT
-A INPUT -i ppp0 -p tcp -m tcp --dport 113 -j ACCEPT

论坛徽章:
0
发表于 2007-01-14 17:04 |显示全部楼层
A POSTROUTING -s 192.168.1.0/255.255.255.0 -o ppp0 -j MASQUERADE
-A POSTROUTING -s 192.168.1.0/255.255.255.0 -d 192.168.1.253 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.1.2:80

脚本中后一条是在前面的 , SNAT --to-source 是不是该设置ppp0的地址,ppp0可又是动态的

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
发表于 2007-01-14 17:30 |显示全部楼层
标题和内容严重不符.斑竹怎么不锁了它.

论坛徽章:
0
发表于 2007-01-14 17:47 |显示全部楼层
是不是icmp重导问题,概念我也不清楚,这是从FAQ中看到的,下面是正文

每个发贴的人,我想都是急于想解决问题的,你这种态度,我很失望

3. 如何配置连线到 NAT 主机某个对外 Port 时,可以转送到内部某主机?


一般语法配置为:


[Copy to clipboard]CODE:
iptables -A PREROUTING -t nat -d 210.1.1.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.1:80

这边是假设该 NAT 主机本身对外的 ip 为 210.1.1.1,设定外面连结存取到该 ip 的 port 80 时,将封包转送到 192.168.1.1 的 port 80 上。

不过该配置常谈到的问题就是,也许有人在 192.168.1.0/24 该内部网段连结 210.1.1.1 的 port 80 时,却无法浏览实际 192.168.1.1:80 该服务项目。

该问题牵涉到 icmp 重导的问题,而且目前 netfilter iptables 发展已经不会有该问题。若是还有问题的话,可以考虑如下配置:


[Copy to clipboard]CODE:
iptables -t nat -A POSTROUTING -d 192.168.1.1 -p tcp --dport 80 -s 192.168.1.0/24 -j SNAT --to 192.168.1.254

其中 192.168.1.254 也就是 NAT 主机对内的 ip,这样可以让该内部的192.168.1.1 看到的存取来源为 192.168.1.254,如此可以解决该问题。

=====

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
发表于 2007-01-14 18:01 |显示全部楼层
我压根就没听说什么重导,导什么啊.
我都发了1000遍了,你却不用搜索.我只好在发一遍.

另外还有别的解决办法,我没有更新到此帖上来,不过原理大同小异.

看到论坛内很多弟兄做了DNAT,外网正常访问,内网却无法访问.现将原因总结如下:
设网络结构如下:

外网某机器为W1,路由器为R1,内网服务器为S1,内网某机器为C1,设服务为80
地址分布如下:
R1:外(eth0):192.168.0.5 内(eth1):192.168.1.254
S1:192.168.1.5
C1:192.168.1.8

原因如下:
外网为什么能成功:
当W1以某IP端口80访问R1的外网地址192.168.0.5时,数据包到达192.168.0.5的接口eth0,ROS根据DNAT规则做了到S1 192.168.1.5的转发,S1 192.168.1.5收到来自某IP的包后S1会发出正确的相应,此响应的目的IP为W1的IP,根据默认网关(R1的eth1)192.168.1.254规则把回应包发到R1,因为R1先前DNAT的关系(有DNAT的记录),R1回做一个反方向的NAT转发,从而数据包能够正确的到达W1,因此能够正确通信。
内网为什么不能成功:
1、        DNAT规则是针对eth0口配置的:
设R1的DNAT规则:iptables –t nat –A PREROUTING –i eth0 –p tcp –m tcp –d 192.168.0.5 –dport 80 –j DNAT –-to-destinstion 192.168.1.5
当C1以192.168.0.5为目的IP访问80服务的时候,数据包从192.168.1.254口传入,R1根据路由规则,会把目的192.168.0.5的地址直接送到上层接口,而不会经过R1为eth0接口配置的DNAT规则,那么此时192.168.0.5开了80服务了吗?很显然没有,因此无法访问。

2、        DNAT的规则是全局的:
设R1的DNAT规则:iptables –t nat –A PREROUTING –p tcp –m tcp –d 192.168.0.5 –dport 80 –j DNAT –-to-destinstion 192.168.1.5
当C1以192.168.0.5为目的IP访问80服务的时候,数据包从192.168.1.254口传入,R1根据DNAT规则会把此数据包DNAT到正确的S1服务器192.168.1.5,当S1收到包的时候S1会根据自己的路由表不经过R1的转发而会直接把数据发到C1,因为C1和S1是在同一个网络,这时候C1回收到S1的回应,按说此时应该能正常通信。但不幸的是我们忽略了源IP的问题。C1是把数据包发给的是R1的外网IP 192.168.0.5,而收到的IP的源地址却是S1的IP192.168.1.5,虽然数据包的除IP外所有的都是正确的,但C1仍然不会接受,会把这个包丢弃的。因此通信还是无法进行。

解决办法:
1、        从DNS入手,在内网设置自己的DNS,或者编辑client的hosts表把S1的地址不要解析成外网的IP,这样就变成内网的通信,还不占用ROS的带宽。这是我首推的方法。
2、        如果一定要走ROS,首先你要为每个可能进入的接口配置相应的DNAT策略,当然使用我上面举例的全局策略就完全可以的,那么我们下面应该如何设置呢?又有两种情况:
1)        如果可以把服务器放到一个单独的网段请你及时这样做。因为这样可以避免攻击,便于控制等等好处N多了。麻烦就是需要ROS多加一个网卡当然如果你配置多地址的话,网卡都可以省了,不过这么省不太好吧。当然还需要配置正确的SNAT。
2)        有些人说我就不能放到单独的网段,那我也有办法,这是我最不赞成的方法,就是请你删掉S1上到192.168.1.0网络的路由表项目,这样会强制S1到C1的数据包走R1,这样R1就可以实施相反的转换,当然也就可以正常通信了。
route del –net 192.168.1.0 netmask 255.255.255.0 gw * dev eth1


以上是我对所谓的回流问题的个人见解。你看后有3种情况:
1、        写的不好没法看,或我都知道了不用看,请别拿石头丢我,我很脆弱。不过有错误尽管提,我很虚心。
2、        和你想的差不多,那恭喜你,我先写出来了。
3、        看不懂。没法子,我语文很差,逻辑很差,英文很差。你将就将就吧。

最后请原谅我不能提供相应的ROS命令,因为这个东西我实在不懂,我只能提供IPTABLES和标准的LINUX命令。

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
发表于 2007-01-14 20:59 |显示全部楼层
原帖由 wolf1980 于 2007-1-14 16:19 发表
上网方式是adsl,通过端口映射访问内网机器,从而开放web服务,公网访问可以,内网不能访问,配置如下:

端口映射
/sbin/iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80  -j DNAT --to 192.168.1.253: ...


将如下代码:
端口映射
/sbin/iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80  -j DNAT --to 192.168.1.253:80

这样解决不行
/sbin/iptables -t nat -A POSTROUTING -d 192.168.1.253 -p tcp --dport 80 -s 192.168.1.0/24 -j SNAT  192.168.1.1


改成如下代码或许可以
/sbin/iptables -t nat -A PREROUTING -s ! 192.168.1.253  -p tcp --dport 80 -j DNAT --to 192.168.1.253:80
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE

[ 本帖最后由 枫影谁用了 于 2007-1-15 07:57 编辑 ]

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
发表于 2007-01-14 21:01 |显示全部楼层
原帖由 ssffzz1 于 2007-1-14 18:01 发表
我压根就没听说什么重导,导什么啊.
我都发了1000遍了,你却不用搜索.我只好在发一遍.

另外还有别的解决办法,我没有更新到此帖上来,不过原理大同小异.

看到论坛内很多弟兄做了DNAT,外网正常访问,内网却无法 ...


你说了这么多,辛苦.

能帮忙测试一下我8楼回的贴再说吗?呵呵,你火气很大嘛!

或许你没有注意到iptables,nat里有些东西不用你说的这么麻烦,当然用你说的当然也可以解决,只是杀蚊用牛刀.

[ 本帖最后由 枫影谁用了 于 2007-1-14 21:04 编辑 ]

论坛徽章:
0
发表于 2007-01-14 22:39 |显示全部楼层
重导


我的分析:
重——重复,重新,重……
导——导向,指导,导……

重新,re-
导向,direct

再联系上下文:ICMP <重导>...

那么我的意见是:ICMP redirect

通常译为:ICMP 重定向

----
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP