. : : ClassiClub ForuM : : .

会员中心 论坛帮助 日历事件 标记论坛已读
返回   精品技术论坛 » 技术论坛 » 『软件使用』

『软件使用』: 电脑软件推荐, 电脑软件使用, 经验分享



发表新主题 回复
 
主题工具
一平
 
一平 的头像
核心会员
 
资 料:
注册日期: Aug 2000
帖子: 3,590 声望值: 3
精华: 1,解答: 19
#1 旧 2021-05-29, 21:54:41 默认 已解答: 【求助】如何使用iptables 做端口转发?
一平 当前离线  

iptables 做转发,规则很简单。

但是这两天发现一个情况,真实服务的端口不能对外屏蔽。

现在就是这个需求:
CentOS6系统,有个服务端口1200,现在不能修改端口,但又希望修改客户端访问时的端口为9999。

如果系统没有防火墙,用iptables做redirect规则或者DNAT规则都可以。客户端访问服务器的9999端口时,访问请求会被转发跳转到1200端口。从netstat查看时,客户端和服务器端实际建立的连接,也是到1200端口,而不是9999端口。

如果启动系统防火墙,用iptables 规则,把1200端口对外访问的请求给屏蔽了……结果客户端再访问9999端口也不行了。即使是DNAT+SNAT都不行……


积极的人像太阳,照到哪里哪里亮;消极的人像月亮,初一十五不一样。
回复时引用此帖
最佳解答为:tacoal
引用:
作者: 一平 查看帖子
iptables 做转发,规则很简单。

但是这两天发现一个情况,真实服务的端口不能对外屏蔽。

现在就是这个需求:
CentOS6系统,有个服务端口1200,现在不能修改端口,但又希望修改客户端访问时的端口为9999。

如果系统没有防火墙,用iptables做redirect规则或者DNAT规则都可以。客户端访问服......
防火墙把1200堵住肯定是不行的。因为DNAT是发生在遍历防火墙规则之前
你要做的是把堵1200端口的防火墙规则放在DNAT之前,也就是prerouting链里,而不是通常防火墙所在的input链里
LeoShadow
 
LeoShadow 的头像
超级会员
 
资 料:
注册日期: Apr 2002
帖子: 1,062 声望值: 3
精华: 0
#2 旧 2021-05-29, 22:35:01 默认
LeoShadow 当前离线  

iptables的设置直接在图形界面的firewall上设置可能更简单些,在虚拟机上测试了过,只要做两条规则就符合要求了吧。
1.只要打开9999端口
2.做个9999到1200的端口转发 port forwarding

此帖于 2021-05-31 14:35:01 被 LeoShadow 编辑. . 原因: 订正错误


授之以鱼不如授之以渔
回复时引用此帖
hefish
 
hefish 的头像
超级会员
 
资 料:
注册日期: Aug 2001
帖子: 1,379 声望值: 2
精华: 0,解答: 12
#3 旧 2021-05-29, 22:58:39 默认
hefish 当前离线  

你可以装个haproxy,然后从 9999引入连接,然后转发到127.0.0.1:1200 。
回复时引用此帖
zephuros
 
zephuros 的头像
超级会员
 
资 料:
注册日期: Dec 2000
帖子: 1,094 声望值: 3
精华: 0
#4 旧 2021-05-30, 05:56:01 默认
zephuros 当前离线  

没理解错的话,(假设)你的服务器IP是 192.168.0.100, 应用运行在 TCP/1200,但是希望客户访问的是 192.168.0.100:9999

现在如果你做
> 用iptables 规则,把1200端口对外访问的请求给屏蔽了……

那么 192.168.0.100:9999 -> :1200 的转发就被拦截了,试试看白名单本机的对外地址 (即允许 192.168.0.100:* -> 192.168.0.100:1200)。
回复时引用此帖
一平
 
一平 的头像
核心会员
 
资 料:
注册日期: Aug 2000
帖子: 3,590 声望值: 3
精华: 1,解答: 19
#5 旧 2021-05-30, 09:26:43 默认
一平 当前离线  

引用:
作者: zephuros 查看帖子
没理解错的话,(假设)你的服务器IP是 192.168.0.100, 应用运行在 TCP/1200,但是希望客户访问的是 192.168.0.100:9999现在如果你做> 用iptables 规则,把1200端口对外访问的请求给屏蔽了……那么 192.168.0.100:9999 -> :1200 的转发......
如果我没有限制外部IP对本机1200端口的访问,又设置了一个本机9999对1200的转发,那么实测的结果是,虽然外部访问的是本机9999端口,但是最后建立真正建立的连接,还是外部IP对本地1200端口的连接。

