为什么我在Linux部署的Springboot服务,部署成功之后,使用netstat -ntlp | grep java 命令查看对应服务监听的端口,只看到有tcp6的监听,没有tcp的监听?

这种情况可能是由于 Spring Boot 默认配置使用了 IPv6 地址而没有使用 IPv4 地址。在较新的 Linux 发行版上,IPv6 通常是默认开启的。实际上,如果你的服务正在监听 IPv6 的通配地址 ::,那么它将同时监听 IPv4(0.0.0.0)和 IPv6(::)的所有地址。换句话说,仅看到 tcp6 监听并不意味着服务无法处理 IPv4 连接。

在 Spring Boot 中,默认情况下,server.address 属性没有配置。这意味着应用程序将绑定到所有可用的网络接口(IP 地址)。换句话说,当没有显式配置 server.address 时,服务器将监听所有 IPv4(0.0.0.0)和 IPv6(::)地址。如果您需要将应用程序绑定到特定的 IP 地址,您需要显式设置 server.address 属性。

要解决这个问题,你可以尝试以下方法:

  1. 在你的 application.propertiesapplication.yml 文件中设置 server.address 属性,以便显式使用 IPv4 地址。例如:
server.address=0.0.0.0

这将会使服务器监听所有 IPv4 和 IPv6 地址。

  1. 如果你仍然希望只绑定到 IPv4 地址,你可以通过设置 Java 系统属性来禁用 IPv6。可以通过添加以下选项到你的 Java 启动命令行中来完成:
-Djava.net.preferIPv4Stack=true

这将告诉 Java 虚拟机在创建新的套接字时优先使用 IPv4。

  1. 确保在操作系统中启用了 IPv4。这取决于你的 Linux 发行版及其配置,通常,IPv4 是默认启用的。

请注意,最好还是支持 IPv6,因为它是迈向现代网络的未来。使用第一个方法(设置 server.address)会确保你的应用同时支持 IPv4 和 IPv6。

Linux机器的Ipv6模块被禁用。

如果你也遇到这种情况,意味着,你使用Springboot默认的方式启动服务之后,可能存在通过ipv4不能访问的情况。

如果网络中路由器禁止了ipv6的转发,那么机器监听tcp6也会导致服务不能正常访问

这时,要么对网络路由器进行配置。要么将机器本身的ipv6全部禁用。
方法:
sysctl net.ipv6.conf.all.disable_ipv6=1 命令是一个系统控制(sysctl)命令,用于在 Linux 系统中完全禁用 IPv6。这个命令会配置内核参数,以在所有网络接口上禁止 IPv6。当设置为 1 时,IPv6 将被禁用;当设置为 0 时,IPv6 将被启用。

要使用此命令禁用 IPv6,请在终端中运行以下命令:

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1

请注意,此命令会立即禁用 IPv6,但在系统重启后更改不会保留。

要永久禁用 IPv6,您需要编辑 /etc/sysctl.conf 文件。将以下行添加到文件末尾:

net.ipv6.conf.all.disable_ipv6=1

保存文件并退出。接下来,要加载更改,请运行以下命令:

sudo sysctl -p

现在,IPv6 已禁用且在系统重启后仍然有效。如果以后需要重新启用 IPv6,只需将值更改为 0 ,然后重新加载配置即可。

请注意,在禁用 IPv6 之前,请确保确认有关禁用 IPv6 的安全性和稳定性的潜在影响。IPv6 是为了满足互联网持续增长的需求而开发的,一些应用程序和服务可能已经开始依赖这一较新的网络协议。在这种情况下,禁用 IPv6 可能会导致连接问题或性能下降。在实施此更改之前,请确保了解所有的潜在影响。