![Linux foo-over-udp 隧道创建问题](https://linux22.com/image/693460/Linux%20foo-over-udp%20%E9%9A%A7%E9%81%93%E5%88%9B%E5%BB%BA%E9%97%AE%E9%A2%98.png)
我想创造獻(foo-over-udp) 在 linux 4.4.10 上使用 iproute2 4.5.0 建立隧道,在尝试创建隧道时出现以下错误:
sudo ip link add dev tun0 type ipip remote 172.19.0.9 local 172.19.0.8 encap fou encap-sport auto encap-dport 4444
RTNETLINK answers: Invalid argument
虽然这通常表明我提供了错误的参数,但设备仍然以奇怪的名称创建并且未配置:
10: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT
group default qlen 1
link/ipip 0.0.0.0 brd 0.0.0.0
我还应该提到,fou 和 ipip 内核模块已加载:
fou 9093 0
ip6_udp_tunnel 1967 1 fou
udp_tunnel 2547 1 fou
ipip 5260 0
ip_tunnel 13315 1 ipip
tunnel4 2389 1 ipip
我没有尝试任何其他内核版本,但我尝试了最新版本的 iproute2。我还应该提到,我尝试在 Linux 网络命名空间中进行此设置,但如果我在命名空间之外进行此设置,也会遇到同样的问题。是什么原因导致了这个问题,还有其他配置隧道的替代方法吗?根据我的观察,iproute2 是有问题的。
答案1
我能够在运行未修改的 ubuntu 16.04.01 的同一 LAN 上的两个虚拟机之间设置 FOU 隧道。它们从网络方面开始采用以下配置:
jeff@jeff-VirtualBox-ubuntu-16:~$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:97:1d:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.1.137/24 brd 192.168.1.255 scope global dynamic enp0s3
valid_lft 86358sec preferred_lft 86358sec
inet6 fe80::3675:b335:4de3:9d6c/64 scope link
valid_lft forever preferred_lft forever
jeff@jeff-VirtualBox-ubuntu-16:~$
jeff@jeff-VirtualBox-ubuntu-16-2:~$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
state UP group default qlen 1000
link/ether 08:00:27:40:13:85 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.135/24 brd 192.168.1.255 scope global dynamic enp0s3
valid_lft 86352sec preferred_lft 86352sec
inet6 fe80::7086:fe13:ab8:b44f/64 scope link
valid_lft forever preferred_lft forever
然后我运行以下命令,使用 FOU 隧道在 10 网络中配置两个虚拟机:
root@jeff-VirtualBox-ubuntu-16:~# modprobe fou
root@jeff-VirtualBox-ubuntu-16:~# ip fou add port 55137 ipproto 4
root@jeff-VirtualBox-ubuntu-16:~# ip link add name fou0 type ipip remote 192.168.1.135 local 192.168.1.137 encap fou encap-sport 55137 encap-dport 55135 dev enp0s3
root@jeff-VirtualBox-ubuntu-16:~# ip link set up dev tunl0
root@jeff-VirtualBox-ubuntu-16:~# ip link set up dev fou0
root@jeff-VirtualBox-ubuntu-16:~# ip addr add 10.0.0.137/24 dev fou0
root@jeff-VirtualBox-ubuntu-16:~#
root@jeff-VirtualBox-ubuntu-16-2:~# modprobe fou
root@jeff-VirtualBox-ubuntu-16-2:~# ip fou add port 55135 ipproto 4
root@jeff-VirtualBox-ubuntu-16-2:~# ip link add name fou0 type ipip remote 192.168.1.137 local 192.168.1.135 encap fou encap-sport 55135 encap-dport 55137 dev enp0s3
root@jeff-VirtualBox-ubuntu-16-2:~# ip link set up dev tunl0
root@jeff-VirtualBox-ubuntu-16-2:~# ip link set up dev fou0
root@jeff-VirtualBox-ubuntu-16-2:~# ip addr add 10.0.0.135/24 dev fou0
root@jeff-VirtualBox-ubuntu-16-2:~#
对我来说效果很好。您的里程可能会有所不同。8^)
答案2
确保已启用 CONFIG_NET_FOU_IP_TUNNELS,如果没有,请使用此配置重建内核。
以下命令对我有用。ip link add name fou-ipip type ipip remote 192.168.1.2 local 192.168.1.1 encap fou encap-sport auto encap-dport 6635
答案3
根据我的经验,该命令具有以下格式,与您的不匹配:
ip link add name {name} type ipip ...
一般来说,没有任何东西是“用奇怪的名称创建的”,即用一个字符序列(在本例中为“tunl0”)创建的名称,该名称不会出现在软件的输入中。因此,tunl0 设备很可能与您的操作完全无关;它可能之前就在那里。此外,它建议对您尝试创建的设备使用不同的名称,以减少与状态报告相关的混淆。
答案4
我在 Raspberry Pi 上遇到了同样的错误。我在 PC Ubuntsu 上尝试了相同的“ip link”命令,并且成功了。
原因似乎是 Vijaya 评论的 CONFIG_NET_FOU_IP_TUNNELS。
Ubuntu 电脑:
$ lsmod | grep fou
fou 28672 0
ip6_udp_tunnel 16384 1 fou
udp_tunnel 16384 1 fou
ip_tunnel 24576 3 fou,ipip,ip_gre
树莓派:
$ lsmod | grep tunnel
ip6_udp_tunnel 16384 1 fou
udp_tunnel 28672 1 fou
ip_tunnel 32768 1 ip_gre
请注意,Raspberry Pi 上的 fou 不使用 ip_tunnel mod。看来我需要自己构建内核模块。