我虽然iptables 限制的是外部IP对本机1200端口的访问,结果外部IP对9999端口的访问也无法通了。虽然本机对本机的端口访问放开了访问规则。
本机到本机的端口转发已经不是从物理网卡走的了。所以我的iptables屏蔽规则,还特意加上了-i eth0 --dport 1200来进行限制,但还是可以确认只要加上这一条,外部访问本机9999也不行

如果在外部IP和本机之间,还有一个独立的防火墙设备来做端口转发,这个问题就不存在,自己想保护的端口是没问题的。
如果在外部IP和本机之间,没有其他端口转发设备,就靠本机的iptables规则来做端口转发,自己想保护的端口还不能对外屏蔽。

所以我现在想了解,有啥解决办法。

此帖于 2021-05-30 09:36:30 被 一平 编辑. .
回复时引用此帖
tacoal
 
tacoal 的头像
终极会员
 
资 料:
注册日期: Aug 2000
帖子: 10,399 声望值: 3
精华: 0,解答: 30
#6 旧 2021-05-30, 13:03:31 默认
tacoal 当前离线  

引用:
作者: 一平 查看帖子
iptables 做转发,规则很简单。

但是这两天发现一个情况,真实服务的端口不能对外屏蔽。

现在就是这个需求:
CentOS6系统,有个服务端口1200,现在不能修改端口,但又希望修改客户端访问时的端口为9999。

如果系统没有防火墙,用iptables做redirect规则或者DNAT规则都可以。客户端访问服......
防火墙把1200堵住肯定是不行的。因为DNAT是发生在遍历防火墙规则之前
你要做的是把堵1200端口的防火墙规则放在DNAT之前,也就是prerouting链里,而不是通常防火墙所在的input链里
回复时引用此帖
ooev
 
ooev 的头像
高级会员
 
资 料:
注册日期: Feb 2002
帖子: 842 声望值: 3
精华: 0,解答: 3
#7 旧 2021-05-31, 00:45:33 默认
ooev 当前离线  

"最后建立真正建立的连接,还是外部IP对本地1200端口的连接"这是症结所在吧

客户端如果真的能指定9999那你就永远不应该看到1200
回复时引用此帖
hpcex
 
hpcex 的头像
合作伙伴
 
资 料:
注册日期: Dec 2004
帖子: 5,401 声望值: 6
精华: 6,解答: 11
#8 旧 2021-05-31, 08:36:26 默认
hpcex 当前离线  

是不是可以用gost来做?
回复时引用此帖
一平
 
一平 的头像
核心会员
 
资 料:
注册日期: Aug 2000
帖子: 3,590 声望值: 3
精华: 1,解答: 19
#9 旧 2021-05-31, 13:20:29 默认
一平 当前离线  

引用:
作者: tacoal 查看帖子
防火墙把1200堵住肯定是不行的。因为DNAT是发生在遍历防火墙规则之前
你要做的是把堵1200端口的防火墙规则放在DNAT之前,也就是prerouting链里,而不是通常防火墙所在的input链里
一句话说到精髓,点醒了我。

我现在在input里面,放开了1200端口。
然后再在nat里面,prerouting 把1200端口重定向到一个不存在的9527端口。prerouting 把9999端口重定向到1200端口。

现在的结果就是:
我连接9999端口,这时候被重定向到1200端口,因为input 1200是允许的,所以可以建立连接。查看连接,确实是和1200端口建立的连接。
但是如果我直接连1200端口,访问请求就会被重定向到不存在的端口了,测试显示连不通。

达到了我保护端口的目的。而且我这样测试了,SSH 22端口也被我重定向了,没有任何问题。
这种不用修改程序的重定向操作,很不错。
回复时引用此帖
闪亮
 
闪亮 的头像
终极会员
 
资 料:
注册日期: Aug 2001
帖子: 10,422 声望值: 7
精华: 2,解答: 17
#10 旧 2021-05-31, 14:40:45 默认
闪亮 当前离线  

引用:
作者: 一平 查看帖子
一句话说到精髓,点醒了我。

我现在在input里面,放开了1200端口。
然后再在nat里面,prerouting 把1200端口重定向到一个不存在的9527端口。prerouting 把9999端口重定向到1200端口。

现在的结果就是:
我连接9999端口,这时候被重定向到1200端口,因为input 1200......
prerouting 把1200端口重定向到一个不存在的9527端口。

这个意义何在?这个完全不用呀。


宝贝宝贝笑一笑 笑容其实很美妙
只要天天没烦恼 其他一切不重要
回复时引用此帖
jimmy_dong
 
jimmy_dong 的头像
管理员
 
资 料:
注册日期: Aug 2000
帖子: 5,217 声望值: 9
精华: 2,解答: 86
#11 旧 2021-05-31, 14:58:14 默认
jimmy_dong 当前离线  

真实端口和对外端口不一致的,用Haproxy或者ngix才是正解。

NAT,要做就在路由器或者防火墙上做,不要在本机上做。

