标签: network-namespaces

什么脚本可以允许普通用户使用网络命名空间?

我有一个使用网络命名空间(netns)的架构。我想让普通用户在这些netns中做一些操作。

我可以写一个脚本netns-exec.sh,受这篇文章的启发,用 执行sudo,包含:

ip netns exec $1 su $USER -c "$2"
Run Code Online (Sandbox Code Playgroud)

并添加到我的 sudoer 文件中:

user ALL=(ALL) /path/to/netns-exec.sh
Run Code Online (Sandbox Code Playgroud)

但我觉得它太丑了,我完全可以做噩梦。有没有更好的解决方案来允许普通用户使用命名空间?是否可以将用户放入一些有用的组?我搜索了它,但一无所获。

root sudo privileges network-namespaces

23
推荐指数
1
解决办法
7377
查看次数

仅通过 OpenVPN 为特定网络命名空间提供所有流量

我正在尝试建立一个 VPN(使用 OpenVPN),以便所有流量,只有流量,去往/来自特定进程,通过 VPN;其他进程应该继续直接使用物理设备。我的理解是,在 Linux 中执行此操作的方法是使用网络命名空间。

如果我正常使用 OpenVPN(即通过 VPN 从客户端汇集所有流量),它工作正常。具体来说,我像这样启动 OpenVPN:

# openvpn --config destination.ovpn --auth-user-pass credentials.txt
Run Code Online (Sandbox Code Playgroud)

(destination.ovpn 的编辑版本在这个问题的末尾。)

我被困在下一步,编写将隧道设备限制为命名空间的脚本。我试过了:

  1. 将隧道设备直接放在命名空间中

    # ip netns add tns0
    # ip link set dev tun0 netns tns0
    # ip netns exec tns0 ( ... commands to bring up tun0 as usual ... )
    
    Run Code Online (Sandbox Code Playgroud)

    这些命令成功执行,但在命名空间内产生的流量(例如 with ip netns exec tns0 traceroute -n 8.8.8.8)落入了一个黑洞。

  2. 假设“您[仍然]只能将虚拟以太网(veth)接口分配给网络命名空间”(如果属实,将获得今年最荒谬的不必要的API限制奖),创建一个veth对和一个网桥,以及将 veth 对的一端放在命名空间中。这甚至不会让地面上的流量下降:它不会让我将隧道放入桥中![编辑:这似乎是因为只能将分接头设备放入网桥。与无法将任意设备放入网络命名空间不同,这实际上是有道理的,网桥是以太网层的概念;不幸的是,我的 VPN 提供商不支持 Tap 模式下的 OpenVPN,所以我需要一个解决方法。]

    # ip addr add …
    Run Code Online (Sandbox Code Playgroud)

linux vpn openvpn network-namespaces

17
推荐指数
2
解决办法
7998
查看次数

使用 vpn 将端口转发到网络命名空间中的应用程序

我能够设置一个网络命名空间,使用 openvpn 建立隧道并启动一个在命名空间内使用此隧道的应用程序。到目前为止一切顺利,但是可以通过 Web 界面访问此应用程序,我不知道如何将请求路由到 LAN 内的 Web 界面。

我遵循了@schnouki 的指南,解释了如何设置网络命名空间并在其中运行 OpenVPN

ip netns add myvpn
ip netns exec myvpn ip addr add 127.0.0.1/8 dev lo
ip netns exec myvpn ip link set lo up
ip link add vpn0 type veth peer name vpn1
ip link set vpn0 up
ip link set vpn1 netns myvpn up
ip addr add 10.200.200.1/24 dev vpn0
ip netns exec myvpn ip addr add 10.200.200.2/24 dev vpn1
ip netns exec myvpn ip route add …
Run Code Online (Sandbox Code Playgroud)

iptables port-forwarding openvpn network-namespaces

15
推荐指数
2
解决办法
1万
查看次数

如何找到 veth peer ifindex 的网络命名空间?

任务

我需要明确地并且没有“整体”猜测地在另一个网络命名空间中找到veth 端的对等网络接口。

理论 。/。现实

尽管有很多文档并且在 SO 上的回答也假设网络接口的 ifindex 索引在每个主机的网络命名空间中是全局唯一的,但这在许多情况下并不成立ifindex/iflink 是模棱两可的。甚至环回已经显示出相反的情况,在任何网络命名空间中都有一个 ifindex 为 1。此外,根据容器环境,ifindex数字会在不同的命名空间中重用。这使得跟踪 veth 布线成为一场噩梦,特别是有很多容器和一个带有 veth peers 的主机桥都以@if3 左右结尾......

例子: link-netnsid0

启动一个 Docker 容器实例,只是为了获得一个新的 veth从主机网络命名空间连接到新容器网络命名空间对......

