
我有一個 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 進行的任何連接都會從與其他通訊(包括到連接埠 22 的 SSH)不同的 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 流量。