问题标签 [iproute]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
networking - 在 docker 容器接口上应用 NetEM WAN 延迟
我想对 docker 容器的出口流量应用 NetEm 延迟。通常,我运行:
问题是我不知道容器连接到的接口。
例如,我正在运行以下容器:
然后我 ping 8.8.8.8:
我想要做的是从我的主机添加 NetEm 规则并查看 ping 时间的变化。
如果我运行ifconfig
,我会看到存在多个虚拟以太网接口(因为其他容器正在运行),但我不知道哪个连接到我感兴趣的容器:
我相信我必须将 NetEm 规则应用于这些接口之一。那是对的吗?
openwrt - 如何将使用“all”和“iif”的策略路由规则转换为OpenWRT的UCI格式?
我会理解是否可以,如果可以,如何使用指令将以下规则转换为OpenWRT UCI 格式rule
:
我还有一个添加到特定表的默认路由:
我想对于这个我将不得不使用该route
指令,我只是不确定如何并且我想更多地熟悉OpenWRT UCI执行此操作的方式。
我也想学习这一点,因为我想改进OpenWISP(开源 wifi 控制器)中的自动化设施。
提前致谢
费德里科
networking - 使用 TAP 嗅探或修改传入的 eth 数据包
我试过https://github.com/TOGoS/TUN2UDP
这允许我这样做:
我想做的是:
换句话说,我想在第 2 层拦截传入的数据包并控制阻止、修改或传递它们。
我认为也许桥接 ETH 和 TAP 是关键,但我无法弄清楚如何以我需要的方式以编程方式访问这个桥接器。
ubuntu - Ubuntu 服务器:多个 VLAN、虚拟端口和转发
我在 2 个 VLAN 中有 4 个 IP 地址。我需要使用不同的地址从 Ubuntu 服务器出去:
所有 VLAN 都通过一个 NIC 中的一根以太网电缆。
我在做什么:
1)这是我的 /etc/network/interfaces
2) 在/etc/iproute2/rt_tables 中创建路由表。在文件末尾添加:
3)运行以下命令后:
当我尝试时: curl --interface '175.176.95.119' ifconfig.co 它可以工作。另外,当我尝试: curl --interface '175.176.95.120' ifconfig.co 它可以工作。但是地址:175.176.96.119 和 175.176.96.120 它不起作用。
我该怎么做才能使用 175.176.96.119 和 175.176.96.120?谢谢!
docker - 在 Docker 中模拟网络故障
我正在尝试在 docker 中模拟部分/全部网络/容器故障,以查看我的应用程序在故障条件下的行为。我已经开始使用 pumba,但它不能正常工作。更具体地说,此命令在运行时失败,无论是通过 pumba 还是使用 docker exec 直接在容器上运行时:
具有以下输出:
现在这是它变得陌生的地方。它在我的服务容器中运行时有效实际上,它仅在通过 pumba 运行时有效,而不是在安装 iproute2 包后直接运行(rabbitmq:3.6.10,redis:4.0.1,mongo:3.5.11)时有效。它在我的应用程序容器中不起作用,所有这些容器都使用 node:8.2.1 作为基础镜像,它已经安装了 iproute2。所有容器都没有应用任何 add_caps。
ip addr
在其中一个应用程序容器上的输出:
node.js - 在 OpenShift 3 上部署自定义 NodeJS Docker 映像
基础 OpenShift NodeJS Docker 镜像没有安装 iproute 包,所以我的目标是更改基础镜像来实现这一点。我要做的是:
我更改了 6/Dockerfile 以包含缺少的包:
我构建图像:
当我开始一个 shell 会话时,我得到了这个:
ss 现在可用(iproute 包),但 node 和 npm 不可用:
我错过了任何步骤吗?帮助将不胜感激。
php - 将请求从外部 ip 路由到另一台服务器
我被困在了这一点上:
php 脚本向外部 ip 上的另一个 php 脚本发出 curl 请求,例如
我无法修改第一个脚本,不幸的是,外部 ip 永远关闭了。
因此,我需要将所有请求路由到服务器上新的相同脚本,但无法理解如何做得更好。
如果有域名而不是ip,我可以更改hosts文件。但事实并非如此。
我用谷歌搜索了 iptables,但是如何将请求连接到服务器上的确切脚本?我需要在那里做哪些改变?
networking - 无法通过第二个 NIC(两跳)建立连接
我们在 Ubuntu Xenial 中的网络路由配置有问题。
我们有许多服务器同时使用 Debian 8.4 (Jessie) 和 Ubuntu 16.04.2 (xenial) 以及完全相同的网络设置(或者至少就我们所见而言)。
它们都有两个连接到两个 VLAN(比如“A”和“B”)的 NIC,尽管其他 VLAN 都可以访问,例如从 VLAN“C”。
这两个/etc/network/interfaces
文件的格式为:
注意:为了更好的可读性,我伪造了名称和 IP。
...说xxx
Debian 机器为 100,Ubuntu 机器为 200,我正在尝试从 VLAN“C”中的 192.168.1.10 ping 到以下地址:
- 192.168.111.100:工作正常。
- 192.168.222.100:工作正常。
- 192.168.111.200:工作正常。
- 192.168.222.200:没有答案!!
“B”vlan 主要用于备份和其他“后台”流量,以避免 vlan “A”中的饱和问题。
我知道有两个网络路径来访问同一台机器不是通常的设置,我必须说,现在只能连接来自其他网络的其中一个不是一个大问题。但困扰我的是为什么 我可以访问 Debian 机器而不是 Ubuntu 机器?
甚至,另一方面,如果它在两个平台上都运行良好,我们可以考虑从 NIC "A" 关闭一些服务(例如 ssh 和后端接口)以提高安全性(我们的防火墙只允许访问 vlan "B"来自我们的 IT 人员 vlan)。
当然,正如前面的接口片段中所注释的那样,网关 行在 Ubuntu 机器中被注释掉,但那是因为否则该机器中的网络初始化会失败。实际上,这就是我们要解决的问题。
但是两台机器的路由表几乎是一样的。我能看到的唯一区别是Ubuntu 机器中的onlink标志:
...但我可以通过以下命令将其删除:
它并没有解决问题。
之后,我还尝试取消注释“VLAN B”的网关行,正如我所说,它在/etc/network/interfaces文件中被注释掉并尝试重新启动网络,但这就是发生的事情:
...并且onlink标志又回来了。
作为注释,再次注释掉该行并发出新
/etc/init.d/networking restart
命令,输出是相同的,直到机器重新启动,(即使网络,尽管 VLAN B 默认gateyay 问题,继续照常工作)。
以下是建议命令的输出:
...和有意义的部分sudo journalctl -xe
:
我搜索了很多关于能够找到一些相关信息但没有完全回答我的问题:
在我看来,对“onlink”标志的解释指出了“onlink”标志可能导致“错误的反向路由”,意思是«告诉内核它不必检查是否当前机器可以直接访问网关»所以(我想通了)内核可能认为它可以(或应该)将来自 VLAN C 的传入连接的答案路由到默认网关,而不是认为从连接开始的同一个 NIC .
- 但是,正如我所说,删除“onlink”标志似乎并没有改变任何东西。
这个unix StackExchange 答案似乎通过使用多个路由表和规则(告诉内核使用哪个表)来解决问题(我还没有测试过)。但这并不能解释为什么 Debian 机器运行良好(我检查了两台机器的/etc/iproute2/rt_tables文件,它们也相同:
所以我的最后一个假设是,它可能只是内核版本之间的实现差异,并且拥有那个 ubuntu 版本更新得多,这可能是正确的行为,所以在现代内核中,我需要使用两个不同的路由表(但我'不确定也不知道为什么......)。
因此,问题是:
我们在 Ubuntu 机器上做错了什么(或者其中有一些错误)吗?或者,相反,这是正确的行为,我们被迫设置更复杂的路由模式(通过每个 vlan 路由或通过使用两个路由表使两个默认网关再次工作)?
编辑:
现在我尝试添加静态路由来解决问题:
...但这冻结了我的 ssh 连接(认为 NIC A),即使我可以连接认为 NIC B(在 192.168.111.200)
两条规则同时似乎是不可能的:
编辑2:
我终于找到了Linux Advanced Routing & Traffic Control HOWTO,它似乎比我找到的所有其他文档更准确,特别是在它的第 4 章。规则 - 路由策略数据库我看到以下文本:
如果您想使用此功能,请确保您的内核编译时带有“IP:高级路由器”和“IP:策略路由”功能
...所以我的一切都表明,我之前关于内核实现差异的假设是正确的,具体而言,差异在于编译了这两个特性。
ip - OpenVPN:路由 SquidProxy
我正在尝试设置一个公共 squid 代理,通过世界其他地方的 VPN 服务器路由它的流量。它在 VPS 主机上的 docker 容器内运行。
使用推送网关的默认设置,我可以访问 VPS 本身上的 squidproxy,它确实通过 vpn 路由它的流量。
但是,没有外部 IP 可以访问 squid 代理。我确实有 docker 转发端口 3128:3128。
这与创建的 OpenVPN 路由有关(因为在 OpenVPN 启动之前可以访问 Squid 代理)
我发现正是这条路线似乎“阻止”了我的外部流量。
(10.91.10.5是VPN的网关)
如果我删除它,我可以再次访问 squid,但传出请求不使用 VPN。
我可以通过像这样显式添加它来使我的外部 IP 工作
(172.18.0.1 是 docker 网关)
但我需要它与任何外部 IP 一起工作。
我试过 ip route add 0.0.0.0 via 172.18.0.1 dev eth0。
但这不起作用,因为 128.0.0.0/1 更具体,所以首先匹配。
综上所述
1) 需要任何 IP 才能访问 SquidProxy(端口 3128)
2) 需要所有传出的 SquidProxy 请求 (80,443) 通过 VPN
任何帮助将不胜感激!
python - 在 Python 中检索网络命名空间的 netnsid
当试图找到veth
位于不同命名空间中的一对的正确对等网络接口时,该端不仅由其iflink
属性指示,而且由link-netnsid
. 这link-netnsid
是一个网络命名空间 ID,仅在当前网络命名空间内有意义。
Linux 内核不提供将 netnsid 映射到网络命名空间 inode 编号,这是唯一的唯一标识。但是,Linux 提供的请求将由 fd ( ) 或 PID ( )RTM_GETNSID
标识的网络名称空间映射到本地 netnsid。NETNSA_FD
NETNSA_PID
如何RTM_GETNSID
在 Python 中提出这样的请求,最好使用pyroute2
库?到目前为止,我无法成功为 PID 标识的命名空间请求 netnsid,而只能使用以下脚本返回无效参数错误 22: