![仅当使用 conntrack 时,IPtables 才会阻止 SSH](https://linux22.com/image/730990/%E4%BB%85%E5%BD%93%E4%BD%BF%E7%94%A8%20conntrack%20%E6%97%B6%EF%BC%8CIPtables%20%E6%89%8D%E4%BC%9A%E9%98%BB%E6%AD%A2%20SSH.png)
错误
如您所见,工作配置和不工作配置之间的唯一区别是-m conntrack --ctstate NEW,ESTABLISHED,RELATED
。如果我使用-m conntrack --ctstate NEW,ESTABLISHED
它,它也不起作用...但为什么?!
经过几次测试,我注意到每个使用的规则conntrack
都不起作用...你能解释一下为什么iptables
只有当我使用时SSH 才会被阻止吗conntrack
?
谢谢 :-)
工作配置
/bin/bash #!/bin/bash 服务器IP地址=“XXXX” iptables -F iptables -X # 设置默认过滤策略 iptables -P 输入删除 iptables -P 输出接受 iptables -P 转发删除 # 允许先前的连接 iptables -A 输入 -m conntrack --ctstate 相关,已建立 -j 接受 iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # 允许环回流量不受限制 iptables -A 输入 -i lo -j 接受 iptables -A 输出 -o lo -j 接受 # 仅允许 ssh 传入 iptables -A 输入 -p tcp -s 0/0 -d ${SERVER_IP} --dport 22 -j 接受 iptables -A 输入 -p tcp -s 0/0 -d ${SERVER_IP} --dport 22 -j LOG --log-prefix “[接受输入][SSH]” # 确保没有任何东西从这个盒子里出来或出来 iptables -A INPUT -j LOG --log-prefix “[DROP INPUT][DEFAULT] ” iptables -A 输入 -j DROP
不起作用的配置
/bin/bash #!/bin/bash 服务器IP地址=“XXXX” iptables -F iptables -X # 设置默认过滤策略 iptables -P 输入删除 iptables -P 输出接受 iptables -P 转发删除 # 允许先前的连接 iptables -A 输入 -m conntrack --ctstate 相关,已建立 -j 接受 iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # 允许环回流量不受限制 iptables -A 输入 -i lo -j 接受 iptables -A 输出 -o lo -j 接受 # 仅允许 ssh 传入 iptables -A INPUT -p tcp -s 0/0 -d ${SERVER_IP} --dport 22 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A 输入 -p tcp -s 0/0 -d ${SERVER_IP} --dport 22 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j LOG --log-prefix “[接受输入][SSH]” # 确保没有任何东西从这个盒子里出来或出来 iptables -A INPUT -j LOG --log-prefix “[DROP INPUT][DEFAULT] ” iptables -A 输入 -j DROP
[编辑]
我如何确定 conntrack 参与其中?
因为在日志文件中我可以看到类似这样的内容:
[DROP][INPUT] IN=eth0 OUT= MAC=0c:c4:...:00 SRC=X.X.X.X DST=X.X.X.X LEN=67 TOS=0x08 PREC=0x20 TTL=41 ID=39550 DF PROTO=TCP SPT=51093 DPT=22 WINDOW=229 RES=0x00 ACK PSH URGP
[DROP][INPUT]
是我的 iptables 配置文件中的最后一条规则。
答案1
这次我知道如何让它工作,但不知道为什么它不工作。重新启动iptables
服务使我的脚本工作:systemctl restart iptables
。
在开发这个简单的脚本之前,我尝试实现另一个更长的脚本。它在其他 CHAINS(如 PREROUTING 和其他自定义)中应用新规则。这个脚本必须强制iptables
停止使用cstate
或conntrack
,也许是通过将表填充到最大值来停止?
答案2
谢谢大家的回答!我终于明白了,当我删除了它firewalld
时,iptables
似乎我也删除了一些依赖项。删除并再次安装 iptables 后,我的配置就可以正常工作了。
[编辑] 实际上这仍然不起作用:-(
在日志中我注意到“SYN”和“ACK SYN”数据包被丢弃iptables
:
12 月 17 日 08:03:38 loki 内核:[DROP][INPUT][DEFAULT] IN=eth0 OUT=MAC=0c:c4:...:00 SRC=myIP DST=serverIP LEN=52 TOS=0x00 PREC=0x00 TTL=120 ID=12527 DF PROTO=TCP SPT=51942 DPT=22 WINDOW=64240 RES=0x00 SYN URGP=0 12 月 17 日 08:03:38 loki 内核:[DROP][OUTPUT][DEFAULT] IN= OUT=eth0 SRC=serverIP DST=myIP LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=22 DPT=51942 WINDOW=29200 RES=0x00 ACK SYN URGP=0 12 月 17 日 08:03:38 loki 内核:[输入][丢弃][非 SYN] IN=eth0 OUT= MAC=0c:c4:...:00 SRC=myIP DST=serverIP LEN=40 TOS=0x00 PREC=0x00 TTL=120 ID=12528 DF PROTO=TCP SPT=51942 DPT=22 WINDOW=256 RES=0x00 ACK URGP=0 12 月 17 日 08:03:38 loki 内核:[接受][输入][SSH] IN=eth0 OUT=MAC=0c:c4:...:00 SRC=myIP DST=serverIP LEN=40 TOS=0x00 PREC=0x00 TTL=120 ID=12528 DF PROTO=TCP SPT=51942 DPT=22 WINDOW=256 RES=0x00 ACK URGP=0 12 月 17 日 08:03:38 loki sshd[5074]: 从 myIP 端口 51942 到 serverIP 端口 22 的连接 12 月 17 日 08:03:39 loki sshd[5074]: 从 myIP 端口 51942 ssh2 接受 myUSER 的密码 12 月 17 日 08:03:39 loki systemd-logind:用户 myUSER 的新会话 307。 12 月 17 日 08:03:39 loki systemd:已启动用户 myUSER 的会话 307。
正如您将在我的规则中看到的,我没有在测试中真正删除 paquets,以保持与服务器的连接。这里使用的脚本:
/bin/bash #!/bin/bash # # ========= # 重置全部 # ========= # iptables="iptables" ip6tables="ip6tables" # 硬重置 $iptables -P 输入接受 $iptables -P 转发接受 $iptables -P 输出接受 $iptables -F $iptables -X #$iptables -t nat -F #$iptables -t mangle -F ## 删除广播(无日志) $ iptables -A INPUT -m pkttype --pkt类型广播-j DROP $iptables -A FORWARD -m pkttype --pkt类型广播-j DROP $iptables -A 输入 -d 255.255.255.255 -j 删除 $iptables -A FORWARD -d 255.255.255.255 -j DROP # 保持连接打开 # 不要使用相关内容?https://gist.github.com/azlux/6a70bd38bb7c525ab26efe7e3a7ea8ac $ iptables -A 输入 -m conntrack --ctstate 已建立,相关 -j 接受 $iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # # =============== # 允许本地主机 # =============== # $iptables -A 输入 -i lo -j 接受 $iptables -A 输出 -o lo -j 接受 # # ==== # IPv6 # ==== # $ip6tables -P 输入删除 $ip6tables -A 输出 -j 拒绝 $ip6tables -P 向前删除 # # =========== # 允许端口 # =========== # ## 新不同步 $ iptables -A INPUT -p tcp !--syn -m conntrack --ctstate NEW -j LOG --log-prefix“[INPUT][DROP][NOT SYN]” ## DNS(无日志) $iptables -A OUTPUT -p udp -s 0/0 --dport 53 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT $iptables -A INPUT -p udp --sport 53 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT SSH $iptables -A INPUT -p tcp -s 0/0 --dport 22 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j LOG --log-prefix “[接受][输入][SSH]” $iptables -A INPUT -p tcp -s 0/0 --dport 22 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT $iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # # ================= # 日志 DROP paquets # ================= # $ iptables -A INPUT -j LOG --log-prefix="[DROP][INPUT][DEFAULT] " $ iptables -A FORWARD -j LOG --log-prefix="[DROP][FORWARD][DEFAULT] " $ iptables -A OUTPUT -j LOG --log-prefix="[DROP][OUTPUT][DEFAULT] " 出口 0