Armadilloフォーラム

Debian10(buster)でのufwとiptablesの組み合わせについて

otani818

2022年2月16日 10時45分

Armadillo-IoT G3Lでufwコマンドによるファイアウォールを使用していて、通常の排他制御は問題ありませんが、
/etc/ufw/before.rules でポートフォワーディングの定義をしても転送が動作せず、原因を調べているとデフォルトで使用するiptablesが変更されている事に気づきました。
・iptables-legacy  Debian9(stretch), ubuntuなど
・iptables-nft    Debian10(buster)

※ここにもその点が掲載されていますが
https://qiita.com/no_clock/items/5145ff0aeb377fda3934

ufwコマンドはiptablesを操作しているので、
iptables-legacyをデフォルトに変更すると全て正常に動作しました。

Debian10(buster)でufwコマンドを使う場合、
iptables-legacyをデフォルトにするべきでしょうか。

よろしくお願いします。

コメント

アットマークテクノの古賀です。

otani818さん:
>Armadillo-IoT G3Lでufwコマンドによるファイアウォールを使用していて、通常の排他制御は問題ありませんが、
>/etc/ufw/before.rules でポートフォワーディングの定義をしても転送が動作せず、原因を調べているとデフォルトで使用するiptablesが変更されている事に気づきました。
>・iptables-legacy  Debian9(stretch), ubuntuなど
>・iptables-nft    Debian10(buster)
>
>※ここにもその点が掲載されていますが
>https://qiita.com/no_clock/items/5145ff0aeb377fda3934
>
>ufwコマンドはiptablesを操作しているので、
>iptables-legacyをデフォルトに変更すると全て正常に動作しました。
>
>Debian10(buster)でufwコマンドを使う場合、
>iptables-legacyをデフォルトにするべきでしょうか。

たしかに、上の Qiita エントリを含め、Debian 10 では iptables-legacy をデフォルトにしないと ufw が機能しないと書いている人が多いですね。
ここでも、同じことを書いている人がいるのですが、Debian 9 から 10 にアップグレードした環境だと問題なく動作している、と書いている人もいます:
 https://serverfault.com/q/1006981

確認ですが、iptables-legacy をデフォルトにした状態で ufw を設定した場合、iptables[-nft] で -L した場合も nft list ruleset した場合も、ufw で設定したルールが出力されるものの、設定したはずのポートフォワーディングが機能しない、という状況でしょうか?

こんにちは。

> アットマークテクノの古賀です。
>
> たしかに、上の Qiita エントリを含め、Debian 10 では iptables-legacy をデフォルトにしないと ufw が機能しないと書いている人が多いですね。
> ここでも、同じことを書いている人がいるのですが、Debian 9 から 10 にアップグレードした環境だと問題なく動作している、と書いている人もいます:
>  https://serverfault.com/q/1006981
>
> 確認ですが、iptables-legacy をデフォルトにした状態で ufw を設定した場合、iptables[-nft] で -L した場合も nft list ruleset した場合も、ufw で設定したルールが出力されるものの、設定したはずのポートフォワーディングが機能しない、という状況でしょうか?

現在のテスト環境は、192.168.102.0/24 のサブネットからArmadillo-eth0ポート30030経由でサーバのポート80へ接続します。
● Armadillo
 eth0: 192.168.102.10
 eth1: 192.168.1.45 (USB-LAN)
●サーバー 192.168.1.30
ufwの設定は、

/etc/ufw/before.rules NAT部抜粋
 
# NAT
*nat
-F
 
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
 
-A PREROUTING -i eth0 -p tcp --dport 30030 -j DNAT --to-destination 192.168.1.30:80
-A POSTROUTING -d 192.168.1.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.1.45
 
COMMIT

■iptables-nftがデフォルトの場合
iptables-nftがデフォルト時、nft list rulesetにufwの設定が出力されますが、
nftables は使ったことが無いのでufwの設定が意図通り反映されているか判断できていません。
(dnat to 3.0.0.0-0.0.0.0の部分が気になりますが)
また iptables -t nat -L したときに Warning が出ます

root~# iptables-legacy  -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
 
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
 
 
root~# iptables-nft  -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  anywhere             anywhere             tcp dpt:30030 to:192.168.1.30:80
 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
 
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       tcp  --  anywhere             192.168.1.0/24       tcp dpt:http to:192.168.1.45
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
# Warning: iptables-legacy tables present, use iptables-legacy to see them
 
 
root~# nft list ruleset  #### table ip filterは省略します####
table ip nat {
        chain PREROUTING {
                type nat hook prerouting priority -100; policy accept;
                iifname "eth0" meta l4proto tcp tcp dport 30030 counter packets 0 bytes 0 dnat to 3.0.0.0-0.0.0.0
        }
 
        chain INPUT {
                type nat hook input priority 100; policy accept;
        }
 
        chain POSTROUTING {
                type nat hook postrouting priority 100; policy accept;
                meta l4proto tcp ip daddr 192.168.1.0/24 tcp dport 80 counter packets 0 bytes 0 snat to 192.168.1.45
        }
 
        chain OUTPUT {
                type nat hook output priority -100; policy accept;
        }
}

■iptables-legacyがデフォルトの場合

