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
こんにちは。
> アットマークテクノの古賀です。
>
> たしかに、上の 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がデフォルトの場合は接続できず、転送パケットは何も出力されていません。
以上、よろしくお願いします。
otani818
追伸です。
> ここでも、同じことを書いている人がいるのですが、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
なのでこれまで気づきませんでした。
今のところ問題があるのはフォワーディング処理についてです。。。
以上、よろしくお願いします。
at_shinya.koga
アットマークテクノの古賀です。
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
otani818
古賀さん
> >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
ありがとうございました。
以上です。
at_shinya.koga
2022年2月17日 10時24分
アットマークテクノの古賀です。
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 で設定したルールが出力されるものの、設定したはずのポートフォワーディングが機能しない、という状況でしょうか?