免费注册 查看新帖 |

Chinaunix

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

请教关于IPTABLES内外网端口映射到同一内网主机的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-21 22:34 |只看该作者 |倒序浏览
请教
如题:内网一SMTP & POP3 服务主机,ip:192.168.0.100
内网192.168.0.0/24通过linux网关nat上网
linux外网ip为10.0.0.1 & 10.0.0.2 接口为:eth0
内网ip  为 192.168.0.1 接口为 eth1
10.0.0.1对应dns为mail.domain.com
目的:在不更改内网dns的情况下,使内网和外网可以同时使用域名mail.domain.com访问内网smtp & pop3 服务,外网访问已经通过,但是内网的网络目的地址转换后(PREROUTING)感觉会出现“叫李四,张三回答的情况”,请问此问题通过iptables脚本怎样解决?

脚本关键语句如下:



  1. #nat POSTROUTING
  2. iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.0/24 -d ! 192.168.0.0/24 -j SNAT  --to-source 10.0.0.1-10.0.0.2:1024-32000
  3. iptables -t nat -A POSTROUTING -p udp -s 192.168.0.0/24 -d ! 192.168.0.0/24 -j SNAT  --to-source 10.0.0.1-10.0.0.2:1024-32000

  4. #nat PREROUTING
  5. #smtp and pop3 dnat to 252
  6. iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp -d 10.0.0.1/32 --dport 110 -j DNAT --to-destination 192.168.0.100:110
  7. iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp -d 10.0.0.1/32 --dport 25 -j DNAT --to-destination 192.168.0.100:25
复制代码


增加以下代码也解决不了问题

  1. #lan nat PREROUTING
  2. #lan smtp and pop3 dnat to 252
  3. iptables -t nat -A PREROUTING -i eth1 -p tcp -m tcp --dport 110 -j DNAT --to-destination 192.168.0.100:110
  4. iptables -t nat -A PREROUTING -i eth1 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.0.100:25
复制代码


在192.168.0.100抓包,可以看到确实可以收到192.168.0.0/32 prerouting 过来的包
又试图增加以下代码:

  1. iptables -t nat POSTROUTING -p tcp -s 192.168.0.100 -d 192.168.0.0/24 --sport 110 -j SNAT --to-destination 10.0.0.1
复制代码

此句不符合道理,但是从192.168.0.100向192.168.0.0/32回应的问题,也就是10.0.0.1向192.168.0.0/32回应的问题怎样解决呢?
期望得到大家的帮助,先谢了。

论坛徽章:
0
2 [报告]
发表于 2006-03-22 00:43 |只看该作者
谢谢大家,已经解决:

  1. iptables -t nat -A POSTROUTING -d 192.168.0.100 -s 192.168.0.0/24 -p tcp --dport 110 -j SNAT --to 192.168.0.1
  2. iptables -t nat -A POSTROUTING -d 192.168.0.100 -s 192.168.0.0/24 -p tcp --dport 25 -j SNAT --to 192.168.0.1
复制代码

论坛徽章:
0
3 [报告]
发表于 2006-03-22 01:24 |只看该作者
TCP/110 其实不用做 POSTROUTING

论坛徽章:
0
4 [报告]
发表于 2006-03-26 18:52 |只看该作者
不错,对iptables的路由认识更深了。谢谢!

论坛徽章:
0
5 [报告]
发表于 2006-03-29 21:57 |只看该作者
请教白金

还是这个问题,又做了一个星期的测试.
发现 如果SNAT 的话,有些时候内网直接连接内网地址端口服务不能连接,例如:
telnet 192.168.0.100 22,竟然没有回应,有时候非常正常.
但是如果用MASQUERADE一直没有问题.
iptables -t nat POSTROUTING -p tcp -s 192.168.0.100 -d 192.168.0.0/24 --sport 110 -j MASQUERADE
不解?
同时还想请教一个问题.有一些文档说POSTROUTING链是在路由之后的.我做了一个实验和这个理论好象有一些冲突,也可能是我理解不够深入

环境:
linux slackware ,kernel 2.6.13,补丁过equal
if0 add:221.0.0.1
if1 add:218.0.0.1
if2 add:218.0.0.2
if3 add:192.168.0.1
如果在linux本地路由表中增加下静态路由
route add -net 10.88.0.0/16 gw 221.0.0.1

在iptables脚本中增加:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 0.0.0.0 -j SNAT --to 218.0.0.1-218.0.0.2

那么在192.168.0.0/24 网络中的任意终端运行下:
ping 10.88.0.254
如果10.88.0.254允许icmp ping.并且网络也正常,防火墙也允许icmp出入包.

数据请问是从哪个接口出去的呢? 是否"POSTROUTING链是在路由之后的"?

