我家裡有一個 Raspberry Pi,已連接到我的家庭網路。我用它來運行 VPN 伺服器、SSH 隧道,有時我會透過 SSH 進入它來維護。
在我的路由器上開啟連接埠 (TCP) 以便我在外出時可以遠端連接到我的 Pi 是一個壞主意嗎?我不使用通常的22個連接埠;這是我選擇的隨機連接埠。但是,當我使用nmap
on掃描我的 IP 位址時pentest-tools.com
,我看到了我選擇用於 SSH 的開放連接埠。我的 Pi 受密碼保護,據我所知,其上沒有任何敏感資料或信用卡號碼。但考慮到我將它用於 VPN 或 SSH 隧道,敏感資料可能會透過它傳輸。那麼在我的路由器上開啟這個 SSH 連接埠有什麼壞處嗎?考慮到我的 Pi 始終處於打開狀態並偵聽該端口,任何人都可以通過打開此端口對我的家庭網絡進行惡意操作嗎?
答案1
在安全性方面,我想到了另外三種方法。
A:使用公鑰認證
為了增加安全性,您可以將 SSH 伺服器設定為使用公鑰身份驗證。也就是說,除了強密碼之外,或取代強密碼,只有當 SSH 用戶端提供與伺服器上的公鑰相符的私鑰時,才會開啟連線。即使攻擊者能夠以某種方式獲得公鑰,他也無法從中恢復私鑰。但是,這不會對連接埠掃描器隱藏您的連接埠。
B:使用不同的連接埠
/etc/ssh/sshd_config
此外,透過將 SSH 伺服器配置為偵聽 22 以外的端口,我在減少端口掃描方面取得了良好的經驗。
Port 22
您可以將其變更為 54322:
Port 54322
之後記得重新啟動SSH伺服器;根據您的 Raspberry 上的 Linux,它可能是其中之一
# service sshd restart
# systemctl restart sshd
(#
如果該符號不在文件中,則在我的範例中表示根提示符。)
不用擔心,您目前的 SSH 會話將保持活動狀態。可能值得嘗試開啟連接埠 54322 的第二個 SSH 會話,看看登入是否仍然有效。記得
- 將 SSH 用戶端設定為新連接埠
- 如適用,將網際網路路由器中的新連接埠轉送至 Raspberry Pi
C:關閉端口,僅根據您的要求打開
如果您確實不想向“互聯網”顯示您已打開此端口,請查看端口敲門守護程序,例如knockd
。這些程式監聽您定義的(關閉的)端口,並根據同樣由您定義的敲擊序列打開不同的端口,例如您的 SSH 端口。您可以透過手機或筆記型電腦啟動敲門序列,然後 Raspberry Pi 上的敲門守護程序會開啟根本不可見的 SSH 連接埠。
iptables
更詳細地說,連接埠碰撞將在您的配置中添加一行。此行將開啟 Raspberry 上的連接埠。這也意味著,之前必須關閉 SSH 連接埠iptables
。這意味著您無法透過 SSH 登入。
一個例子knockd.conf
可能是這樣的:
[openclosessh]
sequence = 1000,2020,3015,65432
seq_timeout = 15
tcpflags = syn
start_command = /usr/local/bin/knockd-open.sh %IP%
cmd_timeout = 30
stop_command = /usr/local/bin/knockd-close.sh %IP%
另外,請記得將要存取的連接埠從您的網路路由器轉送到您的 Raspberry。
對應的開啟/關閉腳本可能如下所示:
#!/bin/bash
# /usr/local/bin/knockd-open.sh
# adds two lines at the top of iptables which allow all incoming and outgoing traffic on tcp port 54322
iptables -I INPUT -s $1 -p tcp --dport 54322 -j ACCEPT
iptables -I OUTPUT -d $1 -p tcp --sport 54322 -j ACCEPT
和
#!/bin/bash
# /usr/local/bin/knockd-close.sh
# deletes those two lines again
iptables -D INPUT -s $1 -p tcp --dport 54322 -j ACCEPT
iptables -D OUTPUT -d $1 -p tcp --sport 54322 -j ACCEPT
請記住使這兩個腳本都可以通過chmod +x /usr/local/bin/knockd*
.另外,您應該使用以下其中之一啟動並啟用 Knockd 服務:
# service knockd start && update-rc.d knockd enable
# systemctl start knockd && systemctl enable knockd
特別是如果您使用敲擊無法存取控制台的遠端計算機,您可能希望使用它atd
來自動撤銷任何更改和/或重新啟動 Raspberry,以防配置錯誤。
由於 iptables 不會在重新啟動後自動存儲,因此在範例中,您可以是 root(通過su
)並且
# at now + 5 minutes
> reboot
> (hit ctrl-d)
# ./script-which-closes-iptables.sh
一個範例./script-which-closes-iptables.sh
可能如下所示(請記住使用 使其可執行chmod +x
)
#!/bin/bash
# allow everything on the loopback interface
iptables -A INPUT -i lo -j ACCEPT
# allow only related or established incoming ssh sessions
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -m tcp --dport 54322 -j ACCEPT
# allow outgoing related or established ssh sessions
iptables -A OUTPUT -p tcp -m state --state RELATED,ESTABLISHED -m tcp --sport 54322 -j ACCEPT
# allow everything on the loopback interface
iptables -A OUTPUT -o lo -j ACCEPT
# drop everything else in and out
iptables -P INPUT DROP
iptables -P OUTPUT DROP
如果您的 SSH 會話現在即將終止,Raspberry 將在 5 分鐘內重新啟動。如果您的 SSH 會話仍處於活動狀態,請使用下列命令撤銷掛起的重新啟動
# atq
15 reboot
# atrm 15
如果您的 SSH 會話仍然處於活動狀態,請嘗試透過第二個 SSH 會話登入。那不應該起作用。然後用你的手機敲你配置的連接埠/etc/knockd.conf
。之後,再次嘗試透過第二個 SSH 會話登入。這次,應該可以了。
然後你可以讓你的 iptables 在重新啟動後保持不變。在您的系統上,您可能必須透過以下方式安裝軟體包
# apt-get install iptables-persistent
保存你的 iptables
# iptables-save > /etc/iptables/iptables-rules
並啟用 iptables 服務
# systemctl enable iptables