如何阻止服务(xrdp)使用特定端口?

如何阻止服务(xrdp)使用特定端口?

我是一些开发人员的管理员,他们要求机器上的端口明确用于特定目的。当其中一位开发人员去使用该端口时,它正在使用中。 Annetstat -p显示 xrdp/Xnvc 正在使用它。我尝试让用户跳下然后再打开,看看它是否会使用另一个端口,但它一直使用那个端口。

根据我的阅读,Xrdp 选择随机的开放端口。我可以弄清楚如何将该端口从服务中列入黑名单。

系统:CentOS 7,使用iptables代替firewalld

答案1

在 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 

(第一条规则将匹配端口和预期用户,并将接受流量并结束规则处理;如果该规则不匹配,第二条规则将仅匹配端口,并将拒绝任何符合该规则的人的传出流量不是该端口的预期用户。)

这不一定会防止其他用户不会尝试使用该端口,但会确保该端口始终连接失败对于他们来说,所以希望他们会停止尝试使用它。

相关内容