$ sudo docker run -it debian /bin/bash

现在,在主机网络命名空间中列出网络接口(我已经省略了对这个问题不感兴趣的那些接口):

$ ip链接显示
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    链接/环回 00:00:00:00:00:00 brd 00:00:00:00:00:00
...
4: docker0: mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    链接/以太 …

networking network-namespaces veth

11
推荐指数
2
解决办法
1万
查看次数

每个网络命名空间中的单独 DNS 配置

我已经在我的 Linux 系统(内核版本 3.10)上设置了几个网络命名空间,现在我想配置每个网络命名空间以拥有自己的 DNS 设置。

resolv.conf在每个/etc/netns/[namespace]目录中创建了文件,现在我想让我的系统按以下方式工作:

在 bash 命令行中,每当我nsenter --net=/run/netns/[namespace name]使用/etc/netns/[namespace name]/resolv.conf.

如果我像这样运行我的命令:

 "ip netns exec [namespace name] [command]"
Run Code Online (Sandbox Code Playgroud)

然后应用命名空间的 DNS 设置。

但是,在不带“ip netns exec”的情况下运行命令时/etc/resolv.conf,即使运行“netns get cur”表示上下文已设置为所需的网络命名空间,也会从 中获取 DNS 设置。

我尝试mount --bind /etc/netns/[namespace name]/resolv.conf /etc/resolv.conf在适当的网络命名空间的上下文中执行此操作,但这适用于整个系统中的挂载,而不是仅在该网络命名空间的上下文中。

我怀疑使用 mount 命名空间可能会有所帮助,所以我尝试阅读 mount 命名空间的手册页,但是在我致力于它的短时间内无法从中做出任何事情。

有没有一种简单而优雅的方法来实现这个目标?

对解决方案的任何帮助/方向将不胜感激!

dns namespace network-namespaces

10
推荐指数
2
解决办法
4542
查看次数

允许任何用户在特定网络命名空间中运行程序的安全方式

我有一个连接到我的服务器的蜂窝调制解调器,我想用它作为固定电话断线时获取通知电子邮件的一种方式。

为了很好地分离正常的网络访问和这种特殊的蜂窝调制解调器访问,我创建了一个网络命名空间并在那里创建了网络设备作为唯一的设备。要让程序使用蜂窝调制解调器,我只需使用ip netns exec.

问题是我想允许任何用户在命名空间中运行他们想要的任何程序,但netns exec需要 root。我的解决方案如下:

/usr/local/sbin/_oob_shim:

#!/bin/sh
cmd_line="$@"
/bin/ip netns exec oob \
    /usr/bin/sudo -u "#$SUDO_UID" -g "#$SUDO_GID" /bin/sh -c "$cmd_line"
Run Code Online (Sandbox Code Playgroud)

/etc/sudoers:

ALL ALL=NOPASSWD: /usr/local/sbin/_oob_shim
Run Code Online (Sandbox Code Playgroud)

我认为在尚未成为 root 或知道 root 密码的情况下运行 shim 的唯一方法是通过 sudo,我可以相信 sudo 将 $SUDO_UID 和 $SUDO_GID 设置为正确的值。

我是否让自己面临重大风险?或者,我应该说我错过了任何明显的警告吗?

networking sudo network-namespaces

9
推荐指数
1
解决办法
2093
查看次数

如何列出属于网络命名空间的进程?

我在 Ubuntu 12.04 上,该ip实用程序没有ip netns identify <pid>选项,我尝试安装 new iproute,但仍然,选项识别似乎不起作用!。

