TCP/IP基础知识:目标端口的相关性

3

好的,这有点尴尬,但我有一个相当“新手”的问题。

在客户端服务器TCP通信中,我的系统是客户端,访问远程服务器,例如端口XX,在这种情况下,客户端是不是会在其系统中打开一个随机端口YY来与远程端口XX通信? 因此,当我们编写代码时,确实会指定目标端口XX,对吗?

对于客户端而言,套接字创建时自己选择端口YY,是吗?

有没有办法监视/限制/控制任何客户端与特定服务器通信?(例如,客户端与在特定服务端口上运行的服务器进行通信)

有没有IPTABLE规则或一些防火墙规则限制客户端? 这是否能够做到?

目标端口是否保存在套接字结构中?如果是的话,保存在哪里?

谢谢!


顺便提一下,客户端可以明确指定它的端口,因此客户端的端口并不总是随机的。 - Victor Sorokin
2个回答

5

首先,服务器端使用socket(2)bind(2)listen(2)调用创建一个监听套接字,然后使用accept(2)调用等待传入的客户端连接请求。一旦客户端连接(客户端上使用socket(2)connect(2)),且客户端和服务器机器的TCP/IP协议栈完成三次握手accept(2)将返回新的套接字描述符,这是服务器端的已连接套接字。服务器端的bind(2)和客户端的connect(2)都需要服务器地址和端口

现在,完整的TCP连接由四个数字描述 - 服务器地址、服务器端口、客户端地址和客户端端口。前两个数字显然必须在连接尝试之前为客户端所知 (否则我们去哪里?)。虽然可以使用 bind(2) 显式指定客户端地址和端口,但通常是动态分配的 - 地址是由 路由表 确定的出站网络接口的IP地址,端口被选择为 临时端口 范围之外。 netstat(8) 命令可以显示已建立的连接,添加 -a 标志可让您查看监听套接字,-n 标志禁用DNS和服务解析,因此您只能看到数字地址和端口。

Linux iptables(8) 允许您限制客户端连接的位置。您可以基于源和目标端口、地址等进行限制。

您可以使用 getsockname(2) 调用获取套接字本地绑定,远程绑定由 getpeername(2) 给出。

希望这能使它更清晰一些。


谢谢,讲得非常清楚 :). 感谢提供所有不同套接字例程的名称。 - user900785

1

是的,您可以创建一个防火墙规则,以阻止对XX端口的出站TCP连接。例如,一些组织阻止出站TCP端口25,以防止网络PC向远程SMTP服务器发送垃圾邮件。


谢谢JJ。如果我需要编程方式限制客户端的目标端口,这只能在内核中实现吗? - user900785
有没有Linux命令可以查看我的客户端正在与哪个目标端口通信? - user900785
“以编程方式限制客户端的目标端口”是什么意思?如果您正在编写客户端代码,可以“尝试”连接任何选择的端口。防火墙决定是否允许连接。 - JJ.
1
你可以使用 netstat -at 命令来查看系统上正在使用的 TCP 端口。 - JJ.
是的,谢谢。我正在查看内核的net/ipv4目录,并浏览内核代码以了解套接字是如何创建的。因此想知道在内核代码的哪个位置检查目标端口和服务器IP地址。 - user900785

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接