К сожалению, тайм-аут кажется жестким -, закодированным как 5 минут в исходном коде PolicyKit, в файле src/polkitbackend/polkitbackendinteractiveauthority.c
.
В строках 3231 -3236 написано:
/* TODO: right now the time the temporary authorization is kept is hard-coded - we
* could make it a propery on the PolkitBackendInteractiveAuthority class (so
* the local authority could read it from a config file) or a vfunc
* (so the local authority could read it from an annotation on the action).
*/
expiration_seconds = 5 * 60;
Таким образом, тайм-аут установлен в исходном коде на 5 минут, и в настоящее время нет условий для его изменения без перекомпиляции соответствующих частей PolicyKit.
С другой стороны, OpenSuSE Leap 15, кажется, расширил эту функциональность. Похоже, что -они интерпретировали действия ..._keep
как означающие «запомнить аутентификацию во время выполнения запрашивающего процесса», и добавили действия ..._keep_session
и ..._keep_always
как означающие «запомнить для всего этого конкретного сеанс входа в систему» и «запомнить навсегда» соответственно.
В этом случае по-прежнему можно использовать nftables в netdev семействе (, а не ip семействе ), поскольку требуется только вход . (nftables все еще не имеет выхода доступного ). Поведение dup
и fwd
в хуке ingress точно такое же, как tc -mirred mirror
и redirect
.
Я также обратил внимание на незначительную деталь :переписать адрес источника Ethernet в MAC-адрес нового исходящего интерфейса Ethernet, как это было бы сделано для действительно маршрутизируемого пакета, даже если он работает для вас без этого. Таким образом, MAC-адреса интерфейсов должны быть известны заранее. Я поместил два необходимых(eth0 и eth1 )в переменные/определения макросов, которые должны быть отредактированы с правильными значениями.
define eth0mac = 02:0a:00:00:00:01
define eth1mac = 02:0b:00:00:00:01
table netdev statelessnat
delete table netdev statelessnat
table netdev statelessnat {
chain b { type filter hook ingress device eth1 priority 0;
pkttype broadcast ether type ip ip daddr 192.168.1.255 udp dport 21027 jump b-to-a
}
chain c { type filter hook ingress device eth2 priority 0;
pkttype broadcast ether type ip ip daddr 192.168.2.255 udp dport 21027 counter jump c-to-b-a
}
chain b-to-a {
ether saddr set $eth0mac ip daddr set 192.168.0.255 fwd to eth0
}
chain c-to-b-a {
ether saddr set $eth1mac ip daddr set 192.168.1.255 dup to eth1 goto b-to-a
}
}
Отредактируйте :для тех, кто обнаружит это позже, принятый ответ от A.B дает чисто -решение nft.
Благодаря предложению A.B, теперь это работает с использованием tc, а не чисто правил nftables:
tc qdisc add dev eth2 ingress
tc filter add dev eth2 ingress \
protocol ip u32 \
match ip dst 192.168.2.255 \
match ip protocol 17 0xff \
match ip dport 21027 0xffff \
action nat ingress 192.168.2.255/32 192.168.0.255 \
pipe action mirred egress mirror dev eth0 \
pipe action nat ingress 192.168.0.255/32 192.168.1.255 \
pipe action mirred egress redirect dev eth1
tc qdisc add dev eth1 ingress
tc filter add dev eth1 ingress \
protocol ip u32 \
match ip dst 192.168.1.255 \
match ip protocol 17 0xff \
match ip dport 21027 0xffff \
action nat ingress 192.168.1.255/32 192.168.0.255 \
pipe action mirred egress redirect dev eth0
Насколько я понимаю, эти фильтры сопоставляют входящие широковещательные пакеты для UDP-порта 21027, транслируют их по широковещательному адресу для каждой из других предполагаемых подсетей(ingress
для изменения IP-адреса назначения, а не IP-адреса источника, который nat egress
изменит ), а затем продублирует/перенаправит NAT-пакеты в выходные очереди других интерфейсов.
Будучи новичком в tc, это может быть не лучший способ решить проблему, но он работает с точки зрения передачи объявлений по сегментам (и Syncthing с радостью обнаруживает новые узлы ).