Почему результат отличается между этим
ip tuntap add dev tun1 mode tun
ip link set up tun1
ip route add 1.2.3.4 via 192.168.0.1 dev eth0
ip addr add 10.0.0.1 peer 1.2.3.4 dev tun1
и это (последние две команды поменялись местами)
ip tuntap add dev tun1 mode tun
ip link set up tun1
ip addr add 10.0.0.1 peer 1.2.3.4 dev tun1
ip route add 1.2.3.4 via 192.168.0.1 dev eth0
Первый блок дает таблицу маршрутизации, которая выглядит примерно так
1.2.3.4 via 192.168.0.1 dev eth0
1.2.3.4 dev tun1 proto kernel scope link src 10.0.0.1
и последний дает это (и терпит неудачу с "ответами RTNETLINK: файл существует")
1.2.3.4 dev tun1 proto kernel scope link src 10.0.0.1
В обоих случаях у меня есть маршрут по умолчанию default via 192.168.0.1 dev eth0
.
(Вопрос в некоторой степени связан с моей настройкой VPN. Я использую службу VPN, предоставляемую моим интернет-провайдером. VPN-сервер настроен так, что общедоступный IP-адрес VPN-сервера совпадает с IP-адресом серверной части VPN-туннеля. )
Когда вы указали адрес однорангового узла в команде, маршрут к этому одноранговому адресу через интерфейс был добавлен в основную таблицу маршрутизации. Поэтому вручную добавить маршрут к тому же пункту назначения с такой же метрикой не удается.
Когда вы запускаете VPN, у вас должен быть определенный маршрут к VPN-серверу, в противном случае ваш VPN сломается, если маршрут по умолчанию будет изменен на маршрутизацию через VPN.
Я предполагаю, что это работает ip addr
автоматически создаст шлюз по умолчанию, и что этот шлюз по умолчанию конфликтует при запуске ip route
команда. При изменении порядка команд сначала должен добавляться маршрут, а затем ip addr
команда увидит существующий шлюз для этой сети и не потрудится его настроить.
Вы можете проверить это, сравнив таблицу маршрутизации после запуска только то ip addr
команда. Если эта команда добавляет две строки в таблицу маршрутизации, то это источник ошибки.