Я хочу создать fou (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 network, но у меня такая же проблема, если я делаю это за пределами пространства имен. Что может быть причиной этой проблемы, и есть ли другая альтернатива для настройки туннеля fou? По моим наблюдениям, iproute2 проблематичен.
Мне удалось настроить туннель FOU между двумя виртуальными машинами в одной локальной сети с неизмененным Ubuntu 16.04.01. Они начали со следующей конфигурации сети:
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
Затем я выполнил следующее, чтобы настроить обе виртуальные машины в 10-сети с использованием туннеля FOU:
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 ^)
По моему опыту, команда имеет следующий формат, который не совпадает с вашим:
ip ссылка добавить имя {имя} тип ipip ...
В общем, ничего " создан со странным именем », т. е. создан с именем, которое представляет собой последовательность символов (в данном случае« tunl0 »), которая не появляется во входных данных программы. Поэтому весьма вероятно, что устройство tunl0 совершенно не связано с вашими действиями; вероятно, это было раньше. Кроме того, предлагается использовать другое имя для устройства, которое вы пытаетесь создать, чтобы избежать путаницы с отчетами о состоянии.
Убедитесь, что у вас включен CONFIG_NET_FOU_IP_TUNNELS, и перестройте ядро, если нет, с этой конфигурацией.
Следующая команда работает для мне. ip ссылка добавить имя fou-ipip тип ipip удаленный 192.168.1.2 локальный 192.168.1.1 encap fou encap-sport auto encap-dport 6635
Хотя это обычно означает, что я предоставил неправильные аргументы, устройство по-прежнему создается со странным именем, а unconfigured
tunl0
является устройством по умолчанию ipip
и создается автоматически при загрузке модуля ядра ipip
. Он загружается автоматически, когда вы выполняете свою команду, даже если она не удалась. Вы не можете избавиться от этого устройства, если используете туннелирование ipip
, вы можете либо настроить его, либо оставить ненастроенным. Если вы больше не используете ipip
, просто выгрузите модуль с помощью modprobe -r ipip
, чтобы избавиться от него.
Ответы RTNETLINK: Недопустимый аргумент
Это может означать, что некоторые параметры не поддерживаются вашим ядром или ip
.
Процитирую инструкцию по созданию туннеля IPIP over FOU из репозитория ipipou. Он достаточно всеобъемлющий, поэтому включает и ваш случай, стоит попробовать, просто замените примерные значения на свои.
на стороне сервера:
# Load FOU kernel module
modprobe fou
# Create IPIP tunnel encapsulated to FOU,
# ipip kernel module will be loaded automatically.
ip link add name ipipou0 type ipip \
remote 198.51.100.2 local 203.0.113.1 \
encap fou encap-sport 10000 encap-dport 20001 \
mode ipip dev eth0
# Add FOU listener for this tunnel
ip fou add port 10000 ipproto 4 local 203.0.113.1 dev eth0
# Assign IP address to the tunnel
ip address add 172.28.0.0 peer 172.28.0.1 dev ipipou0
# Up tunnel
ip link set ipipou0 up
на стороне клиента (клиент может находиться за NAT):
modprobe fou
ip link add name ipipou1 type ipip \
remote 203.0.113.1 local 192.168.0.2 \
encap fou encap-sport 10001 encap-dport 10000 encap-csum \
mode ipip dev eth0
# Options "local", "peer", "peer_port", "dev" can be not supported
# by old kernels and can be skipped.
ip fou add port 10001 ipproto 4 \
local 192.168.0.2 peer 203.0.113.1 peer_port 10000 dev eth0
ip address add 172.28.0.1 peer 172.28.0.0 dev ipipou1
ip link set ipipou1 up
где:
ipipou*
— имя туннельного интерфейса203.0.113.1
— публичный IP-адрес сервера198.51.100.2
— публичный IP-адрес клиента192.168.0.2
— IP-адрес клиента, назначенный eth0
10001
— локальный порт FOU клиента20001
— порт публичного FOU клиента10000
— порт общедоступного FOU сервераencap-csum
— опция добавления контрольной суммы к внутренним UDP-пакетам; можно заменить на noencap-csum
, чтобы избежать вычислений и оставить его пустым, целостность пакетов будет контролироваться внешним уровнем UDP (пока пакет находится в туннеле). eth0
— локальный базовый интерфейс для туннеля172.28.0.1
— частный IP-адрес клиента туннеля172.28.0.0
— частный IP-адрес сервера туннеляУ меня такая же ошибка на Raspberry Pi. Я попробовал ту же команду «ip link» на ПК с Ubuntu, и это сработало.
Похоже, причина в CONFIG_NET_FOU_IP_TUNNELS, который прокомментировал Виджая.
PC 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
Raspberry Pi:
$ lsmod | grep tunnel
ip6_udp_tunnel 16384 1 fou
udp_tunnel 28672 1 fou
ip_tunnel 32768 1 ip_gre
Обратите внимание, что мод ip_tunnel не используется fou на Raspberry Pi. Кажется, мне нужно собрать модуль ядра самостоятельно.