我有一个 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 地址:
- 暂时禁用防火墙。
- 通过手机连接。
- 在结果 shell 会话中运行
echo "$SSH_CONNECTION"
。 - 第一个 IP 地址是服务器“认为”您连接的 IP 地址。
如果
echo …
没有打印任何内容,则检查服务器上的日志以获取客户端的实际 IP。在我的 Debian 中,一些有用的命令是:sudo tail /var/log/auth.log journalctl _SYSTEMD_UNIT=ssh.service | tail
或者使用一些工具(
lsof
、ss
、……)查看已建立的连接和相关地址;您使用的 SSH 连接应该在那里。我不会在这里详细说明如何缩小列表并真正找到这个单个连接。
找到正确的地址后,重新配置防火墙以允许来自该地址的 SSH 流量。