iptables - ssh - 仅从特定 IP 访问

iptables - ssh - 仅从特定 IP 访问

我想以这种方式在远程服务器上设置 iptables 规则,以便我只能从特定的 IP 地址访问它。

当前的 iptables 列表如下所示:

root@localhost:~# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4                 anywhere             tcp dpt:ssh
ACCEPT     tcp  --  2.2.2.2                 anywhere             tcp dpt:ssh
DROP       tcp  --  anywhere                anywhere             tcp dpt:ssh

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain l (0 references)
target     prot opt source               destination

其中 1.2.3.4 和 2.2.2.2 是我想要访问此机器的 IP 目标。一切正常。如果我输入:

ssh root@server-ip-address-here

我只能从这两个位置访问。任何其他位置都会遇到超时,无法到达端口 22。

问题是,我有一个与此服务器/ip 关联的域,例如,示例.com

现在,让我感到困惑的是,如果我尝试使用域名访问 ssh,我是否可以毫无问题地访问端口???

ssh [email protected]
  1. 你能解释一下为什么会发生这种情况吗?我原本期望出现不同的行为(DNS 将域名解析为 IP,ssh 将尝试使用该 IP 访问端口,但端口将被阻止)。
  2. 我如何才能完全阻止除这两个 IP 之外的其他来源在端口 22 上的 ssh 访问(tcp 连接)(无论它们如何尝试访问该端口)?

答案1

设置从已知 IP 访问服务器的最佳规则是:

sudo iptables -A INPUT -p tcp -s IP-ADDRESS --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

如果你想将 OUTPUT 链更改为 DROP 或 REJECT,那么你也需要以下规则:

sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

但你的规则似乎没问题。

如果您正在连接到领域(例如 domain.com)并到达 ssh 服务器,您应该检查是否为没有 iptables 规则断开连接的域设置了 CDN 或反向代理。此外,如果该端口未转发且防火墙启用了 ssh 服务,则执行 NAT 的防火墙可能会导致响应,或者客户端和服务器之间的任何中间都运行着 ssh 服务器。最有可能是另一台设备的 ssh 服务器,或者您的网络/设置有问题。

ipv6 评论后更新

如果您正在使用 ipv6,则应检查 iptables 的 ipv6 规则:

sudo ip6tables -L

您至少有两个选择:

1)如果您允许所有内容,则可以将允许的 ipv4 设备的 ipv6 地址限制为(注意 IPv6 地址)用于 ssh 服务:

sudo ip6tables -A INPUT -p tcp -s IPv6-ADDRESS --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

2)或者默认直接丢弃所有来自 IPv6 的数据包:

sudo ip6tables -P INPUT DROP
sudo ip6tables -P FORWARD DROP

相关内容