Consegui alcançar isso com o seguinte conjunto de regras nftables
(eu tive que criar nft
a partir da fonte como v0.5, que vem com o Ubuntu 16.04 não suporta mangling de campos de pacotes ):
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
}
}
e as seguintes entradas em /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
Isso não "descontrolará" o IP de origem dos pacotes de saída, ou seja, os gadgets ainda veem solicitações do servidor como provenientes de 192.168.101.1
, 192.168.102.1
etc em vez de 192.168.0.1
- em meu aplicativo isso não acontece importa, mas provavelmente poderia ser endereçada com regras adicionais na cadeia output
.