请教一个关于 iptables 的问题

2017-01-05 16:32:16 +08:00
 xiaoz

假如 ss 端口监听为 9000 , iptables 放行 9000 后, telnet 测试 9000 正常,但是 ss 连接超时,那么 service iptables stop 关闭后, ss 连接正常,应该就是 iptables 规则导致,但是又无法找到具体原因。完整规则如下:

*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:syn-flood - [0:0]
-A INPUT -p udp -m state --state NEW -m udp --dport 9000:9999 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9000:9999 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 20000:50000 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 20000:50000 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p icmp -m limit --limit 1/sec --limit-burst 10 -j ACCEPT
-A INPUT -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn-flood
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A syn-flood -p tcp -m limit --limit 3/sec --limit-burst 6 -j RETURN
-A syn-flood -j REJECT --reject-with icmp-port-unreachable
COMMIT


再次说明一下,端口 telnet 是正常的,但是 ss 无法使用,关闭 iptables 后正常。

3291 次点击
所在节点    Linux
29 条回复
Devin
2017-01-05 19:35:13 +08:00
开启 iptables 日志记录(我最近的主题刚好有),看日志排查
b1eberg0n
2017-01-05 23:18:50 +08:00
INPUT DROP 改为 ACCEPT?
xiaoz
2017-01-05 23:21:24 +08:00
@b1eberg0n 这样会不会很危险?
INPUT DROP 是先拒绝所有,再放行指定,如果改成 ACCEPT 就是先允许所有可。
b1eberg0n
2017-01-05 23:26:09 +08:00
弄这么严格 是生产服么?
拒绝所有的话可能还要放行 input --sport 80 /443
iCyMind
2017-01-05 23:44:13 +08:00
为什么写得那么啰嗦,试试以下:

iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#ssh port: 11235
iptables -A INPUT -p tcp --dport 9000 -j ACCEPT
iptables -A INPUT -p udp --dport 9000 -j ACCEPT
iCyMind
2017-01-05 23:45:43 +08:00
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

忘了 ssh....希望楼主还没看到上一条吧
kuretru
2017-01-05 23:48:13 +08:00
把-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 放到 ss 前面
lcdtyph
2017-01-05 23:53:04 +08:00
指定协议不是-p 吗= =||
-A INPUT -p udp -m state --state NEW -p udp --dport 9000:9999 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -p tcp --dport 9000:9999 -j ACCEPT
这样?
iCyMind
2017-01-06 00:03:11 +08:00
你的规则问题可能在于,发往服务器 9000 端口的 udp 数据被丢弃了。
因为 udp 是无状态的,跟 udp 9000 端口有关的两条规则它都匹配不上:
-A INPUT -p udp -m state --state NEW -m udp --dport 9000:9999 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
raysonx
2017-01-06 00:20:55 +08:00
@iCyMind 目测楼主执行 iptables -F 后,已被挡在 ssh 外面 😏
iCyMind
2017-01-06 00:41:23 +08:00
@raysonx good jop? 2333
shiji
2017-01-06 00:57:28 +08:00
@raysonx 哈哈,我也想说这个。都是被坑过的人啊
des
2017-01-06 06:05:21 +08:00
@shiji 话说就没人先写个比如半个小时关闭防火墙的定时任务?
同被坑过
ryd994
2017-01-06 07:06:19 +08:00
@des 怕什么嘛,大不了拔线重启
@iCyMind
@raysonx
xiaoz
2017-01-06 09:09:46 +08:00
@des 这是一个好办法
xiaoz
2017-01-06 09:10:19 +08:00
@raysonx 昨天改错了规则,然后就被挡在外面了,最后通过控制台进入把 iptables 停了才进去。
raysonx
2017-01-06 10:42:46 +08:00
@ryd994 当年维护学校机房的服务器,没有远程控制卡,被挡在外面只能找领导批条子进机房手动重启。。。。
jimzhong
2017-01-06 16:58:58 +08:00
既然 telnet 正常说明外面是可以访问 TCP9000 的,把 DROP 的日志打出来看看把。
ryd994
2017-01-07 02:39:28 +08:00
@iCyMind 你说 UDP 无状态所以不匹配是不对的
iptables 里的 new 和 established 不是连接意义上的,而是之前是否见过相关包。没见过就是 new 。是以四元组判断。所以才有使用 net-speeder 后 iptables 无效的问题。
iCyMind
2017-01-07 09:26:17 +08:00
@ryd994 我去看了下, 真的如你所说, 谢谢纠正.
或许楼主的规则错在 -m udp --dport 9000:9999 和 -m tcp --dport 9000:9999
要匹配某协议的端口号, 一般都是这么写吧:
-p udp --dport 9000:9999

文档里没见有 -m tcp 这种写法
http://ipset.netfilter.org/iptables-extensions.man.html#lbCL

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/332448

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX