nft advancedについてお探しですね。
広告
nftablesでNATやマスカレード、ロードバランスを設定してみよう
Linuxでネットワークを制御する技術って、長い間「iptables」が主流だったんですけど、最近は「nftables」っていう新しい仕組みに切り替わってきてるんです。
nftablesはただの新バージョンってわけじゃなくて、処理が速くなったり、IPv4とIPv6を一緒に扱えたりと、今どきのネットワークに必要な機能がぎゅっと詰まってます。
この記事では、基本的なNATやマスカレードの設定はもちろん、ポートフォワーディングとか、さらには複数のサーバーに通信を振り分けるロードバランシングまで、実際の現場で使える技術をわかりやすく解説していきますね。
NATを設定する前の準備とテーブルの基本
nftablesでNATを組むとき、まず押さえておきたいのが「ベースチェーン」の考え方と、カーネルの設定です。
iptablesと違って、nftablesは最初から何も設定されてないので、自分でテーブルやチェーンを作って、どのタイミングで処理するか(フック)や優先順位を決める必要があります。
そして何より大事なのが、Linuxカーネル自体にパケットを転送させる設定。
これを忘れると、どんなに完璧なルールを書いても通信が止まっちゃうんです。
`/etc/sysctl.conf`っていうファイルに`net.ipv4.ip_forward = 1`って書いて、再起動しても設定が残るようにしておきましょう。
次は、nftablesの設定ファイルの中身を考えます。
NAT処理をするには、`type nat`って指定したベースチェーンを作って、パケットが入ってくるときの処理(`prerouting`)と、出ていく直前の処理(`postrouting`)を定義します。
基本的に、外から内へのアクセス制御は`prerouting`で、内から外への通信時のアドレス変換は`postrouting`で行うって覚えておくといいですよ。
この構造をちゃんと整理しておくと、あとで「あれ、うまく動かないな」ってときにも原因を探しやすくなります。
特に`inet`ファミリーを使えば、IPv4とIPv6を一つのテーブルで管理できるから、設定がすっきりしてメンテナンスも楽になるんです。
SNATとマスカレード、どっちを使う?
家や会社の内側のネットワークからインターネットに繋ぐとき、必ず必要になるのがソースNAT(SNAT)です。
nftablesには「SNAT」と「マスカレード」っていう2つのやり方があって、状況に応じて使い分けるのがポイントです。
マスカレードは、IPアドレスが自動で変わるような環境(DHCPとかPPPoE)で使う技術。
インターネット側のIPアドレスが変わっても、nftablesが自動で追いかけてくれるから、家庭用ルーターとか小規模オフィスにぴったりなんです。
設定もすごく簡単で、`postrouting`チェーンに出力インターフェース(例えばeth0)を指定して、アクションに`masquerade`って書くだけで完了です。
一方、固定IPアドレスを持ってるサーバーとか、企業向けのルーターを作るときは、明示的にSNATを使う方がおすすめです。
マスカレードはIPアドレスの変更をチェックする処理が入るので、ほんの少しだけCPUを使っちゃうんですけど、SNATは変換先のIPアドレスが固定されてるから処理が速いんです。
それに、複数の固定IPアドレスを持ってて、「このサーバーからの通信はこのIPアドレスから出したい」みたいな細かい制御をするなら、SNATじゃないとできません。
書き方は`snat to [固定IPアドレス]`って感じで、どのIPに変換するかをはっきり指定できるので、予想外のアドレスから通信が出ちゃって遮断される心配もなくなります。
ポートフォワーディングでサーバーを公開する
外部から内部のサーバー(WebサーバーとかSSHサーバーとか)にアクセスさせたいときに使うのが、宛先NAT(DNAT)、いわゆるポートフォワーディングです。
この処理は、パケットがどこに行くか決まる前の`prerouting`フックで行います。
基本的な考え方は、「特定のポート(例えば80番)に来たパケットを見つけて、その宛先IPアドレスを内部のサーバー(例えば192.168.1.10)に書き換える」ってこと。
nftablesだと`tcp dport 80 dnat to 192.168.1.10`みたいに、すごくシンプルに書けます。
さらに、ポート番号も変えられるから、例えば外部からの8080番ポートへのアクセスを内部の80番ポートに転送する、なんてこともできちゃいます。
ここで初心者がよくハマるのが、ファイアウォール(Filterテーブル)との関係です。
NATテーブルでアドレスを書き換えても、それは「宛先を変える」だけで、「通していい」って許可したわけじゃないんです。
だから別に、`type filter`の`forward`チェーンで、変換後の内部IPアドレスとポートへの通信を許可するルールを追加する必要があります。
あと、ヘアピンNAT(内部ネットワークから外部のIPアドレス経由で内部サーバーにアクセスする仕組み)が必要な場合は、DNATだけじゃなくて、戻りのパケットを正しく処理するためのSNATルールも組み合わせる必要があって、ネットワーク全体の流れを理解してないと難しいところでもあります。
負荷分散も標準機能でできちゃう
nftablesがiptablesより断然すごいのが、標準機能だけで高度なロードバランシング(負荷分散)ができちゃうところです。
専用の機械とか特別なソフトを入れなくても、複数のサーバーに通信を振り分けられるんです。
これを実現するのが`numgen`(ナンバージェネレーター)とか`jhash`っていう機能。
例えば、Webサイトへのアクセスを2台のサーバーに分散させたいとき、`numgen`を使ってパケットごとに数字を生成して、その数字に応じて転送先を決められます。
`dnat to numgen inc mod 2 map { 0 : 192.168.1.10, 1 : 192.168.1.11 }`みたいに書くだけで、シンプルかつ高速にトラフィックを分散できちゃいます。
もっと高度な振り分け方として、送信元IPアドレスをキーにしたハッシュベースの分散(同じユーザーは同じサーバーに繋がる仕組み)も作れます。
`jhash`とか`symhash`を使うと、同じクライアントからの通信は常に同じバックエンドサーバーに転送されるように制御できるんです。
これって、ログイン状態を保つ必要があるWebアプリの負荷分散ではすごく重要な機能なんですよ。
nftablesのマップ機能と組み合わせれば、設定ファイルに直接書くんじゃなくて、バックエンドのサーバーリストを動的に管理するような、もっと高度な運用もできるようになります。
こんな感じで、nftablesは単なるパケットフィルタじゃなくて、ネットワーク全体の安定性を高めるための強力な道具としても使えるんです。
広告
