我目前正在实施仅支持 IPv6 的服务。由于该服务也应使用 IPv4 来使用,因此我正在实施转换器。
在翻译服务器中,我需要添加一条通往不同网络的路由才能正确翻译。我遇到的问题是首选路由是通过lo
接口,而不是使用我的特定路由条目。
想象一下 4 个设备连接到同一个 VLAN 的场景,如下所示:
Gateway (192.168.132.1) --------------|----------|
Server (192.168.132.85) --------------|Switch |
Translator (192.168.132.87) ----------|same vLan |
Firewall (service 2001:db8:1::44) ----|----------|
注意:服务器和翻译器都是虚拟机(VMWare),以防万一这很重要。
所有设备都/24
在其 IPv4 接口上定义了掩码。
可行的方案
在网关上定义这样的路线:
ip -4 route add 192.168.132.95/32 via 192.168.132.87
从 Internet 上,它更喜欢该路由,而不是使用直接连接到同一网段的接口,因为掩码/32
比接口/24
掩码更具体。该图tcpdump
演示了流量进入转换器,然后从那里被转换为 IPv6 并像它应该的那样进入防火墙。那里没有问题。
缺点是它只适用于流量来自互联网的情况,但如果流量来自防火墙(例如到达另一项服务),它就不起作用。应该有必要在防火墙中定义相同的路由。并且还应该在服务器中完成,以防服务器需要使用相同的服务。很难维护。
不起作用的场景
最好的解决方案是让转换器“回答”192.168.132.95
请求,而不是在任何其他设备中执行此操作。问题是转换器已硬编码为忽略目标地址与其正在转换的命名空间的接口之一匹配的数据包。
因此,我决定使用一个新的命名空间。很简单,对吧?
嗯,还没能让它工作。
我有这个基于以下构建的测试脚本这个文件。区别在于,文档的目标是从左侧服务器内部到达右侧服务器,而我想要从任何地方到达翻译器表单。
#!/bin/bash
# 1: Create the virtual interfaces and the new namespace
ip netns add joolns
ip link add name to_jool type veth peer name to_world
ip link set up dev to_jool
ip link set dev to_world netns joolns
ip netns exec joolns ip link set up dev to_world
#2: Determine link-local addresses of veth pair (used as nexthops later)
LL_TO_JOOL=$(ip -6 -br address show scope link dev to_jool | awk '{print $3}' | awk -F"/" '{print $1}')
LL_TO_WORLD=$(ip netns exec joolns ip -6 -br address show scope link dev to_world | awk '{print $3}' | awk -F"/" '{print $1}')
#3: Set up IP addressing and routing inside the Jool namespace
ip netns exec joolns ip -6 route add default via $LL_TO_JOOL dev to_world
ip netns exec joolns ip -4 address add 192.168.0.2/24 dev to_world
#4: Set up IP addressing and routing in the global namespace
#IPv4:
echo 1 > /proc/sys/net/ipv6/conf/ens224/proxy_ndp
#IPv6:
echo 1 > /proc/sys/net/ipv6/conf/ens256/proxy_ndp
### DOESN'T WORK USING proxy JUST DON'T ANSWER PING
#if (ip neigh show proxy | grep 192.168.132.95); then
# ip -4 neigh del proxy 192.168.132.95 dev ens256
#fi
#ip -4 neigh add proxy 192.168.132.95 dev ens256
### DOESN'T WORK USING arp -s JUST DON'T ANSWER PING
#if (arp -a | grep 192.168.132.95); then
# arp -d 192.168.132.95
#fi
#arp -s 192.168.132.95 $(ip a show ens256 |grep ether | awk '{print $2}')
#HAD TO CONFIGURE 192.168.132.95 DIRECTLY IN THE ens256 INTERFACE
#USING nmtui. tcpdump shows ARP requests, but never capture any answer
#even without any jool configuration, and doing "modprobe -r jool_siit"
#with the nmtui configuration was the only way packets reached the translator
ip -4 address add 192.168.0.1/24 dev to_jool
ip -4 route add 192.168.132.95/32 via 192.168.0.1 dev to_jool #<<<<<*****
echo 1 | tee /proc/sys/net/ipv6/conf/*/forwarding
#5: Fire up Jool inside joolns
modprobe jool_siit
ip netns exec joolns sysctl -w net.ipv4.conf.all.forwarding=1
ip netns exec joolns sysctl -w net.ipv6.conf.all.forwarding=1
ip netns exec joolns jool_siit instance add --netfilter --pool6 fd79:db8:ee00::/96
ip netns exec joolns jool_siit eamt add 192.168.132.95 2001:db8:1::44
它会生成一个单独的网络命名空间,供翻译器运行,因此它应该可以工作。
问题是没有数据包到达翻译器。甚至不是因为路由(<<<<<*****
上面的评论)
如果我检查使用了哪条路线,它总是以lo
接口开头:
[root@srv ~]# ip route get 200.33.163.95
local 192.168.132.95 dev lo src 192.168.132.87
cache <local>
[root@srv ~]#
我可以看到传入的数据包192.168.132.95
,但是我从未看到发往的数据包2001:db8:1::44
,也没有看到发往to_jool
接口的数据包。
如果我不192.168.132.95
使用 nmtui 进行配置,而是使用arp -s
或ip -4 neigh add proxy
,我只会看到 ARP 请求,如下所示:
[root@srv ~]# tcpdump -n -l -i ens256 "host 192.168.132.85"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens256, link-type EN10MB (Ethernet), capture size 262144 bytes
22:38:16.418578 ARP, Request who-has 192.168.132.95 tell 192.168.132.85, length 46
22:38:18.415886 ARP, Request who-has 192.168.132.95 tell 192.168.132.85, length 46
22:38:19.418514 ARP, Request who-has 192.168.132.95 tell 192.168.132.85, length 46
22:38:20.420487 ARP, Request who-has 192.168.132.95 tell 192.168.132.85, length 46
4 packets captured
4 packets received by filter
0 packets dropped by kernel
[root@srv ~]#
如果有人需要更多信息,请告诉我。
有人知道如何解决这个问题吗?
我如何验证接收到的数据包去往何处以及为什么不使用192.168.132.95/32
via (据我所知)?192.168.0.1
谢谢。
答案1
如果有人想做类似的事情,我会在这里留下我所学到的知识。
首先,回答最初的问题,Linux 可以做到光生物反应器即使存在默认规则来将数据本地传送到直接配置到网络接口的地址,您也可以更改该规则并在本地传送之前添加路由表。
为此,您可以执行以下操作
# To override the default priority since it's needed to route local IP's
ip rule add preference 1000 lookup local
ip rule delete preference 0
然后,您可以创建优先级低于 1000 的规则并附加路由表。这些规则将在本地交付规则之前进行处理,如下所示
ip rule add from all to 1.2.3.4/24 priority 100 table 23
第二点也是最重要的一点是:翻译器对路由一无所知。事实上,您可以在同一实例中毫无问题地定义不同网络的显式地址映射表 (EAMT) 条目,因此只要操作系统可以与所有来源和目的地进行通信,就无需使用多个网络命名空间。(感谢 @ydahhrk:ungleich.ch矩阵.ungleich.ch
第三:如何保证返回的数据包使用正确的路径。
我有两个互联网服务提供商,每个服务提供商都有不同的地址。
这对我有用:
#!/bin/bash
#RESET PREVIOUSLY CREATED TABLES
ip route flush table 102 #> /dev/null 2>&1
ip rule del table 102 #> /dev/null 2>&1
ip route flush table 103 #> /dev/null 2>&1
ip rule del table 103 #> /dev/null 2>&1
#RESET TO DEFAULTS
ip rule flush > /dev/null 2>&1
ip rule add from all lookup local pref 0 > /dev/null 2>&1
ip rule add from all lookup main pref 32766 > /dev/null 2>&1
ip rule add from all lookup default pref 32767 > /dev/null 2>&1
ip route add default via 203.0.113.0.1 table 102
ip route add 203.0.113.0.0/24 dev ens192 proto kernel scope link src 203.0.113.0.123 table 102
ip rule add from 203.0.113.0.0/24 to all pref 102 table 102
ip rule add from all to 203.0.113.0.0/24 pref 102 table 102
ip route add default via 200.200.200.0.1 table 103
ip route add 200.200.200.0.0/24 dev ens256 proto kernel scope link src 200.200.200.0.123 table 103
ip rule add from 200.200.200.0.0/24 to all pref 103 table 103
ip rule add from all to 200.200.200.0.0/24 pref 103 table 103