如何禁用IPv4映射的IPv6?

在我的Linux机器上,我有各种各样的守护进程,可以绑定到::上的所有支持IPv6的接口。 当他们这样做的时候,Linux发送IPv4请求到那个被映射为例如::ffff:198.51.100.37守护进程。

相反,如果守护进程绑定到:: IPv4连接将被拒绝,只有IPv6连接被接受。 要接收IPv4连接,我希望守护进程必须显式绑定到0.0.0.0 (以及: ::

换句话说,我想在IPv6上运行一个服务,而不是在IPv4上运行。

有没有办法做到这一点?

这是由net.ipv6.bindv6only sysctl控制的。 将以下内容添加到/etc/sysctl.conf并运行sudo sysctl -p来实现更改。

 net.ipv6.bindv6only=1 

应用程序也可以显式地只绑定到IPv6地址,而不是全局更改,例如,nginx具有listen指令的ipv6only选项。 这对应于setsockopt()IPV6_V6ONLY选项。