Linux中避免客户端与服务端的端口冲突

 更新时间:2024年10月05日 10:05:20   作者:迎难学字  
在Linux系统中,为了防止客户端程序在分配TCP源端口时使用到服务器程序绑定的特定端口(例如12345),可以采用多种策略来避免端口冲突,总体而言,优先使用sysctl设置保留端口是最简单有效的解决方案,但也可以采用其他方法来确保端口不会发生冲突

在Linux系统中,为了防止客户端程序在分配TCP源端口时使用到服务器程序绑定的特定端口(例如12345),可以采用多种策略来避免端口冲突,首先,通过使用ip_local_reserved_ports保留端口,可以将12345端口设置为操作系统不可自动分配的端口,从而确保客户端不会使用该端口,其次,可以通过手动指定客户端源端口范围,或者使用防火墙(iptables/nftables)控制来限制某些端口的使用,此外,程序级检查和调节端口范围也是可行的方法,在某些情况下,使用SO_REUSEADDR选项允许多个程序绑定到同一个端口,尽管这并非常规推荐做法,总体而言,优先使用sysctl设置保留端口是最简单有效的解决方案,但也可以采用其他方法来确保端口不会发生冲突

使用 ip_local_reserved_ports 保留端口

通过调整 sysctl 参数,可以将 12345 端口保留为操作系统不可自动分配的端口。这会确保 client 程序不会在源端口分配时使用 12345

步骤

查看当前的保留端口:

sysctl net.ipv4.ip_local_reserved_ports

设置保留端口为 12345

sudo sysctl -w net.ipv4.ip_local_reserved_ports=12345

如果已经有其他保留端口,可以将 12345 添加进去,保留多个端口。例如,如果已经保留了 10242000,则:

sudo sysctl -w net.ipv4.ip_local_reserved_ports="12345,1024-2000"

使更改永久生效,编辑 /etc/sysctl.conf

echo "net.ipv4.ip_local_reserved_ports=12345" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

这样做可以确保操作系统不会自动分配 12345 端口作为客户端的源端口。

手动指定客户端源端口范围

你也可以通过在 client 程序中手动设置其源端口范围,避免其使用 12345 端口。这可以通过调用 bind() 函数指定客户端源端口范围,但这需要修改 client 程序的代码。

例如,在 C 语言的套接字编程中,可以通过以下代码绑定 client 程序到特定范围的端口:

struct sockaddr_in local_addr;
memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = INADDR_ANY;
local_addr.sin_port = htons(0); // 自动分配端口,但可以限制范围

// Bind client socket to a specific range (avoid 12345)
bind(client_sock, (struct sockaddr *)&local_addr, sizeof(local_addr));

通过这种方式,你可以确保客户端不会占用特定的端口。

防火墙(iptables/nftables)控制源端口分配

可以通过 iptablesnftables 来限制某些端口的使用,确保客户端程序无法绑定特定的端口,例如 12345

使用 iptables

# 阻止客户端使用 12345 作为源端口
iptables -A OUTPUT -p tcp --sport 12345 -j REJECT

使用 nftables

# 阻止客户端使用 12345 作为源端口
nft add rule inet filter output tcp sport 12345 drop

通过防火墙规则,操作系统在为 client 分配源端口时将不会使用 12345

程序级检查

你也可以在 server 程序启动时,提前检查端口 12345 是否已经被占用。如果 client 已经意外占用了该端口,server 可以主动尝试使用备用端口或等待重新绑定。

netstat -tuln | grep :12345

或者在代码中通过捕捉 bind() 错误来做相应的处理。

调节端口范围

如果你希望进一步限制系统自动分配的源端口范围,可以通过调整 ip_local_port_range 来指定一个端口范围,确保该范围不包括 12345

# 查看当前自动分配的端口范围
sysctl net.ipv4.ip_local_port_range

# 设置新的端口范围,确保不包括 12345
sudo sysctl -w net.ipv4.ip_local_port_range="1025 12344"

使用 SO_REUSEADDR

在某些情况下,如果客户端占用了端口而不影响 server 程序启动,可以在 server 中使用 SO_REUSEADDR 选项,让多个程序绑定到同一个端口,尤其是在客户端仅短暂使用端口时。请注意,这并不是常规的推荐方法,但在特定情况下可以使用。

int opt = 1;
setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

总结

为了确保 client 不使用 12345 端口,可以优先使用 sysctl 设置保留端口,这是最简单且有效的解决方案。如果需要更细致的控制,也可以通过修改客户端代码、使用防火墙规则或调整端口范围来确保端口不会冲突。

到此这篇关于Linux中避免客户端与服务端的端口冲突的文章就介绍到这了,更多相关Linux客户端与服务端的端口冲突内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Linux文本编辑器Vim

    详解Linux文本编辑器Vim

    这篇文章主要介绍了Linux文本编辑器Vim,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Linux自动化构建工具-make/Makefile使用解读

    Linux自动化构建工具-make/Makefile使用解读

    Linux项目自动化构建工具Make/Makefile指南,涵盖基础语法、高级特性及实战技巧,如变量、伪目标、模式规则、条件编译等,提升开发效率
    2025-09-09
  • linux虚拟网络设备之vlan配置详解

    linux虚拟网络设备之vlan配置详解

    这篇文章主要给大家介绍了关于linux虚拟网络设备之vlan配置的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • linux下wget命令的基本使用方法

    linux下wget命令的基本使用方法

    大家好,本篇文章主要讲的是linu下wget命令的基本使用方法,感兴趣的同学赶快来看一看,对你有帮助的话记得收藏一下哦,方便下次浏览
    2021-12-12
  • Linux文件管理使用详解

    Linux文件管理使用详解

    这篇文章主要为大家详细介绍了Linux文件管理的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • centos6.4配置163 yum源的方法

    centos6.4配置163 yum源的方法

    安装了CentOS系统,自带的YUM源更新太慢,下面介绍centos6.4配置163 yum源的方法,大家参考使用吧
    2013-12-12
  • Apache简介及安全配置方案

    Apache简介及安全配置方案

    Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。
    2014-08-08
  • Linux系统中查看当前文件夹下文件的个数实现方式

    Linux系统中查看当前文件夹下文件的个数实现方式

    本文介绍了在Linux系统中使用ls命令查看文件数量的方法,包括显示指定目录下的内容、统计文件数量等并查看当前路径下文件夹的个数,同时介绍了使用wc-l、ls及amp;ldquo;-l&rdrdquo;和grep命令的用法,并对这些命令进行了总结和应用
    2026-05-05
  • Linux中实现光盘开机自动挂载和配置本地yum源教程

    Linux中实现光盘开机自动挂载和配置本地yum源教程

    在Linux系统中,光盘自动挂载功能可以极大地方便用户管理和访问光盘数据,本教程将逐步引导你完成光盘自动挂载的设置过程,确保每次插入光盘时,系统能够自动识别并挂载光盘,从而简化文件访问流程,需要的朋友可以参考下
    2024-03-03
  • linux如何编译安装新内核支持NTFS文件系统(以redhat7.2x64为例)

    linux如何编译安装新内核支持NTFS文件系统(以redhat7.2x64为例)

    这篇文章主要介绍了linux如何编译安装新内核支持NTFS文件系统(以redhat7.2x64为例),具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-10-10

最新评论