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

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

这是我的/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

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

示例 IP:

1.2.3.4

请忽略有关如果我的 IP 发生变化并且我无法再通过 SSH 连接到我的服务器的任何疏忽/担忧。

答案1

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

iptables -A INPUT -p tcp -s YourIP --dport 22 -j ACCEPT

在这种情况下,如果您需要为内部网络打开 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

添加并为这些 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

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

或作为乔尔说你可以添加一条规则:

iptables -A INPUT -p tcp ! -s <permittedIP> -j DROP

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

iptables -P INPUT DROP

简而言之,如这个问题关于SO:

iptables -A INPUT -p tcp --dport 22 -s YourIP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

答案2

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

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

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

添加新的“允许来自 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

稍后,如果您需要将第二个 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

请注意,使用-I INPUT 2添加了新规则作为规则 2,并将 DROP 规则增加到规则 3。

答案3

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

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

iptables -I INPUT -s [YOUR_HOME_IP] -p tcp -m tcp --dport [SSH_PORT] -j ACCEPT

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

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

iptables -I INPUT -p tcp -m tcp --dport [SSH_PORT] -j REJECT

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

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

添加以下内容:

AllowUsers root@[YOUR_HOME_IP]
PermitRootLogin without-password

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

请记住,一个 cronjob 与

iptables -X
iptables -F

可能很聪明,这样你就不会被 SSH 锁定在你的服务器之外(cronjob 将重置 IPtables,这样你就可以再次访问)。如果您仍然可以访问,您可以删除 cronjob 并重新设置您的 IPtables。

答案4

我在用着乌夫沃(简单的防火墙)为此,因此想贡献我的设置。 Ufw 在后台使用 iptables,但对于此类简单的任务具有更简单的界面。

我只需要发出:

sudo ufw allow from <your-ipv4-here> to any port 22
sudo ufw allow from <your-ipv6-here> to any port 22

就是这样。

当然,您也可以默认拒绝任何其他传入流量并允许传出流量。

sudo ufw default deny incoming
sudo ufw default allow outgoing

希望这对某人有帮助。

相关内容