Я пытаюсь настроить программный маршрутизатор с целью маршрутизации пакетов на прокси-сервер на маршрутизаторе. В учебнике, который я читаю, есть следующие правила маршрутизации:
ip rule add fwmark 1 table 100
ip route add local 0.0.0.0/0 dev lo table 100
и следующие правила iptables:
iptables -t mangle -N V2RAY
iptables -t mangle -A V2RAY -d [Private Addresses] -j RETURN
iptables -t mangle -A V2RAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 1
iptables -t mangle -A V2RAY -p tcp -j TPROXY --on-port 12345 --tproxy-mark 1
iptables -t mangle -A PREROUTING -j V2RAY
Все работает отлично. Но теперь я перехожу к использованию systemd-networkd
, чтобы избежать сценариев запуска, и у меня возникают проблемы с преобразованием ip route add local 0.0.0.0/0 dev lo table 100
в язык systemd-networkd
.
Мой первый вопрос: что делает этот маршрут? На данный момент я понимаю:
iptables
добавить отметку 1 стены межсетевого экрана. устройство lo
? Зачем нам здесь нужен маршрут? Не может iptables справиться с этим напрямую? Мой второй вопрос: как это сделать в systemd-networkd
.
Для сопоставления пакетов с меткой 1 это кажется простым (и работало на моем маршрутизаторе):
[Match]
Name = *
[RoutingPolicyRule]
FirewallMark = 1
Table = 100
Я не уверен, требуется ли Name = *
.Гарантирует ли это, что любой пакет от любого устройства, если он имеет отметку 1, будет маршрутизирован с использованием таблицы 100? Или я могу сопоставить здесь какое-то конкретное сетевое устройство?
Однако я не могу проложить маршрут в systemd-networkd. Моя попытка такова:
[Match]
Name = lo
[Route]
Type = local
Destination = 0.0.0.0/0
Table = 100
Но кажется, что это не дает никакого эффекта: ip route show table 100
на самом деле дает:
Error: ipv4: FIB table does not exist.
Dump terminated
Как мне подойти к этому?