通过Yast FireWall允许套接字

短版本:如何让Linux服务器上的Yast防火墙允许套接字随机(通过os)select的端口连接?

更长的版本:我的较大的Java程序的一部分有一个客户端连接到服务器使用套接字。 初始连接是通过一个ConnectionManager在特定的端口完成的,它给客户端一个连接的端口和密码。 我最初select端口的方式是通过我在防火墙允许的端口列表(全部在49152以上)。 我注意到这个新的连接会随机工作,或拒绝连接。 我的结论是,closures或使用其他东西的端口(试图closures防火墙,没有帮助)。

然后有人build议,我让os通过不指定端口号(按照此构造函数使用0: JavaDoc )来select端口。 这个挑选了一个免费的端口,当防火墙closures时,这个端口是完美的。 但是,防火墙会阻止连接,并且客户端超时。

无论如何设置Yast防火墙允许sockets,而不会过度暴露服务器? 或者,我可以/应该指定一个端口号的范围为Javaselect一个开放的,并允许这些端口?

注意:我最初问这个在stackoverflow,并build议在这里发布。 它在那里完全一样: StackQuestion 。

TCP连接能够通过源IP,源端口,目的IP和目的端口的组合来唯一标识。 Web服务器就是一个很好的例子 – 每个人都可以通过端口80连接到它,但是它可以同时将所有这些连接保持在同一个端口上,因为每个端口的源IP和端口是不同的。

我在这里得到的是,你有点重新发明轮子,为每个连接的客户打开一个独特的监听端口。 以相同方式运行的协议的最佳示例是被动模式FTP。 有些防火墙只是因为深入的数据包检测才能使用它,因为需要打开高端口,所以在协议检查中有一些代码,但是它是一种被认为是“传统”方式的特定的一次性解决方法的东西。

我build议使用一个端口来处理所有传入的客户端stream量,这是一种防火墙友好的方式,允许客户端连接 – 无论是在客户端还是在客户端,防火墙策略通常都会阻塞高端目标端口。 如果这不是一个问题,你可以指定一系列的端口,只要让他们通过防火墙,只要确保没有其他人在监听。

在YaST方面 – 您不需要这样做,您可以直接使用iptables来允许/拒绝端口。 一个更好的方法是在Java中打开正确的端口 – 通过迭代遍历一个范围,并尝试每一个,直到成功(绑定将抛出exception,如果别人正在使用端口),然后在防火墙中打开范围。

另一种方法是(这是程序员的问题,更好的:))使用套接字池,你的应用程序将使用。 Koders就是一个很好的例子 。