如何在 Linux 上使用端口敲門(以及為什麼不應該)
已發表: 2022-01-29
端口敲門是一種通過關閉防火牆端口來保護服務器的方法——即使是你知道會被使用的端口。 當且僅當連接請求提供秘密敲門時,這些端口才會按需打開。
端口敲門是一種“秘密敲門”
在 1920 年代,當禁令如火如荼時,如果您想進入地下酒吧,您必須知道秘密敲門並正確敲擊才能進入。
敲門是現代的等價物。 如果您希望人們可以訪問您計算機上的服務,但又不想將防火牆打開到 Internet,則可以使用端口敲擊。 它允許您關閉防火牆上允許傳入連接的端口,並在進行預先安排的連接嘗試模式時自動打開它們。 連接嘗試的順序充當秘密敲門聲。 另一個秘密敲門關閉了港口。
端口敲門是一種新奇事物,但重要的是要知道它是通過默默無聞實現安全的一個例子,而這個概念從根本上是有缺陷的。 如何訪問系統的秘密是安全的,因為只有特定群體中的人才知道。 但是一旦這個秘密被洩露——無論是因為它被揭示、觀察、猜測或解決——你的安全性就失效了。 您最好以其他更強大的方式保護您的服務器,例如要求 SSH 服務器使用基於密鑰的登錄。
最強大的網絡安全方法是多層次的,因此,端口敲門可能應該是這些層次之一。 層數越多越好,對吧? 但是,您可能會爭辯說,端口敲擊不會對適當強化的安全系統增加太多(如果有的話)。
網絡安全是一個龐大而復雜的話題,但您不應該將端口敲門作為唯一的防禦形式。
相關:如何從 Linux Shell 創建和安裝 SSH 密鑰
安裝敲門
為了演示端口敲擊,我們將使用它來控制端口 22,即 SSH 端口。 我們將使用一個名為 knockd 的工具。 如果您使用 Ubuntu 或其他基於 Debian 的發行版,請使用apt-get
將此軟件包安裝到您的系統上。 在其他 Linux 發行版上,請改用您的 Linux 發行版的包管理工具。
鍵入以下內容:
sudo apt-get install knockd
您可能已經在系統上安裝了 iptables 防火牆,但您可能需要安裝iptables-persistent
軟件包。 它處理保存的iptable
規則的自動加載。
鍵入以下內容進行安裝:
sudo apt-get install iptables-persistent
當 IPV4 配置屏幕出現時,按空格鍵接受“是”選項。
在 IPv6 配置屏幕中再次按空格鍵以接受“是”選項並繼續。
以下命令告訴iptables
允許已建立和正在進行的連接繼續。 我們現在將發出另一個命令來關閉 SSH 端口。
如果在我們發出此命令時有人通過 SSH 連接,我們不希望他們被切斷:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
此命令向防火牆添加一條規則,即:
- -A :將規則附加到防火牆規則表中。 也就是說,將其添加到底部。
- INPUT :這是關於傳入連接的規則。
- -m conntrack :防火牆規則作用於與規則中的條件匹配的網絡流量(數據包)。
-m
參數使iptables
使用額外的數據包匹配模塊——在這種情況下,稱為conntrack
的模塊與內核的網絡連接跟踪功能一起工作。 - –cstate ESTABLISHED,RELATED :這指定了規則將應用到的連接類型,即 ESTABLISHED 和 RELATED 連接。 已建立的連接是已經在進行中的連接。 相關連接是由於已建立連接的操作而建立的連接。 也許有人連接了想要下載文件; 這可能發生在主機發起的新連接上。
- -j ACCEPT :如果流量符合規則,則跳轉到防火牆中的 ACCEPT 目標。 換句話說,流量被接受並允許通過防火牆。
現在我們可以發出命令關閉端口:
sudo iptables -A INPUT -p tcp --dport 22 -j REJECT
此命令向防火牆添加一條規則,即:
- -A :將規則附加到防火牆規則表中,即添加到底部。
- INPUT :此規則是關於傳入連接的。
- -p tcp :此規則適用於使用傳輸控制協議的流量。
- –dport 22 :此規則特別適用於以端口 22(SSH 端口)為目標的 TCP 流量。
- -j REJECT :如果流量符合規則,則跳轉到防火牆中的 REJECT 目標。 因此,如果流量被拒絕,則不允許通過防火牆。
我們必須啟動netfilter-persistent
守護進程。 我們可以用這個命令來做到這一點:
sudo systemctl start netfilter-persistent
我們希望netfilter-persistent
經歷一個保存和重新加載週期,因此它會加載和控制iptable
規則。
鍵入以下命令:
sudo netfilter-持久保存
sudo netfilter-持久重新加載
您現在已經安裝了實用程序,並且 SSH 端口已關閉(希望不會終止任何人的連接)。 現在,是時候配置秘密敲門了。
配置 knockd
您可以編輯兩個文件來配置knockd
。 首先是下面的knockd
配置文件:
須藤 gedit /etc/knockd.conf
gedit
編輯器打開並加載了knockd
配置文件。
我們將編輯此文件以滿足我們的需要。 我們感興趣的部分是“openSSH”和“closeSSH”。 每個部分包含以下四個條目:
- sequence :打開或關閉端口 22 必須訪問的端口順序。默認端口是 7000、8000 和 9000 來打開它,默認端口是 9000、8000 和 7000 來關閉它。 您可以更改這些端口或將更多端口添加到列表中。 出於我們的目的,我們將堅持使用默認值。
- seq_timeout :某人必須訪問端口以觸發它打開或關閉的時間段。
- command :觸發打開或關閉操作時發送到
iptables
防火牆的命令。 這些命令要么向防火牆添加規則(以打開端口),要么將其取出(以關閉端口)。 - tcpflags :每個端口必須在秘密序列中接收的數據包類型。 SYN(同步)數據包是 TCP 連接請求中的第一個數據包,稱為三次握手。
“openSSH”部分可以理解為“必須在 5 秒內按順序向端口 7000、8000 和 9000 發出 TCP 連接請求,才能將打開端口 22 的命令發送到防火牆。”

