👹

Firewalld による NAPT(IPマスカレード)

2024/11/01に公開

NAPT(IPマスカレード)とは...

NAPT(IPマスカレード)とはとは、1つのグローバルIPアドレスをLAN内の複数の機器で共有してインターネットに接続できるようにする機能です。

NAPT(Network Address Port Translation)と IPマスカレード は同じものを指します。
(NAPTは一般的な技術名で、IPマスカレードはLinuxでの機能名です。)

ちなみにマスカレード(Masquerading)は「仮装」「変装」という意味で、プライベートIPがグローバルIPに成りすますような感じに見えるためそう呼ばれています。

目的

プライベートネットワークにあるサーバ(インターネット側への疎通がない)から、NAPT設定を入れたサーバを経由してインターネット側へアクセスできるようにする。


実施環境

サーバOS

Fedora Server 40

※ Firewalldが使用できればなんでもよかったのですが、とりあえずRedHat系であるFedoraをチョイス。デフォルトでFirewalldがインストールされており、すぐに使用できます。

構成

今回はProxy ServerApplication Serverの二つのサーバを用意します。

  • Proxy Server : インターネットと疎通可能なeth3と、内部ネットワークと疎通可能なeth2が接続されています
  • Application Server : 内部ネットワークと疎通可能なeth1が接続されています

実装

Proxy Serverをルーターと見立てて、firewalldを利用したNAPT設定を行います。
またApplication Serverでは、デフォルトゲートウェイにProxy Serverを指定することで通信時に経由するようになります。

◆ Proxy Server 側の設定

1. iptables の無効化

firewalldによる設定の前に、iptablesとのルールの競合を避けるため無効化します。

$ systemctl disable --now iptables

2. ゾーンの確認

外部ネットワーク側に繋がるインターフェース(et3)がpublicになっていることを確認します。

$ firewall-cmd --get-active-zone
public
  interfaces: eth2
public
  interfaces: eth3

3. ゾーンの変更

内部ネットワーク側に繋がるインターフェース(eth2)と外部に繋がるインターフェース(eth3)をexternalに変更します。

$ firewall-cmd --change-interface=eth2 --zone=external --permanent
$ firewall-cmd --change-interface=eth3 --zone=external --permanent

正しく変更されたか確認します。

$ firewall-cmd --get-active-zone
external
  interfaces: eth2 eth3

4. ゾーンの設定

externalはデフォルトでNAPTを許可しています。
下記のようにmasquerade: yesとなっていればOKです。

$ firewall-cmd --list-all --zone=external
external (active)
  target: default
  ingress-priority: 0
  egress-priority: 0
  icmp-block-inversion: no
  interfaces: ens160 ens224
  sources: 
  services: ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: yes
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

masquerade: noとなっていたらexternal ゾーンに NAPTの設定をします。

# external ゾーンにIPマスカレードを設定
$ firewall-cmd --permanent --zone=external --add-masquerade

5. 外部ネットワークインターフェース側の設定

外部ネットワークに繋がるインターフェース(eth3)に NAPTの適用を行います。

$ firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -o eth3 -j MASQUERADE

6. インターフェース間の設定

2つのインターフェース間のパケット転送を許可します。
一つ目が行きパケットの許可で、二つ目が戻りパケットの許可設定となります。

$ firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i eth2 -o eth3 -j ACCEPT
$ firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i eth3 -o eth2 -m state --state RELATED,ESTABLISHED -j ACCEPT

7. 再起動、確認

Firewalldを再起動し設定を反映させます。

$ firewall-cmd --reload
success

# 確認
$ firewall-cmd --zone=internal --query-masquerade
yes
$ firewall-cmd --direct --get-all-rules
ipv4 nat POSTROUTING 0 -o eth3 -j MASQUERADE
ipv4 filter FORWARD 0 -i eth2 -o eth3 -j ACCEPT
ipv4 filter FORWARD 0 -i eth3 -o eth2 -m state --state RELATED,ESTABLISHED -j ACCEPT

# 1 -> IP Forward有効, 0 -> IP Forward無効
$ cat /proc/sys/net/ipv4/ip_forward
1

◆ Application Server 側の設定

1. デフォルトゲートウェイ・DNSの設定

eth1のをデフォルトゲートウェイを、Proxy Server192.168.100.10として設定します。
また、DNSを8.8.8.8等に設定します(DNSサーバがある場合はそちらを設定)。

$ nmtui

2. 疎通確認

$ ping 8.8.8.8
$ curl https://www.google.com

おわりに

Fedoraを初めて使用しましたが、よく使う機能が最適化されていて汎用的な検証をするのにとても使い勝手が良いと感じました。

Discussion