Мне удалось добиться этого с помощью следующего nftables
набора правил (Мне пришлось собирать nft
из исходного кода, поскольку версия 0.5, поставляемая с Ubuntu 16.04, не поддерживает искажение полей пакета):
table ip mytable {
chain prerouting {
type filter hook prerouting priority -300; policy accept;
iifname "eno2.11" ip saddr 192.168.0.222 ip saddr set 192.168.101.222
iifname "eno2.12" ip saddr 192.168.0.222 ip saddr set 192.168.102.222
iifname "eno2.13" ip saddr 192.168.0.222 ip saddr set 192.168.103.222
}
chain output {
type filter hook output priority -300; policy accept;
ip daddr 192.168.101.222 ip daddr set 192.168.0.222
ip daddr 192.168.102.222 ip daddr set 192.168.0.222
ip daddr 192.168.103.222 ip daddr set 192.168.0.222
}
}
и следующие записи в/etc/network/interfaces
:
auto eno2 # For switch management interface
iface eno2 inet static
address 192.168.2.2/24
auto eno2.11
iface eno2.11 inet static
address 192.168.101.1
netmask 255.255.255.0
auto eno2.12
iface eno2.12 inet static
address 192.168.102.1
netmask 255.255.255.0
auto eno2.13
iface eno2.13 inet static
address 192.168.103.1
netmask 255.255.255.0
Это не "распутывает" исходный IP-адрес исходящих пакетов, т.е. гаджеты по-прежнему видят запросы от сервера как исходящие от 192.168.101.1
, 192.168.102.1
и т. д., а не192.168.0.1
-в моем приложении это не имеет значения но это, вероятно, можно решить с помощью дополнительных правил в цепочке output
.
gvfs — это точка монтирования FUSE. Поскольку файловые системы FUSE не реализуются кодом ядра, root не имеет доступа автоматически. Это зависит от приложения FUSE.
Если приложению не нужны привилегии суперпользователя, может помочь его запуск под UID 1000.