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


42

这是我的/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到服务器,请忽略有关的任何监督/顾虑。

Answers:


47

如果我以正确的方式解决了这个问题,您希望仅通过端口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。)

或如joel所说,您可以添加一条规则来代替:

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如果要执行目标操作,请使用bang运算符支持反转DROP。示例:iptables -I INPUT -p tcp ! -s <permittedIP> -j DROP
Bratchley 2014年

1
另外,DROP实际上并不需要无条件的,您只需在防火墙上设置默认策略即可,iptables -P INPUT DROP然后再对其进行处理。如果以这种方式进行操作,您可能还希望将它们作为附件执行,否则所有流量都会被捕获,DROP并且永远不会达到您的ACCEPT规则。
布拉奇利2014年

1
这对我不起作用,因为-I(插入)的默认值是作为规则#1插入,因此DROP作为规则#1插入并首先被评估,因此丢弃所有ssh数据包,而从不评估ACCEPT规则。您必须执行,iptables -I INPUT 3 -p tcp -s 0.0.0.0/0 --dport 22 -j DROP并且iptables -I INPUT 3 -p udp -s 0.0.0.0/0 --dport 53 -j DROPINPUT之后的“ 3”表示按照INPUT规则#3进行插入(假设您要插入两个ACCEPTS,否则,如果仅一个ACCEPT,则对INPUT使用“ 2”。)
Kevin Triplett

@Networker Using -I将在顶部插入新的iptables规则。这样一来,您可能最终会在允许之前将您的掉期加注。我建议-A改用
BlueCacti

1
好吧,我把自己锁在
门外

6

尽管我建议使用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

这样,您就可以root从IP 中以用户身份登录SSH,而无需输入密码。

请记住,与

iptables -X
iptables -F

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


cronjob只会删除防火墙。为什么要iptables首先设置?某种形式的带外访问是通常的方法。knockd是另一个。
马特

@mtm是的,当您被锁定时,cronjob将重置IPtables设置,以便您可以再次访问SSH。人们使用IPtables的原因不同,我认为它是一种有效,简单且灵活的防火墙。
威廉·爱德华兹

2
oic。您的意思是在设置时运行一次刷新,而不是定期计划。at做到这一点。
马特

4
仅将您的IP列入白名单,然后允许不带密码的root用户登录似乎是一个可怕的主意。
亚历克斯W

1
@AlexW我知道已经有一段时间了,但是我仍然想发表评论:这Without-Password意味着不允许密码验证,因此您必须使用SSH密钥验证。对于此身份验证方法,确实有一个不清楚的命名。但这并不意味着您不需要密码即可以root用户身份登录。尽管如此,一种更安全的方法是设置PermitRootLogin no并使用其他sudo帐户登录,因为root是常见的目标
BlueCacti 2016年

5

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

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

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

以下是设置规则的示例,该规则仅允许来自单个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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.