简短版本:如何允许Linux服务器上的Yast防火墙允许套接字与随机(由os)选择的端口连接?
更长的版本:我更大的java程序的一部分有一个客户端使用套接字连接到服务器。初始连接是在特定端口使用ConnectionManager完成的,这为客户端提供了连接的端口和密码。我最初选择端口的方式是通过防火墙中允许的端口列表(全部高于49152)。我注意到这个新的连接会随机工作,或者拒绝连接。我的结论是,关闭或被其他东西使用的端口(试图关闭防火墙,没有帮助)。
然后建议让os选择端口,不指定端口号(按照这个构造函数:JavaDoc使用0)。这选择了一个自由端口,当防火墙关闭时,这个端口就能很好地工作。但是,防火墙阻塞连接,客户端超时。
是否设置Yast防火墙以允许套接字,而不过度暴露服务器?或者我是否可以/应该为java指定一系列端口号以选择打开的端口,并允许这些端口?
注意:我最初是在堆栈溢出上问这个问题的,并建议在这里发布。它在那里完全一样:StackQuestion。
发布于 2011-07-21 20:47:57
TCP连接可以通过源IP、源端口、目标IP和目标端口的组合来唯一标识。一个很好的例子是web服务器--每个人都在端口80上连接到它,但是它能够同时维护到同一个端口的所有连接,因为每个端口的源IP和端口是不同的。
我在这里看到的是,您通过为每个连接的客户端打开一个不同的监听端口来重新发明方向盘。以相同方式运行的协议的最佳示例是被动模式FTP。一些防火墙只是因为深入的数据包检查而发挥它的作用--由于需要打开高端口,协议检查中已经有了代码,但是对于一些被认为是“遗留”的方法来说,它是一种特定的一次性解决方案。
我建议对所有传入的客户端通信使用单一端口,这是一种更适合防火墙的方式--允许客户端连接--无论是在您的端还是在客户端,在客户端的防火墙策略可能经常会阻塞高目标端口。如果这不是问题,并且您确实指定了一系列端口并让所有端口通过防火墙,那么只需确保没有其他端口在监听它们。
发布于 2011-07-21 20:33:24
在YaST方面-您不需要这样做,您可以直接使用iptable来允许/拒绝端口。一种更好的方法是在Java中打开正确的端口--要么通过遍历一个范围,然后尝试每个端口,直到成功(绑定将抛出异常,如果其他人正在使用该端口),然后在防火墙中打开范围。
另一种方法是(程序员的问题,最好是SO :)使用套接字池,您的应用程序将使用套接字池。在柯德斯有一个好例子。
https://serverfault.com/questions/292804
复制相似问题