Eu tenho dois servidores Ubuntu 16.04, um em uma pequena caixa de intel atom itx na minha rede local e um hospedado como um VPS. Ambos foram instalados frescos na última semana. Ambas são geralmente a mesma configuração, exceto que foram envidados mais esforços para endurecer o VPS publicamente acessível. Nenhum deles teve o kernel recompilado. ambos geralmente têm o mesmo conjunto de pacotes instalados.
E ainda assim ... um deles, o VPS, insiste que os netfilters não podem ser compatíveis com os ipsets.
wolferz@unipuma ~ $ sudo shorewall check
Checking using Shorewall 5.1.6.1...
Processing /etc/shorewall/params ...
Processing /etc/shorewall/shorewall.conf...
Loading Modules...
Checking /etc/shorewall/zones...
Checking /etc/shorewall/interfaces...
Determining Hosts in Zones...
Locating Action Files...
Checking /etc/shorewall/policy...
Adding Anti-smurf Rules
Checking TCP Flags filtering...
Checking Kernel Route Filtering...
Checking Martian Logging...
Checking MAC Filtration -- Phase 1...
Checking /etc/shorewall/blrules...
ERROR: ipset names in Shorewall configuration files require Ipset Match in your kernel and iptables /etc/shorewall/blrules (line 39)
A configuração que pretendo usar depende muito dos ipsets para listas negras dinâmicas e lista branca de grandes conjuntos de IPs. Porque netfilter não se presta bem a ser alterado frequentemente ou ter listas enormes de regras (uma para cada ip ... muitas vezes milhares).
Sem a correspondência de ipset, não há nenhum avanço aqui. Apesar do fato de que estou usando o Shorewall para gerenciar o netfilter e o ipsets, isso não parece ser um problema do Shorewall. A menos que a detecção seja de alguma forma torta ... mas não tenho certeza de como confirmar sua saída.
Veja o que o Shorewall detecta como o recurso de filtro de rede do kernel no VPS.
wolferz@unipuma ~ $ sudo shorewall version
5.1.6.1
wolferz@unipuma ~ $ sudo shorewall show -f capabilities | grep IPSET
IPSET_MATCH= <== this is the problem
IPSET_MATCH_COUNTERS= <== this is not great either
IPSET_MATCH_NOMATCH= <== this is not great either
IPSET_V5=Yes
OLD_IPSET_MATCH=
wolferz@unipuma ~ $ sudo shorewall6 version
5.1.6.1
wolferz@unipuma ~ $ sudo shorewall6 show -f capabilities | grep IPSET
IPSET_MATCH_COUNTERS= <== normal for ipv6
IPSET_MATCH_NOMATCH= <== normal for ipv6
IPSET_MATCH=Yes <== correct
IPSET_V5=Yes
OLD_IPSET_MATCH=
wolferz@unipuma ~ $ uname --kernel-release
4.4.0-93-generic
wolferz@unipuma ~ $ ipset --version
ipset v6.29, protocol version: 6
wolferz@unipuma ~ $ iptables --version
iptables v1.6.0
wolferz@unipuma ~ $ ip6tables --version
ip6tables v1.6.0
Onde diz IPSET_MATCH=
e não tem nada a seguir, deve mostrar IPSET_MATCH=Yes
. Ele falha no VPS, não no servidor local. Mesmo mais curioso, o ip6tables reporta o suporte a ipset match onde o iptables não.
Eu originalmente não tinha Shorewall no servidor local (embora eu planejasse) ... então eu fui em frente e o instalei. Mas eu estava com pressa e instalei do apt, me dando a versão Shorewall 5.0.4
. Quando ele relatou que tinha capacidade completa de correspondência com o Ipset, achei que poderia ser algo específico para Shorewall 5.1.6.1
. Então eu usei o apt para remover 5.0.4
e instalei 5.1.6.1
dos tarballs como eu tinha no vps. Tanto 5.0.4
como 5.1.6.1
fornecem o mesmo resultado.
wolferz@khaos ~ $ sudo shorewall version
5.1.6.1
wolferz@khaos ~ $ sudo shorewall show -f capabilities | grep IPSET
IPSET_MATCH_COUNTERS=Yes
IPSET_MATCH_NOMATCH=Yes
IPSET_MATCH=Yes
IPSET_V5=Yes
OLD_IPSET_MATCH=
wolferz@khaos ~ $ sudo shorewall6 version
5.1.6.1
wolferz@khaos ~ $ sudo shorewall6 show -f capabilities | grep IPSET
IPSET_MATCH_COUNTERS=
IPSET_MATCH_NOMATCH=
IPSET_MATCH=Yes
IPSET_V5=Yes
OLD_IPSET_MATCH=
wolferz@khaos ~ $ uname --kernel-release
4.4.0-93-generic
wolferz@unipuma ~ $ ipset --version
ipset v6.29, protocol version: 6
wolferz@unipuma ~ $ iptables --version
iptables v1.6.0
wolferz@unipuma ~ $ ip6tables --version
ip6tables v1.6.0
Mesma distro, mesma versão, mesmo kernel. Ok, então pensei, talvez o modelo em que eles instalaram o VPS tivesse sido manipulado. Eu decidi verificar as diferenças nos módulos instalados:
wolferz@unipuma ~ $ sudo ls -R -D /lib/modules/4.4.0-93-generic/kernel/ | grep -P '\.ko$' | sort > unipuma_sorted_modules.list
... scp para o outro host ...
wolferz@khaos ~ $ sudo ls -R -D /lib/modules/4.4.0-93-generic/kernel/ | grep -P '\.ko$' | sort > khaos_sorted_modules.list
wolferz@khaos ~ $ diff --brief --report-identical-files khaos_sorted_modules.list unipuma_sorted_modules.list
Files khaos_sorted_modules.list and unipuma_sorted_modules.list are identical
Em seguida, verifiquei a configuração real do kernel que estou usando:
wolferz@unipuma ~ $ sudo cat /boot/config-4.4.0-93-generic | grep -P '(?:NETFILTER|IPSET)' | sort > unipuma_kernel_config.list
wolferz@khaos ~ $ sudo cat /boot/config-4.4.0-93-generic | grep -P '(?:NETFILTER|IPSET)' | sort > khaos_kernel_config.list
wolferz@khaos ~ $ diff --brief --report-identical-files khaos_kernel_config.list unipuma_kernel_config.list
Files khaos_kernel_config.list and unipuma_kernel_config.list are identical
Bem, ok então. Colora-me confuso. O mesmo kernel. Mesmos módulos Mesma configuração. Capacidades diferentes. Wut?
E ... só para cortar essa linha de raciocínio no passe ... também não é o vhost. Eu tenho um terceiro servidor rodando o CentOS6 com essa mesma versão do shorewall (e versões mais antigas do netfilter / iptables / ipset) que não tem esse problema. Ele está hospedado na mesma máquina física usando a mesma virtualização (KVM) que o Ubuntu 16.04 vps acima.
... Ajuda?