Linux:有没有方便的方法来执行将其绑定到所选 IP 地址的程序?

poi*_*ige 11 linux freebsd ip jails lxc

在 FreeBSD 4.9 中,只需一个命令即可轻松完成,例如

jail [-u username]  path hostname ip-number command
Run Code Online (Sandbox Code Playgroud)

如果路径是/你像往常一样运行相同的程序,但它的所有网络通信都被限制为仅使用给定的 IP 地址作为源。有时它非常方便。

现在在 Linux 中有 LXC,它看起来与 FreeBSD jail(或 Solaris 的区域)非常相似——你能想出类似的方式来执行程序吗?

Ste*_*n D 12

在只能看到所需 IP 地址的网络命名空间内启动进程可以完成类似的事情。例如,假设我只希望 localhost 可用于特定程序。

首先,我创建网络命名空间:

ip netns add limitednet
Run Code Online (Sandbox Code Playgroud)

命名空间默认有一个环回接口,所以接下来我只需要调出它:

sudo ip netns exec limitednet ip link set lo up
Run Code Online (Sandbox Code Playgroud)

现在,我可以运行一个程序ip netns exec limitednet,它只能看到环回接口:

sudo ip netns exec limitednet ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
Run Code Online (Sandbox Code Playgroud)

如果我想将其限制为 localhost 以外的地址,我可以使用以下命令将其他接口添加到命名空间中:

ip link set DEVICE_NAME netns NAMESPACE
Run Code Online (Sandbox Code Playgroud)

在接口可能有多个 IP 地址的情况下,我必须进行更多实验,以弄清楚如何将单个 IP 地址添加到命名空间中

关于命名空间LWN 文章也很有帮助。