如何阻止服務(xrdp)使用特定埠?
我是一些開發人員的管理員,他們要求為特定目的清除機器上的埠。當其中一位開發人員使用該埠時,它正在使用中。An
netstat -p
表明 xrdp/Xnvc 正在使用它。我試圖讓使用者跳下來再打開,看看它是否會使用另一個埠,但它一直在使用那個埠。根據我的閱讀,Xrdp 選擇了隨機的開放埠。我可以弄清楚如何從服務中將該埠列入黑名單。
系統:CentOS 7,使用 iptables 代替 firewalld
在 TCP/IP 中,不存在“不被任何東西使用的開放埠”之類的東西。目前未使用的任何埠都將被關閉。除此之外,iptables 或任何防火牆都可以阻止某些埠的部分或全部流量。
(我真的很討厭在防火牆中談論“打開埠”,因為它會導致對 TCP 和 UDP 埠如何工作的誤解。一個埠可以在防火牆中解除阻塞,但實際上你需要一些程序或核心級服務來實際使用它,它會在正常使用埠的過程中打開埠。)
從
Xrdp(8)
手冊頁:-p,–埠
指定要偵聽的 TCP 埠。這會覆蓋 xrdp.ini 文件中的埠設置。
從
xrdp.ini(5)
手冊頁:埠=埠
指定 TCP 埠以偵聽傳入連接。RDP 的預設值為 3389。
因此,如果使用該選項,Xrdp 將使用該選項指定的埠,如果不使用該選項,則使用配置文件
-p
中指定的埠。如果兩者均未指定,則使用埠 3389,這與 Windows 用於 RDP 協議的埠相同。xrdp.ini``-p
大多數傳出連接和任何未為其 TCP/UDP 套接字指定本地埠號的應用程序將預設獲取
sysctl
設置指定範圍內的本地埠號net.ipv4.ip_local_port_range
。在 RHEL/CentOS 7 中,此範圍預設為埠號 32768..60999。(每個 TCP 或 UDP 連接都會有一個本地和一個遠端埠號:傳出連接通常只指定遠端埠號並讓作業系統確定本地埠號,而為偵聽傳入連接而打開的埠通常只指定本地埠號.)
sysctl
您可以使用設置從該自動分配中排除特定埠和/或埠範圍net.ipv4.ip_local_reserved_ports
。例如,如果您需要為某些特定用途保留埠 40000 和 40001,您可以這樣做:sysctl -w net.ipv4.ip_local_reserved_ports=40000,40001
從自動分配中排除將立即生效。要使其持久化,請編輯
/etc/sysctl.conf
並將此行添加到其中:net.ipv4.ip_local_reserved_ports=40000,40001
任何顯式指定(=綁定到)以這種方式保留的埠的程序仍將正常獲取它;此保留只會覆蓋埠號的自動分配。
你真的不能做很多其他事情;如果一個普通使用者程序請求一個大於 1023 並且目前沒有被其他東西使用的特定埠號,作業系統將批准該請求。(要使用 0..1023 範圍內的埠,程序必須以 身份執行
root
,或者如果 Linux 發行版使用更細粒度的權限,則需要具備該CAP_NET_BIND_SERVICE
功能。)但是,您可以使用
iptables
規則使該埠無法用於除特定目的之外的任何東西,具體取決於該目的是什麼。例如,您可以將與該埠的傳入/傳出連接限制為僅適合特定目的的連接,或者使用iptables -m owner --uid-owner <username>
以下規則將其限制為僅對特定使用者有用:iptables -A OUTPUT -m tcp -p tcp --sport 3389 -m owner --uid-owner specified-user -j ACCEPT iptables -A OUTPUT -m tcp -p tcp --sport 3389 -j REJECT
(第一條規則將匹配埠和目標使用者,並接受流量並結束規則處理;如果該規則不匹配,第二條規則將僅匹配埠,並拒絕任何人的傳出流量不是該埠的預期使用者。)
這不一定會阻止其他使用者嘗試使用該埠,但會使該埠始終無法為他們連接,因此希望他們將停止嘗試使用它。