如何从Linux完全动态地禁用IPv4堆栈?


17

如何从Linux 禁用IPv4堆栈?我想动态地做到这一点,即有时我要启用它,有时我只需要IPv6堆栈。有任何便携式方法可以做到这一点吗?如果您知道如何在任何发行版中执行此操作,那么它也对我有很大帮助。


2
@kasperd自2011
迈克尔·汉普顿

Answers:


21

在IRC上聊了一会之后,人们普遍认为linux内核在ipv4和ipv6之间共享一些代码,这可能使得完全禁用ipv4完全不可能。您可以尝试编译没有ipv4部分的内核,但在这种情况下ipv6可能无法编译(但是没有任何事情可以阻止您尝试!)。

您可以从接口AFAIK中删除ipv4地址,但是我认为目前无法完全禁用ipv4。

编辑:make menuconfig对内核2.6.36 进行快速检查之后,我无法找到一种在不禁用整个TCP / IP堆栈(也就是ipv6)的情况下禁用ipv4的方法。


4

如果这是给开发人员的,则可以使用“库插入”,通过LD_PRELOAD某些带有存根函数的已篡改的库,这些存根函数可以简单地返回错误(或根据星期几或其他外部条件来调用实际的错误)。


2

我认为不可能完全禁用IPv4,但是根据您的目标,使用所有IPv4流量丢弃iptables可能就足够了,不是吗?

这样的事情应该起作用。我尚未在任何计算机上对其进行测试,因为我正在通过IPv4访问它们。

sudo iptables -I INPUT -j DROP
sudo iptables -O OUTPUT -j DROP

1
这将阻止流量,这有时可能有用。但它不会阻止程序绑定IPv4套接字。这是完全禁用IPv4所必需的。
迈克尔·汉普顿

我在仅需要运行IPv6的计算机上所做的操作是禁用中的DHCP客户端/etc/network/interfaces.d。它与禁用IPv4不太一样,因为systemd-resolved它仍在监听127.0.0.53:53。但是这足以解决我的迫切需要,而且宁愿与之相处iptables
kasperd

1

通常,您应该在没有ipv4模块的情况下重新编译内核。软呢帽

您不能完全禁用它,因为系统使用127.0.0.1回送接口。
但是您可以使用if-cfg命令禁用某些ipv4功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.