论坛徽章:
0
6 [报告]
发表于 2006-03-29 23:37 |只看该作者
原帖由 recoilest 于 2006-3-29 21:57 发表
请教白金

还是这个问题,又做了一个星期的测试.
发现 如果SNAT 的话,有些时候内网直接连接内网地址端口服务不能连接,例如:
telnet 192.168.0.100 22,竟然没有回应,有时候非常正常.
但是如果用MASQUERADE一直没有问题.
iptables -t nat POSTROUTING -p tcp -s 192.168.0.100 -d 192.168.0.0/24 --sport 110 -j MASQUERADE
不解?

我一般的做法是 SNAT 全部,DNAT 才是个别端口,过滤用 filter 表的 FORWARD
不会像你这样单独 SNAT 或者 DNAT 某个 IP 某个端口,这样很容易出问题
我的做法是 DNAT 某个,但 SNAT 一片,这样可以保证先通,之后才是用 filter 表的 FORWARD 去堵

同时还想请教一个问题.有一些文档说POSTROUTING链是在路由之后的.我做了一个实验和这个理论好象有一些冲突,也可能是我理解不够深入

环境:
linux slackware ,kernel 2.6.13,补丁过equal
if0 add:221.0.0.1
if1 add:218.0.0.1
if2 add:218.0.0.2
if3 add:192.168.0.1
如果在linux本地路由表中增加下静态路由
route add -net 10.88.0.0/16 gw 221.0.0.1

在iptables脚本中增加:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 0.0.0.0 -j SNAT --to 218.0.0.1-218.0.0.2

那么在192.168.0.0/24 网络中的任意终端运行下:
ping 10.88.0.254
如果10.88.0.254允许icmp ping.并且网络也正常,防火墙也允许icmp出入包.

数据请问是从哪个接口出去的呢? 是否"POSTROUTING链是在路由之后的"?

你要访问的是 10.88.0.0/16
而你的路由表里明确给出 route add -net 10.88.0.0/16 gw 221.0.0.1
你的网路卡上 if0 add:221.0.0.1
因此,只要满足这个 routing 的包,都会从 if0 出去
routing 之后才是 POSTROUTING,只是你将 source IP 改为了 218.0.0.1-218.0.0.2 而已

另外,你这里还有一个问题,if1 和 if2 一定是同一网段的 IP(因为就算是 252 的掩码,也要包含 0~3 共 4 个 IP)
因此,你的路由表里肯定会出现直通路由冲突的情况,也就是说,你的 if1/if2 实际有一块网卡是不能正常工作的

抛开这个问题,若 if1 与 if2 非同一网段,或者他们的直通路由在路由表中不冲突,那么 SNAT 相当于动态修改源地址

那么数据能不能回来呢?
10.88.0.254 被 ping 后,会向 source IP 返回 type 0 的 pong 包,此时若 10.88.0.254 没有路由可以到达 221.0.0.0/xx,那么你就无法 ping 通

论坛徽章:
0
7 [报告]
发表于 2006-03-30 09:32 |只看该作者
我一般的做法是 SNAT 全部,DNAT 才是个别端口,过滤用 filter 表的 FORWARD
不会像你这样单独 SNAT 或者 DNAT 某个 IP 某个端口,这样很容易出问题
我的做法是 DNAT 某个,但 SNAT 一片,这样可以保证先通,之后才是用 filter 表的 FORWARD 去堵

这样的做法也不错,我可以实验以下,多谢

实际情况中:
我的路由中默认路由是
default equalize
        nexthop via 218.0.0.254  dev eth1 weight 1
        nexthop via 218.0.0.254  dev eth2 weight 1

应该没有路由冲突的情况
谢谢你对"POSTROUTING链是在路由之后的"的解释,我明白了。

目前用用的是路由级别的负载均衡,应该是路由均衡.
同时还想请教一个问题 , 很多人讨论过 ,是 包级别的负载均衡

如果把iptables 打上nth补丁

iptables -t nat -A POSTROUTING -o eth1 -m nth --every 2 --packet 0 -j SNAT --to-source 218.0.0.1
iptables -t nat -A POSTROUTING -o eth2 -m nth --every 2 --packet 1 -j SNAT --to-source 218.0.0.2

从理论上是否就可以实现下载同时使用两条线路的带宽呢?
我没有实验过,在此先请教是否行的通.

论坛徽章:
0
8 [报告]
发表于 2006-03-30 10:31 |只看该作者
呵呵,其实如果路由自动均衡了的话,你使用 MASQUERADE 替代 SNAT 就好了啊
MASQUERADE 实际就是动态 SNAT,他根据路由状况选择 source IP 的地址
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP