Играюсь тут с nftables и iptables-compat, и вот что обнаружилось.
После настройки правил через iptables-compat, они не отображаются в nft, ошибка netlink:
root@peka:/# iptables-compat -F
root@peka:/# iptables-compat -P INPUT DROP
root@peka:/# iptables-compat -A INPUT -i lo -j ACCEPT
root@peka:/# iptables-compat -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
root@peka:/# iptables-compat-save
# Generated by xtables-save v1.6.0 on Wed May 8 16:52:27 2019
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Wed May 8 16:52:27 2019
root@peka:/# nft list ruleset
table ip filter {
chain INPUT {
type filter hook input priority 0; policy drop;
counter packets 0 bytes 0 accept
counter packets 0 bytes 0 accept
}
chain FORWARD {
type filter hook forward priority 0; policy accept;
}
chain OUTPUT {
type filter hook output priority 0; policy accept;
}
}
netlink: Error: Relational expression size mismatch
netlink: Error: unknown expression type 'match'
root@peka:/#
И наоборот тоже криво - если настроить через nft, а потом посмотреть iptables-compat-save, в данном случае одно правило отобразилось верно, другое нет (вместо ctstate просто ACCEPT):
root@peka:/# nft flush ruleset
root@peka:/# nft add table ip filter
root@peka:/# nft add chain ip filter INPUT { type filter hook input priority 0 \; policy drop \; }
root@peka:/# nft add rule ip filter INPUT iifname lo accept
root@peka:/# nft add rule ip filter INPUT ct state {established, related} accept
root@peka:/# nft list ruleset
table ip filter {
chain INPUT {
type filter hook input priority 0; policy drop;
iifname "lo" accept
ct state { related, established} accept
}
}
root@peka:/# iptables-compat-save
# Generated by xtables-save v1.6.0 on Wed May 8 16:53:05 2019
*filter
:INPUT DROP [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -j ACCEPT
COMMIT
# Completed on Wed May 8 16:53:05 2019
root@peka:/#
root@peka:/#
И это тривиальный случай с двумя простыми правилами.
ЧСХ, никаких ошибок в iptables-save, просто отображается совершенно другое правило (и так, глядя на его выхлоп, можно долго думать, чего это ничего не работает).
Это так и должно быть? Если правила нового iptables несовместимы с nft, в чем его (iptables-compat) смысл? Понятно, что он загружает правила в ядерный nft, но зачем? Тем более, если вносится такая путаница.
Да, понятно, что не все правила можно представить в виде синтаксиса iptables (логично - иначе не было бы смысла велосипедить nft). Но почему не работает обратный случай?
Был бы нормальный юзкейс - загрузить правила в iptables и сохранить конфиг nft, и в нём уже добавлять новые фишки nftables. А так получается буквально тот же iptables без новых возможностей, только реализованный в ядре другим модулем. Но зачем, когда есть работающий и проверенный временем iptables (который теперь будет iptables-legacy)?