Меня очень смущает семантика ip rules
когда дело доходит до маршрута по умолчанию.
Иногда у меня может быть несколько маршрутов по умолчанию с использованием разных шлюзов:
# ip route
default via 10.0.0.4 dev eth0 proto static metric 1024
10.0.0.0/16 dev eth0 proto kernel scope link src 10.0.0.129
45.79.69.51 via 10.0.0.4 dev eth0
169.254.0.0/16 dev rath scope link metric 1000
192.168.12.0/24 dev rath proto kernel scope link src 192.168.12.2
# ip route replace default via 192.168.12.1
# ip route
default via 192.168.12.1 dev rath
default via 10.0.0.4 dev eth0 proto static metric 1024
10.0.0.0/16 dev eth0 proto kernel scope link src 10.0.0.129
45.79.69.51 via 10.0.0.4 dev eth0
169.254.0.0/16 dev rath scope link metric 1000
192.168.12.0/24 dev rath proto kernel scope link src 192.168.12.2
В других случаях я не могу:
# ip route del default via 10.0.0.4 dev eth0
# ip route
default via 192.168.12.1 dev rath
10.0.0.0/16 dev eth0 proto kernel scope link src 10.0.0.129
45.79.69.51 via 10.0.0.4 dev eth0
169.254.0.0/16 dev rath scope link metric 1000
192.168.12.0/24 dev rath proto kernel scope link src 192.168.12.2
# ip route add default via 10.0.0.4
RTNETLINK answers: File exists
# ip route
default via 192.168.12.1 dev rath
10.0.0.0/16 dev eth0 proto kernel scope link src 10.0.0.129
45.79.69.51 via 10.0.0.4 dev eth0
169.254.0.0/16 dev rath scope link metric 1000
192.168.12.0/24 dev rath proto kernel scope link src 192.168.12.2
Но если я удалю маршрут по умолчанию, он будет изменен (или, что более вероятно, станет видимым другое правило по умолчанию):
# ip route del default via 192.168.12.1
# ip route
default via 10.0.0.4 dev eth0 proto static metric 1024
10.0.0.0/16 dev eth0 proto kernel scope link src 10.0.0.129
45.79.69.51 via 10.0.0.4 dev eth0
169.254.0.0/16 dev rath scope link metric 1000
192.168.12.0/24 dev rath proto kernel scope link src 192.168.12.2
Что здесь происходит? Почему нет ip route replace default
изменить маршрут по умолчанию? Почему нет ip route show
всегда показывать все маршруты по умолчанию?
В вашей настройке у вас есть два разных маршрута по умолчанию (с метрикой и без нее).
У вас может быть несколько маршрутов к одной и той же конечной цели с разными показателями. ip route replace
добавляет маршрут, если этот маршрут не существует, и заменяет его в противном случае. В вашем случае у вас не было маршрута по умолчанию без метрики, и ip route replace default via 192.168.12.1
добавил маршрут по умолчанию без метрики.
Еще раз: маршруты к одному и тому же пункту назначения с метрикой и без метрики - это разные маршруты!
+------------------+------------------------+------------------+
| Command | route to |route to same dst |
| | same dst exists | doesn't exists |
+------------------+------------------------+------------------+
| ip route add | error | ok |
| ip route change | ok | error |
| ip route replace | ok | ok |
| ip route del | ok | error |
+------------------+------------------------+------------------+