Ssh

使用相同的終端命令從 LAN 內部和外部進行 SSH 訪問

  • January 16, 2021

我有一個 Raspberry Pi (RPi),我正在使用 ssh 與它建立遠端連接。我設法正確設置了 ssh,這樣我就可以從區域網路和網際網路訪問 RPi(使用我在路由器上打開的特定埠)。

假設一個使用者名john和一個名為 的 RPi raspi

內部區域網路訪問

ssh john@192.168.2.7
ssh john@raspi
ssh raspi

外部區域網路訪問

ssh -p 1234 john@12.345.67.89
ssh -p 1234 12.345.67.89

但是我怎麼能簡單地ssh raspi從我的區域網路外部做呢?有沒有辦法將 raspi 配置為指向兩個 IP 地址,一個在 LAN 中,一個在 Internet 上?

我基本上想要的是以單一方式訪問我的 RPi,無論我是在家還是在工作。

仔細觀察您的問題,您似乎在區域網路內外使用同一台電腦。我已經相應地修改了我的答案:

在您的~/.ssh/config中,添加:

Host raspi-wan
   HostName 12.34.56.78
   User john
   Port 1234

Host raspi-lan
   HostName 192.168.1.2
   User john
   Port 22

然後,您可以ssh raspi-wan從 LAN 外部或 LANssh raspi-lan內部進行操作,而無需擔心 DNS 伺服器或/etc/hosts為所有使用者進行編輯,甚至不需要以 root 身份執行任何操作。如果您希望名稱raspi根據您所在的位置以不同方式解析,則可能需要一些 shell 腳本魔法來檢測您的網路並採取相應措施。

這完全可以通過 ssh 配置實現,無需為 lan 和 wan 使用單獨的別名或創建任何額外的埠轉發。(但你自然需要一些方法來檢測你是否在你的區域網路內)

~/.ssh/config中,您需要添加如下內容:

Match host raspi exec "am_i_outside_of_my_lan"
   HostName 12.345.67.89
   Port 1234

代替am_i_outside_of_my_lan您需要放置一個命令來確定您是否在家庭網路內,如果您在家庭網路之外,則返回 0 退出程式碼,否則返回其他內容。

host條件可能是不言自明的,但該exec條件需要一些解釋:它僅在給定命令返回退出程式碼 0 時匹配,即。沒有錯誤。

因此,換句話說,這host raspi部分將這條規則限制在您嘗試連接到主機 raspi 時,並exec "am_i_outside_my_lan"進一步限制它,使其僅適用於您從家庭網路外部連接時。因此,在您的家庭網路內部ssh user@raspi,它的功能與通常情況完全相同,但在其外部,規則匹配,而是與ssh -p 1234 user@12.345.67.89.

至於用什麼代替am_i_outside_of_my_lan,這完全取決於您的設置。我確實建議將命令放在單獨的腳本中,而不是嘗試將其寫入內聯,因為引用似乎有點難以正確。

就個人而言,我使用以下 Python 腳本來檢測我是否在自己的網路內:(因為我的域名解析為我自己網路內的本地 ip)

#! /usr/bin/env python
import socket, sys

sys.exit(socket.gethostbyname('mydomain.com').startswith('192.168.1.'))

如果您沒有類似的設置,則可能需要執行其他操作。(例如,您可以查看您連接的無線網路的名稱,甚至可以查詢一些 what-is-my-ip 服務以獲取您連接的網路的外部 ip)

引用自:https://unix.stackexchange.com/questions/107225