Iptables

如何阻止服務(xrdp)使用特定埠?

  • May 19, 2020

我是一些開發人員的管理員,他們要求為特定目的清除機器上的埠。當其中一位開發人員使用該埠時,它正在使用中。Annetstat -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 

(第一條規則將匹配埠和目標使用者,並接受流量並結束規則處理;如果該規則不匹配,第二條規則將僅匹配埠,並拒絕任何人的傳出流量不是該埠的預期使用者。)

這不一定會阻止其他使用者嘗試使用該埠,但會使該埠始終無法為他們連接,因此希望他們將停止嘗試使用它。

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