“closeSSH”部分可以理解為“必須在 5 秒內按順序向端口 9000、8000 和 7000 發出 TCP 連接請求,才能將關閉端口 22 的命令發送到防火牆。”
防火牆規則
openSSH 和 closeSSH 部分中的“命令”條目保持不變,除了一個參數。 它們是這樣組成的:
- -A :將規則附加到防火牆規則列表的底部(對於 openSSH 命令)。
- -D :從防火牆規則列表中刪除命令(用於 closeSSH 命令)。
- INPUT :此規則與傳入的網絡流量有關。
- -s %IP% :請求連接的設備的 IP 地址。
- -p :網絡協議; 在這種情況下,它是 TCP。
- –dport :目的端口; 在我們的示例中,它是端口 22。
- -j ACCEPT :跳轉到防火牆內的接受目標。 換句話說,讓數據包通過其餘規則丟棄而不對其採取行動。
knockd 配置文件編輯
我們將對文件進行的編輯在下面以紅色突出顯示:
我們將“seq_timeout”延長到 15 秒。 這是慷慨的,但如果有人手動觸發連接請求,他可能需要這麼多時間。
在“openSSH”部分,我們將命令中的-A
(追加)選項更改為-I
(插入)。 此命令在防火牆規則列表的頂部插入新的防火牆規則。 如果您保留-A
選項,它會附加防火牆規則列表並將其放在底部。
從上到下針對列表中的每個防火牆規則測試傳入流量。 我們已經有一個關閉端口 22 的規則。因此,如果傳入流量在看到允許流量的規則之前針對該規則進行了測試,則連接被拒絕; 如果它首先看到這個新規則,則允許連接。
close 命令從防火牆規則中刪除 openSSH 添加的規則。 SSH 流量再次由預先存在的“端口 22 已關閉”規則處理。
進行這些編輯後,保存配置文件。
相關:如何在 Linux 上使用 gedit 以圖形方式編輯文本文件
knockd 控製文件編輯
knockd
控製文件更簡單。 然而,在我們深入並編輯它之前,我們需要知道我們的網絡連接的內部名稱; 要找到它,請鍵入以下命令:
ip地址
本機用於研究本文的連接稱為enp0s3
。 記下您的連接名稱。
以下命令編輯knockd
控製文件:
sudo gedit /etc/default/knockd
這是gedit
中的knockd
文件。
我們需要進行的一些編輯以紅色突出顯示:
我們將“START_KNOCKD=”條目從 0 更改為 1。
我們還從“KNOCKD_OPTS=”條目的開頭刪除了哈希#
,並將“eth1”替換為我們的網絡連接名稱enp0s3
。 當然,如果你的網絡連接是eth1
,你不會改變它。
證據就在布丁裡
是時候看看這是否有效。 我們將使用以下命令啟動knockd
守護進程:
sudo systemctrl start knockd
現在,我們將跳到另一台機器上並嘗試連接。 我們在那台電腦上也安裝了knockd
工具,不是因為我們要設置端口敲門,而是因為knockd
包提供了另一個名為knock
的工具。 我們將使用這台機器在我們的秘密序列中開火併為我們敲門。
使用以下命令將您的連接請求的秘密序列發送到 IP 地址為 192.168.4.24 的端口敲擊主機上的端口:
敲 192.168.4.24 7000 8000 9000 -d 500
這告訴knock
以 IP 地址 192.168.4.24 的計算機為目標,並依次向端口 7000、8000 和 9000 發出連接請求,它們之間的-d
(延遲)為 500 毫秒。
然後一個名為“dave”的用戶向 192.168.4.24 發出 SSH 請求:
ssh 戴夫@192.168.4.24
他的連接被接受,他輸入他的密碼,他的遠程會話開始。 他的命令提示符從dave@nostromo
變為dave@howtogeek
。 要註銷遠程計算機,他鍵入:
出口
他的命令提示符返回到他的本地計算機。 他再次使用knock
,這一次,它以相反的順序鎖定端口以關閉遠程計算機上的 SSH 端口。
敲 192.168.4.24 9000 8000 7000 -d 500
誠然,這不是一個特別富有成果的遠程會話,但它通過端口敲門演示了端口的打開和關閉,並且適合單個屏幕截圖。
那麼,從另一面看,這是什麼樣的呢? 端口敲門主機上的系統管理員使用以下命令查看到達系統日誌的新條目:
尾 -f /var/log/syslog
- 您會看到三個 openSSH 條目。 當每個端口都是遠程敲門實用程序的目標時,這些都會被提升。
- 當觸發序列的所有三個階段都滿足時,會記錄一個“OPEN SESAME”條目
- 發送將規則插入
iptables
規則列表的命令。 它允許通過端口 22 上的 SSH 訪問來自給出正確秘密敲擊 (192.168.4.23) 的 PC 的特定 IP 地址。 - 用戶“dave”只連接了幾秒鐘,然後斷開連接。
- 您會看到三個 closeSSH 條目。 當遠程敲擊實用程序針對每個端口時,就會引發這些問題——它告訴端口敲門主機關閉端口 22。
- 在所有三個階段都被觸發後,我們再次收到“OPEN SESAME”消息。 該命令被發送到防火牆以刪除規則。 (關閉港口時為什麼不“關閉芝麻”?誰知道呢?)
現在iptables
規則列表中關於端口 22 的唯一規則是我們在開始時鍵入的關閉該端口的規則。 因此,端口 22 現在再次關閉。
敲它的頭
那是敲門的客廳把戲。 把它當作一種消遣,不要在現實世界中這樣做。 或者,如果必須,不要將其作為唯一的安全形式。