如果我要编写一个脚本(或代码)来列出网络命名空间中的所有进程,或者给定一个 PID,显示它属于哪个网络命名空间,我应该如何进行?(我需要一些进程的信息,以检查它们是否正确netns

linux process network-namespaces

9
推荐指数
2
解决办法
8312
查看次数

Docker 映射的端口未显示在“netstat”、“ss”和“lsof”上

我有一个关于 docker 容器和套接字的问题。今天我发现,主机系统上具有映射端口(或其他端口)的 docker 容器在我使用或时-p 80:80不会显示(也尝试过,没有机会)。然后我尝试测试,打开一个侦听器端口80 ,但没有机会,它拒绝连接端口80,尽管这个端口没有显示由某个进程打开。netstatsslsof -isudosudo nc -l -p 80

我认为这个问题是由于容器化或网络命名空间造成的,但是应该有一些命令可以按低级别、内核级别列出已使用的套接字?

ps:当我尝试在端口映射(-p 172.17.0.1:80:80)上使用 docker 主机网络接口 ip 地址时,它使用上述命令显示。

ps-2:lsof | grep -w 80输出:

lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
Xorg        718                             root   37u      CHR              13,80       0t0      10891 /dev/input/event16
Xorg        718   749 Xorg:disk             root   37u      CHR              13,80       0t0      10891 /dev/input/event16
Xorg        718   778 Xorg:disk             root   37u      CHR              13,80       0t0      10891 /dev/input/event16
Xorg …
Run Code Online (Sandbox Code Playgroud)

networking linux-kernel namespace docker network-namespaces

9
推荐指数
1
解决办法
4237
查看次数

网络命名空间、ssh、X11

ssh -Y ...从一台机器(=客户端)连接(通过)到另一台机器(=服务器,实际上在我的局域网中,但它无关紧要);然后我在服务器上启动一个新的网络命名空间(简称 NNS),我启动一个 xterm(来自默认命名空间),它完美地显示在我的客户端上,最后,从 xterm 中,我加入了非默认 NNS ,

ip netns exec NNSName bash
Run Code Online (Sandbox Code Playgroud)

我可以检查我是否在新的 NNS 中,

ip netns identify $$
Run Code Online (Sandbox Code Playgroud)

我可以在新的 NNS 中运行复杂的程序,例如 OpenVPN。

问题就在这里:我想xeyes从新的 NNS 中启动一个图形应用程序(即使只是暂时),但我不能,我总是被告知:Unable to open DISPLAY=...

诚然,我只尝试了显而易见的:

DISPLAY=:0.0
DISPLAY=:10.0
DISPLAY=localhost:10.0
DISPLAY=localhost:20.0
DISPLAY=ClientName:10.0
DISPLAY=ClientIPAddress:10.0
Run Code Online (Sandbox Code Playgroud)

始终xhost +在客户端上,用于纯调试目的。

我没有问题:

  1. 通过ssh -Y ....从客户端连接到服务器,xeyes在服务器上运行并在客户端上显示它;

  2. 在服务器上启动一个新的 NNS,并在 NNS 中启动要显示在服务器上的图形应用程序(,在这种情况下忘记客户端)。

当我将这两个东西(ssh 和命名空间)放在一起时,我无法在服务器的新 NNS 中运行的客户端应用程序上显示。

看起来标准的 TCP 端口 6010 属于默认 NNS 的 ssh 会话,而新的 NNS 应该有自己的。我当然可以在新的 NNS 中启动一个 ssh 服务器并直接从客户端连接到服务器的新 …

ssh xorg x11 network-namespaces

8
推荐指数
1
解决办法
2372
查看次数

如何将“匿名”网络命名空间内的 veth 设备连接到外部?

我有一个进程调用unshare创建一个新的网络命名空间,里面只有它自己。当它调用execve启动 bash 时,ip 命令显示我只有一个lo设备。如果我还创建了一个用户命名空间并将我的进程安排为命名空间内的 root,我可以使用该ip命令启动该设备并且它可以工作。

我还可以使用该ip命令veth在此命名空间中创建设备。但它没有出现在ip netns listveth设备中,并且新设备也没有出现在根级命名空间中(正如我所期望的)。如何将veth根级命名空间中的设备连接到veth进程命名空间中的新设备?该ip命令似乎要求命名空间具有由ip命令分配的名称,而我的则不需要,因为我没有使用ip netns add它来创建它。

也许我可以通过编写自己的程序来使用 netlink 设备并进行设置。但我真的不想这样做。有没有办法通过命令行来做到这一点?

必须有办法做到这一点,因为 docker 容器也有自己的网络命名空间,而且该命名空间也是未命名的。然而,veth它内部有一个设备连接到veth它外部的设备。

我的目标是动态创建进程隔离上下文,理想情况下不需要成为容器外的 root。为此,我将创建一个 PID 命名空间、一个 UID 命名空间、一个网络命名空间、一个 IPC 命名空间和挂载命名空间。我也可以创建一个 cgroup 命名空间,但这些都是新的,我需要能够在当前支持的 SLES、RHEL 和 Ubuntu LTS 版本上运行。

我一直在处理这个命名空间,目前我的 User、PID 和 mount 命名空间工作令人满意。

/proc/pid/ns/net如果必须,我可以挂载,但我更愿意从用户命名空间内部执行此操作,因此(再次)我不必在命名空间之外成为 root。大多数情况下,一旦命名空间中的所有进程都消失了,我希望一切都消失。完成后在文件系统上清理一堆状态会不太理想。尽管在容器首次分配时临时创建它然后立即删除它比在容器退出时必须清理它要好得多。

不,我不能使用泊坞窗LXCRKT,或任何其他现有的解决方案,使得我可以依靠比沼泽标准系统工具(像其他任何IP),系统库一样的glibc和Linux系统调用。

networking network-namespaces

8
推荐指数
1
解决办法
4505
查看次数