我想以这种方式在远程服务器上设置 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]
- 你能解释一下为什么会发生这种情况吗?我原本期望出现不同的行为(DNS 将域名解析为 IP,ssh 将尝试使用该 IP 访问端口,但端口将被阻止)。
- 我如何才能完全阻止除这两个 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