对特定端口/IP 对分别使用 ACCEPT 然后 DROP 是否会允许该 IP 而不允许该端口上的其他任何 IP?

对特定端口/IP 对分别使用 ACCEPT 然后 DROP 是否会允许该 IP 而不允许该端口上的其他任何 IP?

我正在服务器上工作,应该对其进行配置,以便仅允许来自特定 IP 的端口 8080 上的请求。(在其他 http(s) 端口上,没有任何内容在监听。)

其余一切均不受限制。

在研究了/etc/hostiptables 之后,我编写了这个脚本来激活(和停用)该规则:

#!/bin/bash

if ["$1" != 'restrict'] && ["$1" != 'restore']
  then
    echo "Usage:"
    echo "'${0##*/} restrict' to activate rules."
    echo "'${0##*/} restore' to deactivate rules."
    echo "'${0##*/}' to show this help."
    exit 0
fi


# Set default policies for INPUT, FORWARD and OUTPUT chains
# Allowing everything else.
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# Flush all current rules from iptables
iptables -F

if [$1 == "restrict"]
  then

    # Allow HTTP connections on tcp port 8080 from X.X.X.X
    # [I]nserting the rules as first in the chain.
    iptables -I INPUT -p tcp --dport 8080 -s X.X.X.X -j ACCEPT

    # Denying all other connections on tcp port 8080
    # [A]ppending the rule as last in the chain.
    iptables -A INPUT -p tcp --dport 8080 -j DROP
fi

# Save settings
/sbin/service iptables save

# List rules
iptables -L -v

由于我只能通过 SSH 访问该机器,我不想搞砸并把自己锁在外面。因此我想问一下这个脚本

  • 作品?
  • 会做期望的事情吗?
  • 不会做其他事吗?
  • 保持非挥发性?

答案1

虽然这可行,但这不是最佳做法。最佳做法不是允许所有内容并仅丢弃特定内容,而是丢弃所有内容,然后仅允许您真正想要通过的内容。

一个“正常”的 IP 表规则集通常以如下方式开始:

# Flush rules
iptables -F

# Policy drop
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Permit loopback device
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Permit new outgoing connections, and packets that belong to
# an existing connection. You might actually not want to allow
# all new connections from the inside if you want to restrict 
# this, you will have to allow DNS, updates, etc.. manually
iptables -A OUTPUT -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

# Same for input
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

# Custom rules
# ...
iptables -A INPUT -p tcp --dport 8080 -s 5.35.252.105 -j ACCEPT

此外,在设置新防火墙时,不要自动运行脚本,也不要使更改永久生效。这样,如果您搞砸了,重新启动服务器即可恢复连接。

答案2

您的规则是正确的(如果您修复了前面评论中提到的 shell 脚本中的语法错误)对于 IPv4对于 IPv6,你的机器可能完全开放

未来建议:

  • 防止锁定:如果您iptables-save直接以样式编写规则,您可能会喜欢iptables-apply恢复先前规则的命令,以防新规则将您锁定。

  • 使规则持久:在 ubuntu 上,应该有一个iptables-persistent软件包来确保您的规则在重启后仍然有效。只需设置您的规则并apt-get install iptables-persistent按照交互式对话框进行操作即可。

  • 改进风格和安全性:mzhaase 给出了一个非常好的教程,教你如何编写白名单规则。

答案3

这是防止锁定的简单方法。原则上,它可以在任何 *nix 系统上工作,而不仅仅是 Ubuntu。

假设你的脚本被调用/usr/local/bin/start-iptables.sh,并且你使用以下命令完全禁用 iptables/usr/local/bin/stop-iptables.sh

/usr/local/bin/start-iptables.sh ; sleep 30 ; /usr/local/bin/stop-iptables.sh

如果您像这样在一行中运行这些命令,shell 将按顺序运行它们。如果您按 Control-c,整个命令字符串将被中止 - 它不会只是取消正在运行的命令并转到下一个命令。

因此,shell 将运行您的启动脚本,然后休眠 30 秒。在这 30 秒内,验证您是否仍可以访问服务器。建立新连接,有多种方法可以建立新连接,但保持现有连接处于活动状态。一旦您确定,control-c 和 sleep 和 stop-iptables 脚本将被中止。

如果你将自己锁在外面,30 秒后,停止脚本将运行,然后您就可以回来了。

相关内容