如何确保SSH端口只对特定IP地址开放?

46 security ssh iptables

这是我的/etc/sysconfig/iptables

它有两个端口,80 apache 和 22 ssh。

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
Run Code Online (Sandbox Code Playgroud)

对于端口 22 ( SSH ),我想确保除了特定的 IP 地址之外,没有人可以连接到此端口。

示例IP:

1.2.3.4
Run Code Online (Sandbox Code Playgroud)

如果我的 ip 发生变化并且我无法再通过 SSH 连接到我的服务器,请忽略任何疏忽/顾虑。

Nid*_*dal 54

如果我以正确的方式提出问题,您希望您的服务器只能从端口 22 上的特定 IP 地址访问,您可以为此更新 Iptables:

iptables -A INPUT -p tcp -s YourIP --dport 22 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果您需要为内部网络打开 DNS,则您只向 YourIP 开放 ssh 端口:

iptables -A INPUT -p udp -s YourIP --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -s YourIP --dport 53 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

为这些 IP 添加并打开它们后,您需要关闭其余 IP 的门

iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP
iptables -A INPUT -p udp -s 0.0.0.0/0 --dport 53 -j DROP
iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 53 -j DROP
Run Code Online (Sandbox Code Playgroud)

(确保将规则设置在规则集中的正确位置。iptables -A INPUT将规则添加到当前的末尾INPUT。)

或者正如乔尔所说,您可以添加一条规则:

iptables -A INPUT -p tcp ! -s <permittedIP> -j DROP
Run Code Online (Sandbox Code Playgroud)

或者你可以在防火墙上设置默认策略

iptables -P INPUT DROP
Run Code Online (Sandbox Code Playgroud)

简而言之,如关于 SO 的这个问题所示

iptables -A INPUT -p tcp --dport 22 -s YourIP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
Run Code Online (Sandbox Code Playgroud)

  • 还值得注意的是,`iptables` 支持使用 bang 运算符进行反转,以防您想要执行有针对性的 `DROP`。示例:`iptables -I INPUT -p tcp !-s &lt;permittedIP&gt; -j DROP` (2认同)

Wil*_*rds 7

虽然我建议使用 SSH 密钥,但我会给你一个解释。

您不必使用 IPtables 来实现您想要实现的目标,有多种方法。这是IPtables的方式:

iptables -I INPUT -s [YOUR_HOME_IP] -p tcp -m tcp --dport [SSH_PORT] -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

[YOUR_HOME_IP] = 您的家庭 IP(非常简单)

[SSH_PORT] = 运行 SSH 的端口(默认为 22)

iptables -I INPUT -p tcp -m tcp --dport [SSH_PORT] -j REJECT
Run Code Online (Sandbox Code Playgroud)

这确保除了您的 IP 之外没有任何人可以登录到 SSH。

还有另一种方法,就是在sshd_config.

添加以下内容:

AllowUsers root@[YOUR_HOME_IP]
PermitRootLogin without-password
Run Code Online (Sandbox Code Playgroud)

这允许您root从您的 IP以用户身份登录到 SSH,而无需输入密码。

请记住,与

iptables -X
iptables -F
Run Code Online (Sandbox Code Playgroud)

可能很聪明,因此您不会被 SSH 锁定在服务器之外(cronjob 将重置 IPtables,因此您将再次获得访问权限)。如果您仍然可以访问,您可以删除 cronjob 并再次设置您的 IPtables。

  • 仅将您的 IP 列入白名单,然后允许没有密码的 root 登录似乎是一个糟糕的主意。 (4认同)
  • 伊斯兰会议组织。您的意思是在设置时运行一次刷新,而不是定期安排。[`at`](http://linux.die.net/man/1/at) 就是这样做的。 (2认同)

STW*_*STW 7

其他答案iptables -I在他们的示例中使用,这通常不是您应该使用的。

iptables 会执行第一个匹配的规则,所以规则的顺序很重要。 -I是“插入”命令,应该与索引参数一起使用以指定给定规则在列表中的位置。 -A是“append”命令,它将规则添加到列表的末尾。

在某些发行版中(可能是所有发行版),-I不使用索引参数会将规则添加到索引中,使其成为第一个检查的规则。在这种情况下,如果您运行的最后一个命令是iptables -I INPUT -s tcp 0.0.0.0/0 -j DROPiptables,则 iptables 将丢弃所有流量,无论您ACCEPT在链中是否有任何规则。

这是设置仅允许来自单个 IP 的 SSH 的规则的示例:

无规则开始:

#> iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
Run Code Online (Sandbox Code Playgroud)

添加新的“允许来自 1.2.3.4 的 SSH”规则:

#>iptables -A INPUT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT

阻止来自所有其他 IP 的 SSH:

#>iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP

现在您的 INPUT 链将如下所示:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
Run Code Online (Sandbox Code Playgroud)

稍后,如果您需要将第二个 IP 列入白名单,您可以使用该-I参数将其置于黑名单规则之前。

#>iptables -I INPUT 2 -p tcp -s 4.3.2.1 --dport 22 -j ACCEPT

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  4.3.2.1              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
Run Code Online (Sandbox Code Playgroud)

请注意, using-I INPUT 2添加了新规则作为规则编号 2,并将 DROP 规则提高到编号 3。