首页 > 系统相关 >【Kernel】关于Linux内核参数 net.ipv4.ip_local_reserved_ports

【Kernel】关于Linux内核参数 net.ipv4.ip_local_reserved_ports

时间:2024-07-22 17:51:39浏览次数:12  
标签:Kernel reserved ip 端口 local ports 端口号

网络端口号是如何分配的?

除了给常用服务保留的Well-known Port numbers之外,给客户端的端口号通常是动态分配的,称为ephemeral port(临时端口),在Linux系统上临时端口号的取值范围是通过这个内核参数定义的:net.ipv4.ip_local_port_range (/proc/sys/net/ipv4/ip_local_port_range),端口号动态分配时并不是从小到大依次选取的,而是按照特定的算法随机分配的。

综上,临时端口号是这样产生的:
生成一个随机数,利用随机数在ip_local_port_range范围内取值,如果取到的值在ip_local_reserved_ports范围内 ,那就再依次取下一个值,直到不在ip_local_reserved_ports范围内为止。

  image.png

在Linux操作系统中,与网络端口分配相关的两个重要的内核参数:ip_local_port_rangeip_local_reserved_ports

这些参数对于系统管理员和网络工程师来说非常重要,因为它们影响着网络应用程序如何选择用于TCP和UDP通信的端口。

  image.png

下面是对这两个参数的详细解读:

ip_local_port_range

ip_local_port_range 定义了TCP和UDP用于选择本地端口的范围。这个范围由两个整数表示,第一个数字是范围的起始端口号,第二个数字是范围的结束端口号。通常建议这两个数字的奇偶性不同(一个为偶数,一个为奇数),这样可以在一定程度上提高端口分配的随机性和安全性。这两个数字必须大于或等于 ip_unprivileged_port_start 这个参数定义的值,后者通常表示非特权用户进程可以使用的最小端口号。默认情况下,ip_local_port_range 的起始端口是32768,结束端口是60999。

例如,如果你看到如下的系统文件内容:

$ cat /proc/sys/net/ipv4/ip_local_port_range
32000       60999

这意味着系统为动态分配的本地端口选择的范围是从32000到60999。

ip_local_reserved_ports

ip_local_reserved_ports 是一个保留端口列表,这些端口号被特定的第三方应用程序所使用。系统在自动端口分配时(例如,当调用 connect()bind() 函数且端口号为0时)不会使用这些端口。然而,如果用户显式地指定了端口号,那么这个行为不会受到影响。

这个参数的输入和输出格式是一个由逗号分隔的端口范围列表(例如,“1,2-4,10-10”表示端口1、2、3、4和10被保留)。如果向这个文件写入新的值,系统会清除之前所有保留的端口,并更新为新输入的列表。

例如,如果你看到如下的系统文件内容:

$ cat /proc/sys/net/ipv4/ip_local_reserved_ports
8080,9148

这意味着端口8080和端口9148被保留,不会被系统自动分配给其他应用程序。

独立性和注意事项

需要注意的是,ip_local_port_rangeip_local_reserved_ports 是两个独立的设置,它们都会被内核考虑,在确定哪些端口可用于自动分配时。你可以保留一些不在当前 ip_local_port_range 内的端口,尽管这样做是多余的。但如果将来端口范围被更改为包含这些保留端口的值,这样的设置就会变得有用。同时,保留端口范围的重叠可能会影响紧随保留端口块之后的临时端口选择概率。

默认值

默认情况下,ip_local_reserved_ports 是空的,表示没有任何端口被特别保留。系统管理员可以根据需要配置这些参数,以满足特定的网络配置和安全要求。

net.ipv4.ip_local_reserved_ports 是一个 Linux 内核参数,它允许管理员指定一个端口范围,这个范围内的端口不会被内核自动分配给出去,即这些端口被预留给特定的服务或应用程序使用。这样做的目的是为了避免端口冲突,确保关键服务能够稳定地监听它们需要的端口,同时也增加了系统的安全性。

