免费注册 查看新帖 |

Chinaunix

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

iptables dnat实验的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-01 13:46 |只看该作者 |倒序浏览
A机eth0:172.16.64.201
B机eth0:172.16.64.202
现在想实现访问 http://172.16.64.202:8181
转到http://172.16.64.201

我是这样写的
iptables -t nat -A PREROUTING -p tcp --dport 8181 -j DNAT --to-destination 172.16.64.201:80

但访问失败
tcpdump的结果是这样的
[root@t-server root]# iptables -t nat -A PREROUTING -p tcp --dport 8181 -j DNAT --to-destination 172.16.64.201:80
[root@t-server root]# tcpdump host 172.16.64.201
tcpdump: listening on eth0
13:43:59.693562 arp who-has 172.16.64.201 tell 172.16.64.202
13:43:59.693757 arp reply 172.16.64.201 is-at 0:c0:9f:27:8a:c4
13:43:59.693767 zxxz.3779 > 172.16.64.201.http: S 2600244193:2600244193(0) win 65535 <mss 1460,nop,nop,sackOK> (DF)
13:43:59.694130 arp who-has 172.16.64.201 tell zxxz
13:44:02.556583 zxxz.3779 > 172.16.64.201.http: S 2600244193:2600244193(0) win 65535 <mss 1460,nop,nop,sackOK> (DF)
13:44:08.571895 zxxz.3779 > 172.16.64.201.http: S 2600244193:2600244193(0) win 65535 <mss 1460,nop,nop,sackOK> (DF)
13:44:20.641118 zxxz.3780 > 172.16.64.201.http: S 2777973927:2777973927(0) win 65535 <mss 1460,nop,nop,sackOK> (DF)
13:44:23.555382 zxxz.3780 > 172.16.64.201.http: S 2777973927:2777973927(0) win 65535 <mss 1460,nop,nop,sackOK> (DF)
13:44:29.570567 zxxz.3780 > 172.16.64.201.http: S 2777973927:2777973927(0) win 65535 <mss 1460,nop,nop,sackOK> (DF)
看不懂这些信息,是不是同一个子网内不能做dnat?如果想实现这样的功能应该怎么写?

论坛徽章:
0
2 [报告]
发表于 2006-11-01 14:17 |只看该作者
把a放在b后面可以
并列的不能把
nat原理看看

论坛徽章:
0
3 [报告]
发表于 2006-11-01 14:46 |只看该作者
原帖由 zxxz79 于 2006-11-1 13:46 发表
看不懂这些信息,是不是同一个子网内不能做dnat?如果想实现这样的功能应该怎么写?


这样封包回应错误,因为封包不会回应给原本的 linux nat 主机,回应封包失败.

解决方式补上:

  1. iptables -t nat -A POSTROUTING -p tcp -o eth0 -j MASQUERADE
复制代码


当然,后续你的 172.16.64.202 主机看到是由 172.16.64.201 来连线的,不是外面连线的。

若是你要 172.16.64.202 可以看到原本的 client ip,那你只有用 ip tunnel 来做,只是情况复杂太多。而且一般单纯的作法是绑上 ip,tunnel 一般没有针对特定的 port。

不过 ip tunnel 部份,你可以参考一下 linuxvirtualserver project 内,关于 "Virtual Server via IP Tunneling" 的方式来完成,可以达成更完备需求。

==

论坛徽章:
0
4 [报告]
发表于 2006-11-01 19:10 |只看该作者
按kenduest 的方法试了,不行.
主要也不是为了实现什么功能。只是在做dnat snat的时候如果我有公网ip的时候做就正常,如果是在内网同一段做就出现错误,对nat的理论还是不够了解。看了kenduest 的解说,明白了不少,现在正在看iptables的how to,希望可以弄明白原理。

论坛徽章:
0
5 [报告]
发表于 2006-11-01 19:44 |只看该作者
how-to里是这么说的
在我的例子中$LAN_BOX=172.16.64.200
$INET_IP=172.16.64.202

$HTTP_IP=172.16.64.201

  1. 包离开$LAN_BOX,去往$INET_IP。

  2. 包到达防火墙。

  3. 包被DNAT,而且还会经过其他的处理。但是包没有经过SNAT 的处理,所以包还是使用它自己的源地址,就是$LAN_BOX(译者注:这就是IP 传输包的特点,只根据目的地的不同改变目的地址,但不因传输过程中要经过很多路由器而随着路由器改变其源地址,除非你单独进行源地址的改变。其实这一步的处理和对外来包的处理是一样的,只不过内网包的问题就在于此,所以这里交待一下原因)。

  4. 包离开防火墙,到达HTTP服务器。

  5. HTTP服务器试图回复这个包。它在路由数据库中看到包是来自同一个网络的一台机子,因此它会把回复包直接发送到请求包的源地址(现在是回复包的目的地址),也就是$LAN_BOX。

  6. [b]回复包到达客户机,但它会很困惑,因为这个包不是来自它访问的那台机子。这样,它就会把这个包扔掉而去等待“真正”的回复包。[/b]

复制代码

但在我的例子中,我试图在访问http://172.16.64.202:8181的时候在$HTTP_IP=172.16.64.201上tcpdump,可是没发现任何包发到了$HTTP_IP=172.16.64.201 机上。
不解
现在不是所有的到$INET_IP=172.16.64.202上的8181的访问都已经被dnat到8080上了吗?
为什么没有包呢?
iptables -t nat -A PREROUTING -p tcp --dport 8181 -j DNAT --to-destination 172.16.64.201:80

论坛徽章:
0
6 [报告]
发表于 2006-11-02 04:44 |只看该作者
原帖由 zxxz79 于 2006-11-1 19:10 发表
按kenduest 的方法试了,不行.


依据你前后文来看,看起来你的 firewall rule 似乎不是只几行单纯内容而已。比方:

1. 你的 ipv4 forwarding 有没有开 ? /proc/sys/net/ipv4/ip_forward 内容 ?

2. iptables firewall 目前设定如何 ? iptables-save 执行后的内容 ?

不管如何,一般实务上我会建议请把规则简化后来测试之。

--

论坛徽章:
0
7 [报告]
发表于 2006-11-02 10:51 |只看该作者
我的rule就两行,没有启用 ip_forward
iptables -t nat -A PREROUTING -p tcp --dport 8181 -j DNAT --to-destination 172.16.64.201:80
iptables -t nat -A POSTROUTING --dst 172.16.64.202 -p tcp --dport 8181 -j SNAT --to-source 172.16.64.202

论坛徽章:
0
8 [报告]
发表于 2006-11-02 13:12 |只看该作者
解决了,来个总结:
重新整理了一下实验步骤,这次可以了,错就错在没有打开
/proc/sys/net/ipv4/ip_forward
之前就是原理上理解出现了问题
现在明白了,因为是在同一个局网,跟howto说的一样
去访问B 8181的时候B将地址进行DNAT,转向到了A机上的80端口上。
但转向的时候没有改写原地址,导致A收到的请求原地址$LAN_BOX,于是A直接将将数据包返回给$LAN_BOX,结果$LAN_BOX认为这个包是错误的因为他请求的是B机的8181端口,于是丢弃A发来的数据包,一直等待B的回应。
先开通ip_forward功能
echo 1 >/proc/sys/net/ipv4/ip_forward
所以这里可以用两种方法解决,就是地址伪装:
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j MASQUERADE
或者是
iptables -t nat -A POSTROUTING --dst 172.16.64.201 -p tcp --dport 8181 -j SNAT --to-source 172.16.64.202
目的都一样,将原地址改成是B机自己
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP