仅当使用 conntrack 时,IPtables 才会阻止 SSH

仅当使用 conntrack 时,IPtables 才会阻止 SSH

错误

如您所见,工作配置和不工作配置之间的唯一区别是-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停止使用cstateconntrack,也许是通过将表填充到最大值来停止?

答案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

相关内容