SSH 服务器上的防火墙拒绝我的客户端连接(即使不启用防火墙,它也能正常工作)

SSH 服务器上的防火墙拒绝我的客户端连接(即使不启用防火墙,它也能正常工作)

我有一个 SSH 服务器,我想从我的 Android 连接到它。

我创建了 SSH 密钥,一切正常。我的手机通过 SSH 连接到我的服务器。没有问题。

当我启用防火墙时,问题就开始了iptables。此时,我的防火墙拒绝来自我的 Android 的连接。

我在 Android 上使用 Termux。在 Termux 中,我可以使用以下命令找到我的公共 IP 地址

curl -4 icanhazip.com

它显示我的 Android 的公共 IP 是x.x.121.3。我在这里混淆了地址,但在实际iptables配置中它是准确的。这是配置:

Chain INPUT (policy DROP 7530 packets, 338K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    3   180 ACCEPT     tcp  --  *      *       x.x.161.85           0.0.0.0/0            tcp dpt:22 state NEW
    1    60 ACCEPT     tcp  --  *      *       x.x.134.54           0.0.0.0/0            tcp dpt:22 state NEW
    0     0 ACCEPT     tcp  --  *      *       x.x.121.3            0.0.0.0/0            tcp dpt:22 state NEW
    0     0 ACCEPT     tcp  --  *      *       x.x.136.182          0.0.0.0/0            tcp dpt:22 state NEW
  857 4470K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
   12   986 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  650 81372 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW,RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0

我做错了什么?如何允许来自手机的 SSH 连接?

答案1

curl -4 icanhazip.com使用 HTTP 和端口 80 来检索数据。您可以通过运行来验证这一点curl -v -4 icanhazip.com

可能是您的 ISP 操纵流量,因此您与端口 80 建立的任何连接都会从与其他通信(包括 SSH 到端口 22)不同的 IP 地址进入互联网。

例如,他们可能会通过单个代理服务器路由来自其许多客户端的 HTTP,以利用缓存并减少通过代理之外的链接进行的数据传输。代理几乎是透明的:它不需要您进行任何配置,您“感觉”好像没有代理;但它使用其单独的 IP 地址代表许多客户端执行 HTTP 请求。实际上,对于 HTTP 服务器来说,所有客户端都显示为来自这个单个 IP 地址。

无论实际情况如何,提供给您的地址可能curl不是您的 SSH 连接使用的源地址。您在防火墙中允许的地址不是正确的地址。

幸运的是,您可以禁用防火墙并成功连接。使用此事实来发现正确的 IP 地址:

  1. 暂时禁用防火墙。
  2. 通过手机连接。
  3. 在结果 shell 会话中运行echo "$SSH_CONNECTION"
  4. 第一个 IP 地址是服务器“认为”您连接的 IP 地址。
  5. 如果echo …没有打印任何内容,则检查服务器上的日志以获取客户端的实际 IP。在我的 Debian 中,一些有用的命令是:

    sudo tail /var/log/auth.log
    journalctl _SYSTEMD_UNIT=ssh.service | tail
    

    或者使用一些工具(lsofss、……)查看已建立的连接和相关地址;您使用的 SSH 连接应该在那里。我不会在这里详细说明如何缩小列表并真正找到这个单个连接。

找到正确的地址后,重新配置防火墙以允许来自该地址的 SSH 流量。

相关内容