不要只想着怎么简单方便。其他人接手时,不了解这些弯弯绕,很难继续维护。


~~呵呵~~


……你呀,考虑一下吧,要快一点,你知道,肚子很快又饿了。 jimmy_dong@sina.com Oicq:816937

如果失去了“呵呵”,生活会是怎样?
回复时引用此帖
一平
 
一平 的头像
核心会员
 
资 料:
注册日期: Aug 2000
帖子: 3,590 声望值: 3
精华: 1,解答: 19
#12 旧 2021-05-31, 19:00:14 默认
一平 当前离线  

引用:
作者: 闪亮 查看帖子
prerouting 把1200端口重定向到一个不存在的9527端口。

这个意义何在?这个完全不用呀。
我这个案例里面,1200不是业务端口,是系统维护端口。就是不想把维护端口暴露在互联网上,就像不想把3389暴露在互联网上一样。如果不做这一条规则,则1200端口和9999端口一样,都是可以被访问的。
你试试把你的网上服务器的3389端口或者22端口对外开放,然后你看看日志去,每天的暴力破解日志都够你翻半天了。所以我把真实维护端口这样修改后,维护日志就会清爽很多。

引用:
作者: jimmy_dong 查看帖子
真实端口和对外端口不一致的,用Haproxy或者ngix才是正解。

NAT,要做就在路由器或者防火墙上做,不要在本机上做。

不要只想着怎么简单方便。其他人接手时,不了解这些弯弯绕,很难继续维护。


~~呵呵~~
系统直接部署了公网IP了,甚至连一个后台安全组都没有的。如果系统环境前面还能配置防火墙,我又何尝不想在路由器或者防火墙上做呢?条件所限才在这个问题上转圈子的。
回复时引用此帖
tacoal
 
tacoal 的头像
终极会员
 
资 料:
注册日期: Aug 2000
帖子: 10,399 声望值: 3
精华: 0,解答: 30
#13 旧 2021-05-31, 23:59:10 默认
tacoal 当前离线  

引用:
作者: 闪亮 查看帖子
prerouting 把1200端口重定向到一个不存在的9527端口。

这个意义何在?这个完全不用呀。
这个就是把原生对1200端口的访问堵住

引用:
作者: 一平 查看帖子
一句话说到精髓,点醒了我。

我现在在input里面,放开了1200端口。
然后再在nat里面,prerouting 把1200端口重定向到一个不存在的9527端口。prerouting 把9999端口重定向到1200端口。

现在的结果就是:
我连接9999端口,这时候被重定向到1200端口,因为input 1200......
这个变通的办法不错,既可以把原生访问1200的端口堵住,又可以用通用的防火墙工具编写规则,保持系统的可维护性--免得使用非寻常的在prerouting里加防火墙规则的方法。

当然,副作用就是实际原生对1200访问的包在input链才被drop掉,会多用一点点CPU,对不是非常繁忙的服务器来说没有影响
回复时引用此帖
littlefat
 
littlefat 的头像
热心会员
 
资 料:
注册日期: Jul 2001
帖子: 3,572 声望值: 5
精华: 2,解答: 7
#14 旧 2021-06-01, 08:32:52 默认
littlefat 当前离线  

求建立规则的命令行原文。。。


Little@FAT :)
回复时引用此帖
一平
 
一平 的头像
核心会员
 
资 料:
注册日期: Aug 2000
帖子: 3,590 声望值: 3
精华: 1,解答: 19
#15 旧 2021-06-01, 14:38:08 默认
一平 当前离线  

引用:
作者: littlefat 查看帖子
求建立规则的命令行原文。。。
以下命令适用于CentOS6环境

iptables -A INPUT -p tcp --dport 1200 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 1200 -j REDIRECT --to-ports 9527
iptables -t nat -A PREROUTING -p tcp --dport 9999 -j REDIRECT --to-ports 1200
service iptables save
service iptables restart

以下命令适用于CentOS7环境
firewall-cmd --permanent --zone=public --add-port=1200/tcp
firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -p tcp --dport 1200 -j REDIRECT --to-ports 9527
firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -p tcp --dport 9999 -j REDIRECT --to-ports 1200
firewall-cmd --reload

此帖于 2021-06-09 09:57:37 被 一平 编辑. .
回复时引用此帖
发表新主题 回复

主题工具

论坛规则  发帖规则
不可以发表主题
不可以回复帖子
不可以上传附件
不可以编辑自己的帖子
论坛启用 vB 代码
版面启用 表情符号
版面启用 [IMG] 代码
版面禁用 HTML 代码


所有时间均为北京时间, 现在的时间是 06:44:42.

本论坛带宽由迅通网络提供
SSL证书由TrustAsia提供

Copyright © 2000 - 2019 ClassiClub Forum All Rights Reserved.
粤ICP备09123456号