Gallop_hu 发表于 2014-07-11 21:41

iptables 端口转发,请赐教

环境是这样子的:
电脑A :192.168.1.10
电脑B :192.168.1.11
电脑C :192.168.1.12
现在电脑A上有个服务,端口是8000, 在电脑B和C上都能使用telnet直接连接,现在我要将电脑B开启端口转发,将C的请求转发到A上去。
我在电脑B上进行了一下几个配置
------------------------------------------------------------
1、sysctl -w net.ipv4.ip_forward=1    //开启转发

2   iptables -I FORWARD -p tcp -s 192.168.1.10 -j ACCEPT   //允许转发从电脑A过来的数据
3    iptables -I FORWARD -p tcp -s 192.168.1.12 -j ACCEPT   //允许转发从电脑C过来的数据

4   iptables -t nat PREROUTING -p tcp -s 192.168.1.10 -j DNAT --to 192.168.1.12   //将电脑A发送过来的数据转发到电脑C
5   iptables -t nat PREROUTING -p tcp -s 192.168.1.12 -j DNAT --to 192.168.1.10   //将电脑C发送过来的数据转发到电脑A

6   service iptables save      //保存配置
7   service iptables restart   //重启服务

-------------------------------------------------------------
关键是我用电脑C(IP:12)去telnet 电脑B(IP:11)的8000端口,根本就不是我预想的效果,请各位大神赐教,我是不是哪儿理解错了?


PS:当我在电脑B上开启监听8000端口的时候,如果不配置第4条命令,我在电脑C上是可以telnet上去的。配置上第四条就不行了,说明PREROUTING是起了作用的,但苦恼的是最终不是我想要的结果。

附上系统版本信息:
LSB Version:    :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID: CentOS
Description:    CentOS release 6.5 (Final)
Release:      6.5
Codename:       Final

linux内核版本信息:
Linux hn.kd.ny.adsl 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

iptables版本信息:
iptables v1.4.7

Gallop_hu 发表于 2014-07-11 21:46

自己顶起来,希望大牛来帮助啊,感激不尽

phanx 发表于 2014-07-11 23:26

本帖最后由 phanx 于 2014-07-11 23:31 编辑

回复 1# Gallop_hu


    Gallop_hu 发表于 2014-07-11 21:41 static/image/common/back.gif
1、sysctl -w net.ipv4.ip_forward=1    //开启转发

2   iptables -I FORWARD -p tcp -s 192.168.1.10 -j ACCEPT   //允许转发从电脑A过来的数据
3    iptables -I FORWARD -p tcp -s 192.168.1.12 -j ACCEPT   //允许转发从电脑C过来的数据

4   iptables -t nat PREROUTING -p tcp -s 192.168.1.10 -j DNAT --to 192.168.1.12   //将电脑A发送过来的数据转发到电脑C
5   iptables -t nat PREROUTING -p tcp -s 192.168.1.12 -j DNAT --to 192.168.1.10   //将电脑C发送过来的数据转发到电脑A

6   service iptables save      //保存配置
7   service iptables restart   //重启服务



你的做法在于不应该做第二条PREROUTING的动作,而应该做POSTROUTING,把A发往C的数据改为B发往C。这样C回包的时候就会回给B。
然后,B的iptables就知道做NAT回包处理了。 B会将C发回的数据包翻译成B发往A的数据包。
FORWARD里面,针对到C的数据包允许三个状态,到A的数据包就只允许两个状态。

iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.1.10 -d 192.168.1.11 --dport 8000 -j ACCEPT

iptables -t nat -A PREROUTING -p tcp -s 192.168.1.10 -d 192.168.1.12 --dport 8000 -j DNAT --to-destination 192.168.1.12:8000
iptables -t nat -A POSTROUTING -p tcp -s 192.168.1.10 -d 192.168.1.12 --dport 8000 -j SNAT --to-source 192.168.1.11


iptables -A FORWARD -p tcp -d 192.168.1.12 --dport 8000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -d 192.168.1.10 --sport 8000 -m state --state ESTABLISHED,RELATED -j ACCEPT


呵呵,巧了,正好Linux版面也有这么个问题,你们是一个人呢,还是凑巧都遇到这个问题?

http://bbs.chinaunix.net/thread-4145552-1-1.html




Gallop_hu 发表于 2014-07-13 17:20

回复 3# phanx


不是同一个人的,非常感谢你的解答,我先试试,看来我对这个的理解还是有偏差,非常感谢:em02:

Gallop_hu 发表于 2014-07-13 17:55

回复 3# phanx


非常感谢,确实是可以了,再来说说我的理解,高兴啊。


页: [1]
查看完整版本: iptables 端口转发,请赐教