使用相同的終端命令從 LAN 內部和外部進行 SSH 訪問
我有一個 Raspberry Pi (RPi),我正在使用 ssh 與它建立遠端連接。我設法正確設置了 ssh,這樣我就可以從區域網路和網際網路訪問 RPi(使用我在路由器上打開的特定埠)。
假設一個使用者名
john
和一個名為 的 RPiraspi
:內部區域網路訪問
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)