关于 iptables 的问题

2016-01-04 17:59:38 +08:00
 Counter

开机成功执行脚本 iptables.sh ,脚本内容如下:
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 端口,为何可以 SSH 连接?哪里出问题了吗?

3861 次点击
所在节点    Linux
29 条回复
boro
2016-01-04 18:31:34 +08:00
是不是没设置重启后,规则不失效。
ayouwei
2016-01-04 18:33:45 +08:00
iptables-save 有什么输出?
GNiux
2016-01-04 18:49:03 +08:00
INPUT ACCEPT?
哈哈
GNiux
2016-01-04 18:51:16 +08:00
@GNiux 不好意思,看错
tinkerer
2016-01-04 18:55:10 +08:00
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
这句决定了已建立的连接不会断开
Counter
2016-01-04 19:01:23 +08:00
@boro 有生效的,去掉下面两条,再开机执行脚本,就无法连接了
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

@ayouwei 执行 iptables-save -t filter 的结果如下
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

@tinkerer 但是默认是 DROP 的,没有开放端口,应该是无法建立连接才对
ayouwei
2016-01-04 19:51:38 +08:00
那么规则应该是符合预期的, 估计 iptables 模块就没有生效;
ryd994
2016-01-04 20:09:42 +08:00
你不会是从本地连吧……
本地连走 lo 当然不受限制
Counter
2016-01-04 20:31:21 +08:00
@ayouwei 去掉最后两条规则就连不上了。。。
@ryd994 不是从本地连
Mithrandir
2016-01-04 21:26:16 +08:00
1. 又不是路由器, FORWARD 链直接 drop 就好
2. 如果是本机连接,直接匹配 INPUT 链的第一条规则走 lo 了
3. 如果不是本地连接,已经连接的不会受影响,连接可能建立在 iptables 服务开启之前或者以上命令执行之前。
4. 用开机脚本也太蛋疼了吧,最好直接修改配置文件
ryd994
2016-01-05 03:29:53 +08:00
@Counter 那你确定一下到底是那一条的作用啊
去掉其中一条试试看
Counter
2016-01-05 06:03:56 +08:00
@ryd994
@Mithrandir
@ayouwei
是下面那条的 ESTABLISHED 起作用
tempdban
2016-01-05 08:59:02 +08:00
楼上不说了吗,已建立的链接不会断开。
gulucn
2016-01-05 09:07:14 +08:00
之前在 vps 测试过,好像去掉
-A INPUT -i lo -j ACCEPT
就可以生效。
Counter
2016-01-05 09:56:58 +08:00
@ryd994
@Mithrandir
@ayouwei
@gulucn
怀疑是 vps 上装的 net_speeder 有问题,但应该不是后门,跟它的发包机制有关,规则是没问题的
具体表现为保持上面的规则不变,关闭 net_speeder , SSH 怎么也连接不上,开启 net_speeder , SSH 就连上了,有条件的请帮忙测试下
JerningChan
2016-01-05 10:01:03 +08:00
这不是很正常吗?
你的 input 都 accept 了呀
-A INPUT -j REJECT --reject-with icmp-host-prohibited
你加上这句试试
Counter
2016-01-05 10:13:34 +08:00
@JerningChan 默认是 DROP 的, iptables -P INPUT DROP
在主贴的规则基础上加上 16 楼这条,关闭 net_speeder,SSH 连接不上,开启 net_speeder,SSH 连上了
ryd994
2016-01-05 10:25:38 +08:00
@Counter
@JerningChan 说的做法可以解决你的问题,但问题不是他所说的那样。
iptables 对 ESTABLISHED 的定义并不是连接已经完成握手,而是之前见过相同连接的包。 netspeeder 对入站的连接也会双倍。第一个包确实 drop 了,第二个包 iptable 已经见过,所以允许了。然而因为是复制包,所以两个包中都是 syn ,任何一个都可以建立连接。

如果用 reject 的话,因为远端机器已经收到 rst 包,所以连接终止。即使你的机器返回 synack ,对方也不会处理。但是如果有人知道你是这样做的话,还是很容易绕过这个的。因为他只要 drop rst 包就行。

靠谱的解决也很简单:不要双倍 syn 就好了
'tcp[tcpflags] & tcp-syn == 0'
不过这样不能过滤 ipv6 ,偷懒不想查了,你要用的话自己查一下 tcpdump 怎么 dump ipv6 的 syn ,逻辑反过来就行。
ryd994
2016-01-05 10:30:46 +08:00
-A INPUT -m state --state RELATED,ESTABLISHED ! --syn -j ACCEPT
这样应该也可以
Counter
2016-01-05 10:55:02 +08:00
@ryd994 命令不加-p tcp 会报错,即应该是 iptables -A INPUT -m state --state RELATED,ESTABLISHED -p tcp ! --syn -j ACCEPT ,执行后开启 net_speeder 依旧可以 SSH 连接。。。看来 net_speeder 有个很隐蔽的坑

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

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

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

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

© 2021 V2EX