我不确定如何ip nexthop
用于影响数据包所采取的路线及其与ip route
和nexthop
的参数的关系ip route
。行业内是否有使用标准方法?如果有,相关参考是什么?
rafiki's questions
XFRM 状态和策略允许在没有虚拟接口的情况下配置 IPsec 加密。vti
但是,我认为和接口类型xfrm
可以通过虚拟接口路由流量,以启用基于路由策略的加密。我不确定如何配置这些接口以及 XFRM 状态和策略来支持此功能。
vti
和接口类型xfrm
列出了以下链接参数:
$ ip link help type vti
Usage: ... vti [ remote ADDR ]
[ local ADDR ]
[ [i|o]key KEY ]
[ dev PHYS_DEV ]
[ fwmark MARK ]
Where: ADDR := { IP_ADDRESS }
KEY := { DOTTED_QUAD | NUMBER }
MARK := { 0x0..0xffffffff }
$ ip link help type xfrm
Usage: ... xfrm dev [ PHYS_DEV ] [ if_id IF-ID ]
[ external ]
Where: IF-ID := { 0x1..0xffffffff }
这些参数的确切含义是什么(缺乏相关文档)以及它们与 XFRM 状态和策略定义有何关系?
XFRM 状态和策略具有以下参数列表(来自手册页):
ip xfrm state { add | update } ID [ ALGO-LIST ] [ mode MODE ] [ mark MARK [ mask
MASK ] ] [ reqid REQID ] [ seq SEQ ] [ replay-window SIZE ] [ replay-seq
SEQ ] [ replay-oseq SEQ ] [ replay-seq-hi SEQ ] [ replay-oseq-hi SEQ ] [
flag FLAG-LIST ] [ sel SELECTOR ] [ LIMIT-LIST ] [ encap ENCAP ] [ coa
ADDR[/PLEN] ] [ ctx CTX ] [ extra-flag EXTRA-FLAG-LIST ] [ output-mark OUT‐
PUT-MARK [ mask MASK ] ] [ if_id IF-ID ] [ tfcpad LENGTH ]
ip xfrm policy { add | update } SELECTOR dir DIR [ ctx CTX ] [ mark MARK [ mask
MASK ] ] [ index INDEX ] [ ptype PTYPE ] [ action ACTION ] [ priority PRI‐
ORITY ] [ flag FLAG-LIST ] [ if_id IF-ID ] [ LIMIT-LIST ] [ TMPL-LIST ]
这两个与 XFRM 状态和政策相关的示例用法也可以帮助澄清这个主题。
我正在 Linux 网络命名空间中测试 iproute2 的本机 VXLAN 功能。模拟设置涉及 2 个不同的命名空间,其中包含 1 个网桥和 2 个 veth 对。
目的是使用手动单播远程地址配置在两台计算机之间建立基本的 VXLAN。
您可以使用以下脚本完全重现设置:
#!/usr/bin/env bash
set -x
# Create network namespaces
ip netns add sim-vl1-stack
ip netns add sim-vl2-stack
# Create and configure bridge links
ip link add sim-vl-br0 type bridge
ip link set dev sim-vl-br0 up
# Create and configure veth links
ip link add sim-vl1-veth0 type veth peer sim-vl1-veth0p
ip link add sim-vl2-veth0 type veth peer sim-vl2-veth0p
ip link set dev sim-vl1-veth0 master sim-vl-br0
ip link set dev sim-vl2-veth0 master sim-vl-br0
ip link set dev sim-vl1-veth0p netns sim-vl1-stack
ip link set dev sim-vl2-veth0p netns sim-vl2-stack
ip link set dev sim-vl1-veth0 up
ip link set dev sim-vl2-veth0 up
ip -n sim-vl1-stack link set dev sim-vl1-veth0p up
ip -n sim-vl2-stack link set dev sim-vl2-veth0p up
ip -n sim-vl1-stack addr add 172.20.0.1/24 dev sim-vl1-veth0p
ip -n sim-vl2-stack addr add 172.20.0.2/24 dev sim-vl2-veth0p
ip -n sim-vl1-stack link add name sim-vl1-vxlan type vxlan id 1 \
dev sim-vl1-veth0p remote 172.20.0.2 local 172.20.1.1 dstport 4789
ip -n sim-vl2-stack link add name sim-vl2-vxlan type vxlan id 1 \
dev sim-vl2-veth0p remote 172.20.0.1 local 172.20.1.2 dstport 4789
ip -n sim-vl1-stack addr add 172.20.1.1/24 dev sim-vl1-vxlan
ip -n sim-vl2-stack addr add 172.20.1.2/24 dev sim-vl2-vxlan
ip -n sim-vl1-stack link set dev sim-vl1-vxlan up
ip -n sim-vl2-stack link set dev sim-vl2-vxlan up
set +x
您可以使用以下方法拆除此设置:
#!/usr/bin/env bash
set -x
# Destroy veth links
ip link del sim-vl1-veth0
ip link del sim-vl2-veth0
# Destroy bridge links
ip link del sim-vl-br0
# Destroy namespaces
ip netns del sim-vl1-stack
ip netns del sim-vl2-stack
set +x
我不确定为什么使用 VXLAN IP 地址从一个命名空间执行 ping 到另一个命名空间会导致 VXLAN 上的 ARP 请求未得到应答。当 UDP VXLAN 数据包到达标准端口 4789 时,命名空间可能无法正确处理该数据包。为了使功能按预期工作,缺少什么?
我使用termsshark从第二个命名空间监控网络,如下所示:
ip netns exec sim-vl2-stack bash
termshark -i sim-vl2-veth0p
然后,我运行以下命令来执行 ping:
ip netns exec sim-vl1-stack ping -c 1 172.20.1.2
我观察到 ARP 请求通过 VXLAN 到达第二个网络命名空间,但是没有后续响应。
我应该如何以不同方式配置此设置才能通过 VXLAN 获取 ARP 响应?我希望能够通过使用手动单播的 VXLAN 将一组机器连接在一起,从而在一组机器之间执行第 2 层和第 3 层通信。我从两台机器的最简单配置开始,但我想以类似的方式进一步扩展它。这是我刚接触的领域,因此可能存在概念上的误解。
我正在 Linux 网络命名空间中测试 iproute2 的本机 GRE 隧道功能。模拟设置涉及 3 个不同的命名空间、2 个网桥和 4 个 veth 对。
请参阅下面的部分以完全重新创建设置。
一个网络命名空间包含具有单个 veth 接口的纯 IPv6 网络,另一个网络命名空间包含具有单个 veth 接口的纯 IPv4 网络,第三个网络命名空间包含具有两个不同 veth 接口(IPv4 和 IPv6)的双堆栈网络。
两个 IPv6 veth 对等点连接到一个网桥,而另外两个 IPv4 veth 对等点连接到另一个网桥。使用此配置,我可以使用双栈网络命名空间中 IPv4 veth 接口的远程地址在 IPv4 网络命名空间上设置 GRE 隧道。
我还更新了 IPv4 网络命名空间中的路由,以便对所有 IPv6 地址使用 GRE 隧道设备。但是,当对 IPv6 地址执行单个 ping 时,我观察到数据包已使用 GRE(以太网 > IPv4 > GRE > IPv6 > ICMPv6)正确封装和发送,但自动显示 ICMP 目标端口不可达(类型 3,代码 3)消息回。当测试 TCP 连接时,我得到相同的响应。
这个错误在这种情况下意味着什么?是否有一些配置错误?我应该注意到,我可以从远程网络命名空间 ping IPv6 目标地址,没有任何问题。我对 GRE 隧道相当陌生,因此可能存在一些概念上的误解。
要重新创建设置,您可以运行以下脚本:
#!/usr/bin/env bash
set -x
# Create network namespaces
ip netns add sim-ipv4-stack
ip netns add sim-ipv6-stack
ip netns add sim-dual-stack
# Create and configure bridge links
ip link add sim-ipv4-br0 type bridge
ip link add sim-ipv6-br0 type bridge
ip link set dev sim-ipv4-br0 up
ip link set dev sim-ipv6-br0 up
# Create and configure veth links
ip link add sim-ipv4-veth0 type veth peer sim-ipv4-veth0p
ip link add sim-ipv6-veth0 type veth peer sim-ipv6-veth0p
ip link add sim-dual-veth0 type veth peer sim-dual-veth0p
ip link add sim-dual-veth1 type veth peer sim-dual-veth1p
ip link set dev sim-ipv4-veth0 master sim-ipv4-br0
ip link set dev sim-ipv6-veth0 master sim-ipv6-br0
ip link set dev sim-dual-veth0 master sim-ipv4-br0
ip link set dev sim-dual-veth1 master sim-ipv6-br0
ip link set dev sim-ipv4-veth0p netns sim-ipv4-stack
ip link set dev sim-ipv6-veth0p netns sim-ipv6-stack
ip link set dev sim-dual-veth0p netns sim-dual-stack
ip link set dev sim-dual-veth1p netns sim-dual-stack
ip link set dev sim-ipv4-veth0 up
ip link set dev sim-ipv6-veth0 up
ip link set dev sim-dual-veth0 up
ip link set dev sim-dual-veth1 up
ip -n sim-ipv4-stack link set dev sim-ipv4-veth0p up
ip -n sim-ipv6-stack link set dev sim-ipv6-veth0p up
ip -n sim-dual-stack link set dev sim-dual-veth0p up
ip -n sim-dual-stack link set dev sim-dual-veth1p up
SIM_IPV4_ADDR=172.20.0.4
SIM_IPV6_ADDR=fc00::6
SIM_DUAL_IPV4_ADDR=172.20.0.14
SIM_DUAL_IPV6_ADDR=fc00::16
SIM_IPV4_TUN6_ADDR=fc00::4
ip -n sim-ipv4-stack addr add $SIM_IPV4_ADDR/24 dev sim-ipv4-veth0p
ip -n sim-ipv6-stack addr add $SIM_IPV6_ADDR/64 dev sim-ipv6-veth0p
ip -n sim-dual-stack addr add $SIM_DUAL_IPV4_ADDR/24 dev sim-dual-veth0p
ip -n sim-dual-stack addr add $SIM_DUAL_IPV6_ADDR/64 dev sim-dual-veth1p
# Configure GRE tunnel
ip -n sim-ipv4-stack tunnel add sim-ipv4-gre0 mode gre remote $SIM_DUAL_IPV4_ADDR
ip -n sim-ipv4-stack addr add $SIM_IPV4_TUN6_ADDR/64 dev sim-ipv4-gre0
ip -n sim-ipv4-stack link set dev sim-ipv4-gre0 up
set +x
要拆除这个模拟设置,您可以运行:
#!/usr/bin/env bash
set -x
# Destroy veth links
ip link del sim-ipv4-veth0
ip link del sim-ipv6-veth0
ip link del sim-dual-veth0
ip link del sim-dual-veth1
# Destroy bridge links
ip link del sim-ipv4-br0
ip link del sim-ipv6-br0
# Destroy namespaces
ip netns del sim-ipv4-stack
ip netns del sim-ipv6-stack
ip netns del sim-dual-stack
set +x
成功创建设置后,您可以sim-ipv4-stack
使用以下命令输入命名空间:
ip netns exec sim-ipv4-stack bash
您应该在该命名空间中打开两个单独的终端,一个用于观察流量,另一个用于发送流量。
为了观察流量,您应该下载并安装termshark。一旦在主机上可用,您就可以从模拟命名空间中运行 termshark,如下所示:
ip netns exec sim-ipv4-stack bash
termshark -i sim-ipv4-veth0p
然后,您可以使用以下命令从命名空间中的其他 shell 发送流量sim-ipv4-stack
:
ip netns exec sim-ipv4-stack bash
ping -6 -c 1 fc00::16
查看 termshark,您应该观察到最初发送的是封装的 ICMPv6 数据包,然后是类型/代码目标端口无法访问的响应 ICMP 数据包。
我不确定为什么目标被认为无法访问,因为您可以从双堆栈命名空间 ping IPv6 命名空间,如下所示:
ip netns exec sim-dual-stack ping -6 -c 10 fc00::6
同样,您可以从双栈命名空间 ping IPv4 命名空间,如下所示:
ip netns exec sim-dual-stack ping -c 10 172.20.0.4
根据下面 Tom 的回答,我已将设置脚本更新为以下脚本:
#!/usr/bin/env bash
set -x
# Create network namespaces
ip netns add sim-ipv4-stack
ip netns add sim-ipv6-stack
ip netns add sim-dual-stack
# Create and configure bridge links
ip link add sim-ipv4-br0 type bridge
ip link add sim-ipv6-br0 type bridge
ip link set dev sim-ipv4-br0 up
ip link set dev sim-ipv6-br0 up
# Create and configure veth links
ip link add sim-ipv4-veth0 type veth peer sim-ipv4-veth0p
ip link add sim-ipv6-veth0 type veth peer sim-ipv6-veth0p
ip link add sim-dual-veth0 type veth peer sim-dual-veth0p
ip link add sim-dual-veth1 type veth peer sim-dual-veth1p
ip link set dev sim-ipv4-veth0 master sim-ipv4-br0
ip link set dev sim-ipv6-veth0 master sim-ipv6-br0
ip link set dev sim-dual-veth0 master sim-ipv4-br0
ip link set dev sim-dual-veth1 master sim-ipv6-br0
ip link set dev sim-ipv4-veth0p netns sim-ipv4-stack
ip link set dev sim-ipv6-veth0p netns sim-ipv6-stack
ip link set dev sim-dual-veth0p netns sim-dual-stack
ip link set dev sim-dual-veth1p netns sim-dual-stack
ip link set dev sim-ipv4-veth0 up
ip link set dev sim-ipv6-veth0 up
ip link set dev sim-dual-veth0 up
ip link set dev sim-dual-veth1 up
ip -n sim-ipv4-stack link set dev sim-ipv4-veth0p up
ip -n sim-ipv6-stack link set dev sim-ipv6-veth0p up
ip -n sim-dual-stack link set dev sim-dual-veth0p up
ip -n sim-dual-stack link set dev sim-dual-veth1p up
ip -n sim-ipv4-stack link set dev lo up
ip -n sim-ipv6-stack link set dev lo up
ip -n sim-dual-stack link set dev lo up
SIM_IPV4_ADDR=172.20.0.4
SIM_IPV6_ADDR=fc00::6
SIM_DUAL_IPV4_ADDR=172.20.0.14
SIM_DUAL_IPV6_ADDR=fc00::16
SIM_IPV4_TUN6_ADDR=fc00::4
SIM_DUAL_TUN6_ADDR=fc00::26
ip -n sim-ipv4-stack addr add $SIM_IPV4_ADDR/24 dev sim-ipv4-veth0p
ip -n sim-ipv6-stack addr add $SIM_IPV6_ADDR/128 dev sim-ipv6-veth0p
ip -n sim-dual-stack addr add $SIM_DUAL_IPV4_ADDR/24 dev sim-dual-veth0p
ip -n sim-dual-stack addr add $SIM_DUAL_IPV6_ADDR/128 dev sim-dual-veth1p
# Configure GRE tunnel
ip -n sim-ipv4-stack tunnel add sim-ipv4-gre0 mode gre remote $SIM_DUAL_IPV4_ADDR
ip -n sim-ipv4-stack addr add $SIM_IPV4_TUN6_ADDR/128 dev sim-ipv4-gre0
ip -n sim-ipv4-stack link set dev sim-ipv4-gre0 up
ip -n sim-ipv4-stack route add $SIM_DUAL_TUN6_ADDR dev sim-ipv4-gre0
ip -n sim-ipv4-stack route add $SIM_IPV6_ADDR dev sim-ipv4-gre0
ip -n sim-dual-stack tunnel add sim-dual-gre0 mode gre remote $SIM_IPV4_ADDR
ip -n sim-dual-stack addr add $SIM_DUAL_TUN6_ADDR/128 dev sim-dual-gre0
ip -n sim-dual-stack link set dev sim-dual-gre0 up
ip -n sim-dual-stack route add $SIM_IPV4_TUN6_ADDR dev sim-dual-gre0
ip -n sim-dual-stack route add $SIM_IPV6_ADDR dev sim-dual-veth1p
ip -n sim-ipv6-stack route add $SIM_DUAL_IPV6_ADDR dev sim-ipv6-veth0p
ip -n sim-ipv6-stack route add $SIM_IPV4_TUN6_ADDR dev sim-ipv6-veth0p via $SIM_DUAL_IPV6_ADDR
# Ensure that forwarding is enabled (necessary only for the sim-dual-stack namespace).
ip -n sim-ipv4-stack netns exec sysctl -w net.ipv4.conf.all.forwarding=1
ip -n sim-ipv4-stack netns exec sysctl -w net.ipv6.conf.all.forwarding=1
ip -n sim-ipv6-stack netns exec sysctl -w net.ipv4.conf.all.forwarding=1
ip -n sim-ipv6-stack netns exec sysctl -w net.ipv6.conf.all.forwarding=1
ip -n sim-dual-stack netns exec sysctl -w net.ipv4.conf.all.forwarding=1
ip -n sim-dual-stack netns exec sysctl -w net.ipv6.conf.all.forwarding=1
set +x
我必须确保在sim-dual-stack
命名空间中启用转发(即使在主机中启用转发,情况并非如此),使用:
sysctl -w net.ipv4.conf.all.forwarding=1
sysctl -w net.ipv6.conf.all.forwarding=1
完成此操作后,我可以使用以下命令sim-ipv6-stack
从sim-ipv4-stack
命名空间成功 ping 通:
ip netns exec sim-ipv4-stack ping -6 -c 10 fc00::6
更新后的脚本包括每个网络命名空间的 sysctl 更新。