NetBSD Advent Calendar 2022 9日目の記事です。 今日はNPF(NetBSD Packet Filter)でNAT(Network Address Translation)設定とポートフォワーディングを行う設定手順を紹介しようと思います。
NPFでのNAT設定
NPFに限らず、FreeBSDのipf(5)やLinuxで使用されているiptablesといったファイアウォール実装には、グローバルIPアドレスをローカルネットワーク内の複数のノードから利用可能にするNAT(Network Address Translation)機能が実装されています。
NPFでのNAT設定は以下のように行います。インタフェース名やネットワークの値を変数に入れているため複数行になっていますが、重要なのは map
の記述の部分になります。
$ext_if = "wm1"
$ext_v4 = inet4($ext_if)
$localnet = { 172.16.0.0/24 }
# NAT変換を行うための設定
map $ext_if dynamic $localnet -> $ext_v4
ちなみにFreeBSDではipnat(5)を利用し、 /etc/ipnat.conf
にNAT変換ルールを記述します。併せて /etc/rc.conf
に ipnat=YES
を追加しておく必要があります。
こうやってみると、FreeBSDではパケットフィルタのルール設定とNAT設定は別ファイルに分けられており、NPFではルールとNAT設定を単一の設定ファイルで行えるという違いがあるようですね。
# FreeBSD ipnatによるNAT設定
map pppoe0 192.168.10.0/24 -> 0/32 proxy port ftp ftp/tcp
map pppoe0 192.168.10.0/24 -> 0/32 portmap tcp/udp 40000:60000 mssclamp 1400
map pppoe0 192.168.10.0/24 -> 0/32
NPFでのポートフォワーディング
NPFでのポートフォワーディングは、特定のホスト・ポートにパケットを流すものと、指定したポート番号へのアクセスをローカルネットワーク内に転送するというものがあります。
特定のホスト・ポートにポートフォワーディングする
特定のホスト・ポートにパケットを転送する設定は、NATの設定と似ています。というよりも、NATでは ->
で外に出てゆくパケットについて変換するルールを書いていたのに対し、ポートフォワーディングでは <-
で外から入ってくるパケットを処理するという理解しやすい記述になっています。
例として、外部からのポート番号 2222
に対するアクセスを 172.16.0.2
の 22
番ポートに転送する設定を示します。
$ext_if = "wm1"
map $ext_if dynamic 172.16.0.2 port 22 <- $ext_v4 port 2222
また、外部から特定のポートにアクセスされた場合に、そのままローカルネットワーク内の特定のホストにパケットを転送する設定は以下になります。この設定の場合は、 2222
→ 22
といったポートのマッピングを考えておく必要がなくなる(外部からアクセスしたポート番号のままパケットが転送される)ので便利かもしれません。
$ext_if = "wm1"
$allow_redir_ip4addrs = { 172.17.0.2 }
group "redirect" {
pass stateful on $ext_if \
from $allow_redir_ip4addrs to $ext_v4 port 5900
pass stateful on $ext_if \
from $allow_redir_ip4addrs to $ext_v4 port 2222
}
まとめ
NPFでのNATとポートフォワーディング設定について紹介しました。同等の設定をipfと比較しながら見てみると、NPFの記述はより分かりやすい感じがしますね。