[pkg-netfilter-team] Bug#933531: accept hostnames with one IPv4 address and one IPv6 address in single-stack chain?

Trent W. Buck trentbuck at gmail.com
Wed Jul 31 09:54:42 BST 2019


Package: nftables
Version: 0.9.1-2
Severity: wishlist

In iptables-restore, if a hostname has 3 addresses, you will end up with 3 rules, e.g.

    -A INPUT -d www -j ACCEPT

    --expands to-->

    -A INPUT -d 127.0.0.1  -j ACCEPT
    -A INPUT -d 10.0.0.1   -j ACCEPT
    -A INPUT -d 172.16.0.1 -j ACCEPT

In nftables, this is simply not allowed, which is reasonable:

    # nft table inet a
    # nft chain inet a b
    # nft  rule inet a b ip saddr one-ipv4-address
    # nft  rule inet a b ip saddr two-ipv4-addresses
    Error: Hostname resolves to multiple addresses
    rule inet a b ip saddr two-ipv4-addresses
                           ^^^^^^^^^^^^^^^^^^

I think there is one case where nftables COULD make a smarter decision:
the hostname has one IPv4 address and one IPv6 address, AND
we are operating in a single-stack table.

For example:

    # grep one-of-each /etc/hosts
    127.1.2.3  one-of-each
    ::1  one-of-each

    # nft flush ruleset
    # nft table ip a
    # nft chain ip a b
    # nft  rule ip a b dnat to one-of-each  # SHOULD just ignore the IPv6 addr
    Error: Hostname resolves to multiple addresses
    rule ip a b dnat to one-of-each
                        ^^^^^^^^^^^

While testing this, I ran into this behaviour, which I don't understand *AT ALL*.
How and why is nftables converting from ::1 to 127.0.0.1?

    # grep one-ipv6-address /etc/hosts
    ::1 one-ipv6-address
    # nft flush ruleset
    # nft table ip a
    # nft chain ip a b
    # nft rule  ip a b dnat to one-ipv6-address
    # nft list ruleset
    table ip a {
            chain b {
                    dnat to 127.0.0.1
            }
    }

It looks like when nftables gets a hostname, it resolves it to a
single address in any family.  Then later, if it's the wrong family
for that chain, it reverse-resolves the address to a hostname, then
forward-resolves that hostname to the desired address family?

That sort of makes sense, but I can see it confusing people whose
forward- and reverse- name resolution don't match.

    # cat >>/etc/hosts
    ::1:2:3:4 another-one-ipv6-address
    # getent hosts another-one-ipv6-address
    ::1:2:3:4       another-one-ipv6-address
    # nft 'flush ruleset; table ip a; chain ip a b; rule ip a b dnat to another-one-ipv6-address; list ruleset'
    Error: Could not resolve hostname: Name or service not known
    flush ruleset; table ip a; chain ip a b; rule ip a b dnat to another-one-ipv6-address; list ruleset
                                                                 ^^^^^^^^^^^^^^^^^^^^^^^^



More information about the pkg-netfilter-team mailing list