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

时间:2011-08-18 14:30:22

标签: linux network-programming linux-kernel tcpclient

好的,这有点令人尴尬,但我只是有一个相当“noob”的问题。

在客户端服务器TCP通信中,我的系统是客户端,在端口XX访问远程服务器,客户端是否在其系统中打开一个随机端口YY与远程端口XX通信? 所以当我们编码时,我们确实指定了目的端口XX吗?

对于客户端,在创建套接字时选择端口YY本身,不是吗?

无论如何我可以监控/限制/控制任何客户端与特定服务器通信吗?(比如客户端与特定服务端口的服务器通话?)

是否存在任何IPTABLE规则或某些限制客户端的防火墙规则? 这可以完成吗?

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

谢谢!

2 个答案:

答案 0 :(得分:5)

首先,服务器端创建一个侦听套接字,其中包含socket(2)bind(2)listen(2)个调用链,然后等待传入的客户端连接请求通过accept(2)电话。一旦客户端连接(socket(2)然后connect(2)在客户端)并且客户端和服务器机器的TCP / IP堆栈完成three way handshakeaccept(2)将返回新套接字描述符 - 这是连接套接字的服务器端。服务器端的bind(2)和客户端的connect(2)都使用服务器的地址和端口

现在,完整的TCP连接由四个数字描述 - 服务器地址,服务器端口,客户端地址和客户端端口。在连接尝试之前,客户端显然必须知道前两个(否则,我们去哪里?)。客户端地址和端口虽然可以使用bind(2)显式指定,但通常是动态分配的 - 地址是传出网络接口的IP地址,由routing table确定,并且选择的端口超出ephemeral ports的范围。

netstat(8)命令显示已建立的连接。添加-a标志可以让您看到侦听套接字,-n标志禁用DNS和服务解析,因此您只需看到数字地址和端口。

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

您可以通过getsockname(2)调用获取套接字本地绑定,远程绑定由getpeername(2)提供。

希望这会让它更加清晰。

答案 1 :(得分:1)

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