【问题标题】:How can I use java sockets to communicate between different networks?如何使用 java 套接字在不同网络之间进行通信?
【发布时间】:2020-01-06 19:46:57
【问题描述】:

我的客户端和服务器都有 java 程序,它们在同一个 wifi 网络中运行良好。但我需要客户端能够从开放的互联网连接到服务器。在这样的问题中

How to connect client and server with the help of ip address which are connected to internet through different wifi?

https://coderanch.com/t/667020/java/Socket-connections-networks

解决方案是手动将端口从路由器重新路由到服务器,使其对来自外部的连接开放。有没有办法只用服务器上的软件来做到这一点?我不明白为什么需要手动指定端口,因为我安装的计算机上的其他应用程序(如游戏)当然会与他们的服务器来回通信,而无需我手动进入并翻转开关。

我如何仅使用在我的服务器上运行的软件来实现这一点?

如果没有其他方法,其他应用程序如何在不手动更改路由器的情况下进行公开通信,并且通过我的路由器打开端口会导致安全问题?

【问题讨论】:

  • 你的服务器监听哪个端口?您的服务器是否有静态公共 IP 地址?
  • 典型的模式是客户端通过接触服务器开始连接;服务器侦听并等待新的客户端连接。一旦建立了套接字连接,任何一端(服务器或客户端)都可以写入或读取套接字。如果您希望 server(远程)能够启动与 client 的套接字连接 – 并且您的客户端前面有防火墙 – 那么您必须永久在防火墙上打开一个端口,从而使远程服务器可以通过某种方式进入网络以启动与客户端的套接字连接。
  • 打个比方,您可以随时(从内部)解锁并打开您家的上锁门。打开后,您可以与门口的任何人互动。但是其他任何人都不可能从外面走过去打开你锁着的前门。
  • 哦好的,非常感谢!我对 java 网络还很陌生,所以我认为我们需要为每个方向信息的传播提供一个套接字。我没有意识到一个插座可以双向使用。我会研究的!
  • 对不起,我忘了仔细检查这一点;所以如果我手动打开路由器上的服务器端口,只要我将程序安全地保存在端口上,密码保护/正确加密,它会引起任何安全问题吗?即使程序没有运行并且根本不会对程序的连接请求有任何响应?如果我需要在其他地方单独提出这个问题,请告诉我。

标签: java sockets security port router


【解决方案1】:

您需要更改应用程序的架构。目前,您的服务器位于阻止来自 Internet 的连接的防火墙后面 - 您想要这个!如果您允许来自 Internet 的所有流量不加选择地连接到您的服务器,那么它很容易受到攻击。

其他应用程序无需端口转发即可安装和通信,因为开发人员在互联网上提供了一个服务器来充当客户端之间的代理。客户端将 out 连接到通常不会在家庭网络上被阻止的 Internet。内部连接出去的危害比进来的连接in要小。

【讨论】:

  • 也许更重要的是,有没有办法在我通过套接字接受连接之前验证连接的来源?对我来说,这似乎是不可能的,但我不妨问问。另外,我确实打算提供公私钥加密密码登录来过滤端口上的流量,但我还没有做到。
  • 好的,所以我从这个问题中学到了很多东西。在这一点上,我认为我需要知道的最重要的事情是:如何从可访问的地址运行我的服务器应用程序,而不损害它所在网络的安全性;并且不只是牺牲服务器的安全性并将其置于防火墙之外?我应该以某种方式将其放在单独的网络上吗?
  • 取决于“验证来源”的含义。在接受连接请求之前,您肯定无法验证连接请求的来源 - 您需要接受连接,然后作为您设计的任何协议的一部分执行身份验证。您可能需要某种形式的身份验证,使用 PKI 或某种登录方式。我建议您考虑使用预构建的解决方案,例如使用 Facebook/Google 登录的 OpenID Connect。这可能有点雄心勃勃,在这种情况下,一个简单的登录机制可能就可以开始了。至于服务器 - 为什么不使用端口转发?
  • 值得注意的是,您正在重新发明轮子(有些人为了学习而喜欢这样做)。根据您的目标,您可能希望使用大量技术来让您更快地前进。例如,为什么不创建一个带有 Web 套接字和 JSON 的 Spring Boot Web 应用程序,使用 HTTPS/WSS 进行保护,并从提供给您的所有样板代码中受益,这样您就不必担心加密、授权、序列化等等等。您可以将其托管在 AWS 上的免费层,而不必担心防火墙的问题。
猜你喜欢
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
相关资源
最近更新 更多