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

相關內容