该参数的设置需要在 /etc/sysctl.conf 文件中进行,或者通过临时修改 /proc/sys/net/ipv4/ip_local_reserved_ports 文件来实现。
设置的值是一个逗号分隔的端口范围列表,例如 net.ipv4.ip_local_reserved_ports = 18080-18087, 60080-60087,这表示端口 18080 到 18087 和端口 60080 到 60087 被预留,不会被内核自动分配给其他用途。

需要注意的是,设置 net.ipv4.ip_local_reserved_ports 时,内核版本需要大于 2.6.18-164,否则不支持该参数。
此外,如果某个服务已经通过 bind() 系统调用明确地指定了端口,那么即使该端口在 ip_local_reserved_ports 指定的范围内,服务也能够成功绑定到该端口。

在Linux操作系统中,/proc/sys/net/ipv4/ip_local_reserved_ports 是一个重要的内核参数,它允许系统管理员通过指定一个端口号列表来保留这些端口,以便特定的应用程序或服务可以使用这些端口,而不是让它们被系统动态分配。这个特性在需要确保特定服务总是使用固定端口,或者需要避免端口冲突时非常有用。

然而,如果保留了过多的端口号,可能会导致可用于动态分配的端口范围变得非常有限。这是因为端口号是一个有限的资源,整个端口空间(通常是指1024到65535之间的端口号)是有限的。当大量的端口被标记为保留时,可用于动态分配的端口数量就会减少,这可能会导致端口耗尽的问题。

此外,当端口资源紧张时,动态分配的端口号可能会因为随机选择的算法导致重复。这是因为在端口资源充足的情况下,随机选择算法可以有效地分配端口,但在端口资源紧张的情况下,随机选择可能会增加端口冲突的风险。为了避免这种情况,系统管理员需要仔细规划和监控端口的使用情况,确保保留的端口数量在合理的范围内,并且对动态分配的端口进行适当的管理。

为了解决这个问题,系统管理员可以采取以下措施:

  1. 合理规划端口使用:对于需要固定端口的服务,应事先规划并保留必要的端口,避免无序地保留大量端口。

  2. 监控端口使用情况:定期检查系统的端口使用情况,确保没有过多的端口被不必要地保留。

  3. 优化动态端口分配策略:如果可能,可以调整系统的端口分配策略,使其更加高效,减少端口冲突的可能性。

  4. 使用端口范围:在某些情况下,可以为动态分配的端口设置一个范围,这样可以避免随机选择算法选择到保留的端口。

通过这些措施,系统管理员可以更好地管理端口资源,确保系统的稳定性和效率。同时,这也有助于提高系统的整体安全性,因为端口管理不善可能会导致安全漏洞。

通过合理配置 net.ipv4.ip_local_reserved_ports 参数,可以有效地管理服务器上的端口资源,避免端口被随机分配时产生的冲突,提高系统的稳定性和安全性。同时,这也是网络调优中一个重要的环节,特别是在高并发的服务器环境中,合理的端口规划和管理对于提升服务的可用性和稳定性至关重要。

参考

ip_local_reserved_ports
https://www.kernel.org/doc/html/latest/networking/ip-sysctl.html

关于Linux预留端口内核参数ip_local_reserved_ports设置
https://blog.csdn.net/michaelwoshi/article/details/121689088

How do I reserve ports for my application?
https://unix.stackexchange.com/questions/15511/how-do-i-reserve-ports-for-my-application

预留端口避免占用ip_local_reserved_ports
https://www.cnblogs.com/gaoyuechen/p/7725336.html

关于net.ipv4.ip_local_port_range的坑
https://www.jianshu.com/p/21c91c69bd94

一文带你深入理解Linux端口重用这一特性
https://zhuanlan.zhihu.com/p/486048048

net.ipv4.ip_local_port_range 的值究竟影响了啥?
https://mozillazg.com/2019/05/linux-what-net.ipv4.ip_local_port_range-effect-or-mean.html

  最后编辑于 :2024.04.16 13:54:06 ©著作权归作者所有,转载或内容合作请联系作者

作者:Bogon
链接:https://www.jianshu.com/p/d5080c9e88f2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:Kernel,reserved,ip,端口,local,ports,端口号
From: https://www.cnblogs.com/cheyunhua/p/18316575

相关文章

  • IP报文格式大全,plus版本,网络工程师收藏!
    互联网协议(IP,InternetProtocol)是互联网中的核心协议,它定义了数据包如何在网络间传输。IP报文(或数据包)是传输层发送到网络层的数据单元,包含了数据和控制信息。IP报文结构IP报文由两个主要部分组成:头部(Header)和数据(Data)。IP头部包含了路由和传输控制信息,而数据部分则是实际......
  • SLF4J: Class path contains multiple SLF4J bindings 问题解决
    背景:springboot项目名称test,在使用slf4j后,服务启动报错 报错信息:SLF4J:ClasspathcontainsmultipleSLF4Jbindings.SLF4J:Foundbindingin[jar:file:/D:/Program%20Files/Java/.m2/repository/ch/qos/logback/logback-classic/1.2.7/logback-classic-1.2.7.jar!/or......
  • Folding Strip
    第一次在考场中做出来的E题,rank也是来到了20,纪念一下,一定要相信自己呀构造方法见官方题解,证明见下:对于原始串\(s\),如果第一个(从左往右数)相同交界不折,选择折后面的交界,那么根据决策包容性,我们可以折一下第一个相同交界,答案不会更差,如下如果不折第一个交界:对于最终方案我们折一......
  • SAWarning: relationship X will copy column Q to column P, which conflicts with r
    在sqlalchemy之中,当一个字段对应多个relationship的时候。因为ORM要处理flush操作,而两个relationship可能都涉及到flush,以至于ORM无法同时兼顾。这时,sqlalchemy就会发出一个SAWarning。为了避免该类事件,可以通过以下配置来实现。假设,存在Parent和Child两个表,其中Child.parent_id......
  • Python - Adob​​e InDesign Javascript 脚本帮助从 Python 调用 JSX
    提前致谢。希望每个人都表现出色。我试图从python调用Adob​​eIndesignJSX文件,下面是示例代码:我想在Adob​​eINdesign2024或更高版本上运行它。我在PythonInDesign脚本编写上看到了一些示例:从预检中获取溢出文本框以自动调整大小作为参考,可能适用于Ado......
  • 如何在 iPhone 主屏幕上添加 Google Gemini 快捷方式
    GoogleGemini可以在iPhone上使用,但是访问方式极其隐蔽,需要在GoogleApp中才能打开使用。不过,现在我发现一种非常简单的方法,可以让你在iPhone主屏幕上或使用操作按钮直接打开使用单独的GoogleGemini应用。安卓用户可以直接使用独立的Gemini应用,而iPhone用户......
  • python pip 需要构建工具,而它已经安装
    我看到这个问题已经被发布了很多次,人们设法解决了这个问题,但我没有!!操作系统版本:Windows1021H1Build19043.1288Python版本:Python3.9.7(tags/v3.9.7:1016ef3,Aug302021,20:19:38)[MSCv.192964bit(AMD64)]onwin32Pip、wheel和setuptool都可以日期:......
  • 本地基本项目,localhost可以访问,换成本机IP却访问不了。
    1、现象描述:在本地运行自己的项目,运行后用localhost可以访问https://localhost:44313/将其替换成本机IP:10.7.20.69https://10.7.20.69:44313/却无法访问!2、错误提示:HTTPError400.Therequesthostnameisinvalid.3、问题原因:①首先关闭防火墙,防火墙会导致访问失败......
  • IP地址专用HTTPS证书的申请流程(公网、内网)
    IP地址专用HTTPS证书是一种专门为IP地址设计的SSL/TLS证书,用于通过HTTPS协议安全地访问基于IP地址实现的网站或服务。这种证书解决了没有域名的情况下,使用IP地址进行安全通信的需求。申请IP地址证书的前提条件1管理权限:首先,申请IP地址专用SSL证书实现https加密访问,需要对该......
  • IPython 使用技巧
    IPython是一个强大的交互式Pythonshell,提供了许多方便的功能,使Python编程更加高效和愉快。本文将介绍一些IPython的实用技巧,帮助开发者充分利用其功能,提高编程效率。1.基本操作和快捷键1.1启动IPython可以通过在终端输入以下命令来启动IPython:ipython启动后,你......