ファイアウォールって苦手。
実務ではハードウェアがやってくれてたから、使ったことない。
solaris8の頃に一度設定練習したことあるけど、それっきり。
ipchainsやったかなぁ。
個人的にはヤマハのルータで特定のポートの穴あけをしてみたり、awsとかgcpのネットワークでグローバルネットのうち自分の固定IPのみを許可させたりした程度。
それでも間違えたら入られちゃうから、真剣にテストしたっけ。
今回は実務でやってみるチャンスがあったので、その試験設定をメモ。
redhatのドキュメント
最初はfirewalldってのあったっけと思ってドキュメント読んでたら、こんなこと書いてあった。
RHEL では、ipset パッケージおよび iptables-nft パッケージが非推奨になりました。
iptables-nft には、iptable、ip6tables、ebtables、arptables などのさまざまなツールが同梱されています。
このようなツールには新しい機能がなくなり、新しいデプロイメントに使用することは推奨されません。
代わりに、nftables パッケージが提供する nft コマンドラインツールを使用することが推奨されます。
既存の設定は、可能であれば nft に移行する必要があります。
他にもこうあった。
RHEL 9 では、iptables フレームワークは非推奨になりました。
結果として、iptables バックエンドと、firewalld の 直接インターフェイス も非推奨になりました。
なるほど、nftables使えってことね。
firewalldもフェードアウントしてくんかな。これ古いし、使うのやめとこか。
iptablesの実装やりなおしみたいな感じ
昔は1つずつルールをコマンドラインで書いてたな。
nftablesってのはfirewalldとか停止して使うそうな。
コマンドラインじゃなく、設定ファイルを読み込ませて動かすみたい。
コマンドラインでの設定もできるみたいやけど、ちゃんと設定が書けるってのは読みやすくてありがたい。
企業の中のファイアウォール申請は「ソースとデスティネーションのxxポートを許可」とか書いてることが多いから見直しやすい。
親切にredhat9でサンプルを作ってくださってる方がおられた。
作者さんありがとう。タイムリーに必要だったので、めっちゃ参考にさせてもらった。
作者さんは管理者と日本国内のみ接続許可するようにするのが目的やったから、日本国内のIPリストを用意されてたけどそこはパス。
定義作って動かす
例えば、ssh(port22)/http(80)/https(443)を管理者セグメントと一般セグメントに見立てて許可する設定を練習で作ってみる。
この設定を叩き台にして、dns(port53)とntp(port123)なんかも全許可できるかやってみた。
モジュールを入れる
こうしたら入るらしい。
# dnf install -y nftables
alma9で練習してredhat9でもnftables動かしたんやけど、どっちかで入れてどっちかでもう入ってたような・・・。
インストール状況によってよしなに動くから、とりあえずやったらええ。
許可設定対象のリストを作る
設定ファイルは/etc/nftables/list/adminDef
って名前で作っとく。コメントも入れれるからええですなぁ。
今は1つで練習しとくけど、ファイルは1つじゃなく複数に分割してもええ。それぞれinculdeするだけ。
「本社」とか「営業所」とか「工場」とか分割して作っといたら管理も楽になるやんな。
define admin1 = {
192.168.0.1, # 管理者ローカルIP1
192.168.0.2 # 管理者ローカルIP2
}
define admin2 = {
192.168.0.11, # 一般ローカルIP3
192.168.0.12 # 一般ローカルIP4
}
ルールを作る
作者さんの定義をほぼ流用させてもらい、こう書いといたらエラーは特になかった。
ルールは/etc/nftables/filter.nft
って名前で作っとく。
# 現在のルールセット消去
flush ruleset
# IPアドレスリストを読み込む
include "/etc/nftables/list/adminDef"
# IPv4
talbe inet filter {
set admin1 {
type ipv4_addr
elements = $admin1
}
set admin2 {
type ipv4_addr
elements = $admin2
}
chanin input {
type filter hook input priority 0; policy drop ;
# ping
ip protocol icmp icmp type echo-request limit rate 10/second accept
# 関連・確率済みトラフィックは許可
ct state established,related accept
# 不正なトラフィックは全て破棄する
ct state invalid drop
# ループバックインターフェイスのトラフィックは全て許可
iif "lo" accept
# 新しいエコー要求(ping)は許可する
ip protocol icmp icmp type echo-request ct state new accept
ip protocol udp ct state new jump UDP
ip protocol tcp tcp flags & (fin | syn | rst | ack) == syn ct state new jump TCP
# 他のルールによって処理されなかったトラフィックは全て拒否する
ip protocol udp reject
ip protocol tcp reject with tcp reset
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0 ; policy accept ;
}
chain TCP {
# 管理者セグメント向け開放
tcp dport { 22,80,443 } ip saddr @admin1 accept
# 一般セグメント開放
tcp dport { 443 } ip saddr @admin2 accept
}
chanin UDP {
# 全開放
# ntp
udp dport { 53,123 } accept
}
}
nftablesの設定を書く
こう書いて許可設定対象のリストを取り込ませる設定を足す。
# cp -p /etc/nftables/nftables.conf /etc/nftables/nftables.conf.org
# echo include '"/etc/nftables/filter.nft"' >> /etc/nftables/nftables.conf
サービスを起動
firewalldをとめてnftables使うようにしとく。
# systemctl stop firewalld.service
# systemctl disable firewalld.service
# systemctl start nftables.service
# systemctl enable nftables.service
定義の確認
こうしたらええ。
ルールセットの結果どっかいった・・・。
# nft list tables ⭐️テーブル一覧が表示される
table inet filter
# nft list ruleset ⭐️ルールセットが表示される
:(中略)
ルールセットには許可設定対象をルール内に展開したリストが表示される。
自分で作ったルールセットを入れる前にリスト見たら、デフォルト設定に何か入ってたけど、ヤヤこしくなるから1行目でflush ruleset
って全部捨てた。
定義を変更して反映する
こうしたらルールに許可設定対象を読み込ませてルールセットが有効になってくれる。
# systemctl reload nftables
このときってサービス停止してんのか?
リロードやから停止してへん気がするけど、よーわからん。
さ、これ使って実機で設定やってみよか。