Iptables 规则 适用于 PING、Whois、DNS、NTP、SSH、HTTP(S)、FTP

Iptables 规则 适用于 PING、Whois、DNS、NTP、SSH、HTTP(S)、FTP

这是我在新安装的 Debian 8 上加载的文件iptables-restore: 我唯一更改的是在文件中使用 SSH 端口 22022 /etc/ssh/sshd_config

----- 请参阅下面的更新-----

一旦我加载这个文件,我就无法以任何方式访问这个 debian;甚至 ping 也不起作用。 /var/log/messages 文件中没有任何有关任何错误的信息。这是我第一次尝试配置 iptables。我读过很多有关它的文档,但我在某个地方做错了。你能指出这里发生了什么吗?

    *filter

    #----------
    # Local loop
    #----------
    -A INPUT -i lo -j ACCEPT
    -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

    #----------
    # Connexions already established
    #----------
    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    #----------
    # PING
    #----------
    -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

    #----------
    # SSH
    #----------

    -A INPUT -p tcp --dport 22022 -m state --state NEW,ESTABLISHED -j ACCEPT
    -A OUTPUT -p tcp --dport 22022 -m state --state NEW,ESTABLISHED -j ACCEPT

    #----------
    # HTTP
    #----------

    -A INPUT -p tcp --dport 80 -j ACCEPT
    -A OUTPUT -p tcp --dport 80 -j ACCEPT

    #----------
    # HTTPS
    #----------

    -A INPUT -p tcp --dport 443 -j ACCEPT
    -A OUTPUT -p tcp --dport 443 -j ACCEPT

    #----------
    # FTP
    #----------

    -A INPUT -p tcp --dport 20 -m state --state NEW,ESTABLISHED -j ACCEPT
    -A OUTPUT -p tcp --dport 20 -m state --state NEW,ESTABLISHED -j ACCEPT

    -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
    -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

    #----------
    # Logs
    #----------
    -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 4

    #----------
    # DROP everything else
    #----------
    -A INPUT -j DROP
    -A OUTPUT -j DROP
    -A FORWARD -j DROP

    COMMIT

- - - 更新 - - -

现在我可以使用 NTP、Ping、DNS、Whois、SSH、HTTP(S) 和 FTP。胡拉。这是新文件,如果您发现任何奇怪的内容,请告诉我。我还了解到,将 FTP(TLS/SSL) 与 vsftp(我使用的)一起使用需要一些好的配置技巧,但目前我还没有找到任何好的解决方案。我真的希望我能解决这个问题,因为我不会像这样保持“清晰”的 FTP。如果你有什么想法。再次感谢您的帮助,两个答案都很好,我无法选择一个;)

(顺便说一句,我现在使用 sh 脚本来加载模块)

    #!/bin/sh

    #----------
    # Load needed modules
    #----------
    modprobe ip_conntrack_ftp
    modprobe ip_nat_ftp

    #----------
    # Local loop
    #----------
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

    #----------
    # Connexions already established
    #----------
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    #----------
    # NTP
    #----------
    iptables -A INPUT -p udp --sport 123 -j ACCEPT
    iptables -A OUTPUT -p udp --dport 123 -j ACCEPT

    #----------
    # PING
    #----------
    iptables -A INPUT -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -A OUTPUT -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

    #----------
    # DNS
    #----------
    # UDP
    iptables -A INPUT -i eth0 -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
    # TCP
    iptables -A INPUT -i eth0 -p tcp --sport 53 -m state --state ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT

    #----------
    # WHOIS
    #----------
    iptables -A INPUT -p tcp --sport 43 -j ACCEPT
    iptables -A OUTPUT -p tcp --dport 43 -j ACCEPT

    #----------
    # SSH
    #----------
    # Incoming
    iptables -A INPUT -i eth0 -p tcp --dport 22022 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 22022 -m state --state ESTABLISHED -j ACCEPT
    # Outgoing
    iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

    #----------
    # HTTP
    #----------
    # Incoming
    iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
    # Outgoing
    iptables -A INPUT -i eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

    #----------
    # HTTPS
    #----------
    # Incoming
    iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
    # Outgoing
    iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT

    #----------
    # FTP
    #----------
    #incoming
    iptables -A INPUT -i eth0 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT

    #----------
    # Logs
    #----------
    #-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 4

    #----------
    # DROP everything else
    #----------
    iptables -A INPUT -j DROP
    iptables -A OUTPUT -j DROP
    iptables -A FORWARD -j DROP

    exit 0

答案1

在这些规则之后:

-A OUTPUT -p tcp --dport 22022 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp --dport 20 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -j DROP

您可以从计算机发送的所有内容是 HTTP(S) 请求、一些发往端口 22022 的 FTP 连接和 SSH 连接。但例如来自 SSH 服务器的响应则不然,因为它们的目的地将是客户端选择的某个随机端口(可能不是 22022,除非是偶然)。同样,来自 HTTP 服务器的响应也不会发出,并且也不允许 ICMP 回显回复。

如果您只想允许 SSH 服务器发送的数据包,则需要允许数据包发送来自端口 22022,因此--sport 22022.

尽管即使您允许 SSH 服务器响应,您很快就会发现您无法发出许多传出请求。您确实允许 HTTP 请求,但例如传出 DNS 查询将不会出去。考虑一下您愿意制定多严格的输出规则。我建议至少首先在链中添加-m state --state ESTABLISHED -j ACCEPT一条规则。-j LOGOUTPUT

答案2

正如 ilkkachu 在他的回答中所说,你的输出规则并不想要(我猜)你想要它们。

一些忠告:

  • 不要用DROP规则显式结束链,DROP而是使用iptables -P INPUT DROP( 和 类似OUTPUTFORWARD然后您可以使用 向链添加规则iptables -A <chain>,该策略会自动应用于到达链末尾的任何数据包。
  • 向链中添加一条规则OUTPUT,允许已建立的相关连接上的流量,并带有iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT.与您INPUT链中的完全相似。然后,对您允许传入的任何内容的响应都将被允许,无需考虑特定协议如何工作。
  • 考虑添加规则,允许您的服务器发出传出 DNS 请求(记住两个都UDP 和 TCP)。

相关内容