root~# iptables-legacy  -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  anywhere             anywhere             tcp dpt:30030 to:192.168.1.30:80
 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
 
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       tcp  --  anywhere             192.168.1.0/24       tcp dpt:http to:192.168.1.45
 
 
root~# iptables-nft  -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
 
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
# Warning: iptables-legacy tables present, use iptables-legacy to see them
 
 
root~# nft list ruleset
table ip nat {
        chain PREROUTING {
                type nat hook prerouting priority -100; policy accept;
        }
 
        chain INPUT {
                type nat hook input priority 100; policy accept;
        }
 
        chain POSTROUTING {
                type nat hook postrouting priority 100; policy accept;
        }
 
        chain OUTPUT {
                type nat hook output priority -100; policy accept;
        }
}

iptables-legacyがデフォルトの場合は正常に転送できていますが、
iptables-nftがデフォルトの場合は接続できず、転送パケットは何も出力されていません。

以上、よろしくお願いします。

追伸です。

> ここでも、同じことを書いている人がいるのですが、Debian 9 から 10 にアップグレードした環境だと問題なく動作している、と書いている人もいます:
>  https://serverfault.com/q/1006981

こちらでも以下のようなフィルタ処理は ufw + iptables-nft で正常に動作しています。

root~# ufw status
Status: active
 
To                         Action      From
--                         ------      ----
22 on usb1                 ALLOW       Anywhere
443 on usb1                ALLOW       Anywhere
Anywhere on usb1           DENY        Anywhere

なのでこれまで気づきませんでした。
今のところ問題があるのはフォワーディング処理についてです。。。

以上、よろしくお願いします。

アットマークテクノの古賀です。

otani818さん:
>追伸です。
>
>>ここでも、同じことを書いている人がいるのですが、Debian 9 から 10 にアップグレードした環境だと問題なく動作している、と書いている人もいます:
>> https://serverfault.com/q/1006981
>
>こちらでも以下のようなフィルタ処理は ufw + iptables-nft で正常に動作しています。

>なのでこれまで気づきませんでした。
>今のところ問題があるのはフォワーディング処理についてです。。。

了解しました。ところで、昨日書いたコメントに TYPO がありました。ごめんなさい。

古賀(2022年2月17日 10時24分):
>確認ですが、iptables-legacy をデフォルトにした状態で ufw を設定した場合、iptables[-nft] で -L した場合も…

「iptables-legacy をデフォルトにした状態で」ではなく、
「iptables-nft をデフォルトにした状態で」の間違いでした。

otani818さん(2022年2月17日 12時36分):
>■iptables-nftがデフォルトの場合
>iptables-nftがデフォルト時、nft list rulesetにufwの設定が出力されますが、
>nftables は使ったことが無いのでufwの設定が意図通り反映されているか判断できていません。
>(dnat to 3.0.0.0-0.0.0.0の部分が気になりますが)
>また iptables -t nat -L したときに Warning が出ます

...
>root~# iptables-nft  -t nat -L
...
># Warning: iptables-legacy tables present, use iptables-legacy to see them

この Warning は、iptables-legacy のルールが空な状態であっても出るようです:
 https://askubuntu.com/a/1317039

otani818さん(2022年2月17日 12時36分):
>iptables-legacyがデフォルトの場合は正常に転送できていますが、
>iptables-nftがデフォルトの場合は接続できず、転送パケットは何も出力されていません。

根拠はなく、単なる思いつきでのコメントなのですが、

# systemctl is-enabled nftables.service

の結果が disabled の場合(たぶん、その状態だと思います)、

# systemctl enable nftables.service

で nftable を有効にした後、iptables-nft をデフォルトにして再起動した場合は、動作に変化が出るでしょうか?

なお、Debian としては、iptables から nftables への移行を推奨しており、移行にあたって iptables のルールを nftables 用に変換する必要がある場合は、iptables-translate を使えばよいよ、ということのようです:
 https://mizunashi-mana.github.io/blog/posts/2019/09/nftables-on-debian/
 https://wiki.debian.org/nftables

古賀さん

> >iptables-legacyがデフォルトの場合は正常に転送できていますが、
> >iptables-nftがデフォルトの場合は接続できず、転送パケットは何も出力されていません。
>
> 根拠はなく、単なる思いつきでのコメントなのですが、
>

> # systemctl is-enabled nftables.service
> 

> の結果が disabled の場合(たぶん、その状態だと思います)、
>

> # systemctl enable nftables.service
> 

> で nftable を有効にした後、iptables-nft をデフォルトにして再起動した場合は、動作に変化が出るでしょうか?

残念ながら、nftables を起動しても動作しませんでした。

>
> なお、Debian としては、iptables から nftables への移行を推奨しており、移行にあたって iptables のルールを nftables 用に変換する必要がある場合は、iptables-translate を使えばよいよ、ということのようです:
>  https://mizunashi-mana.github.io/blog/posts/2019/09/nftables-on-debian/
>  https://wiki.debian.org/nftables
>

そうですね、今後は他のディストリビューションも nftables に移行するようなので、今後の検討課題としておきます。

その上で、busterでnftablesではなくufwコマンドやiptables(iptables-legacy)を利用する場合は、
”思わぬ誤動作のリスク”を避けるために、デフォルトを"iptables-legacy"にするのほうが安心でしょうね。

--- iptables-legacy をデフォルトにする ----
> # update-alternatives --set iptables /usr/sbin/iptables-legacy
> # update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy

ありがとうございました。
以上です。