VirtualBoxを用いた仮想ネットワークの構築! ~ iptablesによるNATとIPマスカレード ~

Debian

動作環境

VirtualBoxを使用して、以下のように「debrt01」、「debsv01」、「debsv02」の3台のゲストOSを使用します。使用するネットワークアダプターは「ブリッジアダプター」と「内部ネットワーク」となっています。

この記事では目標として、サーバ間の通信、「debsv01」はNAT・「debsv02」はIPマスカレードで外部ネットワークへの接続を目指します。

参考までに3台とも以下のような構成となっています。

OS Debian 10.2 Buster
デスクトップ環境 未インストール
プロセッサー数 1
メモリ 1GB
ストレージ 8GB

debrt01

「debrt01」はルータとして設定します。「debsv01」、「debsv02」間の通信や外部ネットワークとの通信等、パケットの処理を行います。

enp0s3 アダプター1 ブリッジアダプター
IPアドレス 192.168.0.21/24
192.168.0.22/24
192.168.0.23/24
デフォルトゲートウェイ 192.168.0.254
enp0s8 アダプター2 内部ネットワーク(名前:net01)
IPアドレス 172.16.1.254/24
デフォルトゲートウェイ 設定無し
enp0s9 アダプター3 内部ネットワーク(名前:net02)
IPアドレス 172.16.2.254/24
デフォルトゲートウェイ 設定無し

debsv01

「debsv01」はサーバとして使用します。サーバ間の通信や外部ネットワークとの通信の確認を行います。

enp0s3 アダプター1 内部ネットワーク(名前:net01)
IPアドレス 172.16.1.1/24
デフォルトゲートウェイ 172.16.1.254

debsv02

「debsv02」はサーバとして使用します。サーバ間の通信や外部ネットワークとの通信の確認を行います。

enp0s3 アダプター1 内部ネットワーク(名前:net02)
IPアドレス 172.16.2.1/24
デフォルトゲートウェイ 172.16.2.254

設定

以下の設定をすることで、サーバ間の相互通信と「debsv01」はNAT、「debsv02(172.16.2.0/24)」はIPマスカレードによりインターネットへ接続出来るようになります。

debrt01

① インターフェイスの設定

# vi /etc/network/interfaces
auto lo
iface lo inet loopback

auto enp0s3
iface enp0s3 inet static
address 192.168.0.21/24
gateway 192.168.0.254

auto enp0s3:1
iface enp0s3:1 inet static
address 192.168.0.22/24

auto enp0s3:2
iface enp0s3:2 inet static
address 192.168.0.23/24

auto enp0s8
iface enp0s8 inet static
address 172.16.1.254/24

auto enp0s9
iface enp0s9 inet static
address 172.16.2.254/24

# systemctl restart networking.service

それぞれのIPアドレスは以下の用途で使用します。

enp0s3 192.168.0.21 debrt01用のアドレス
enp0s3:1 192.168.0.22 debsv01のNAT用アドレス
enp0s3:2 192.168.0.23 IPマスカレード用アドレス
enp0s8 172.16.1.254 ネットワークnet01のゲートウェイアドレス
enp0s9 172.16.2.254 ネットワークnet02のゲートウェイアドレス

※ 一つのインターフェイスへ複数のアドレスを指定する場合は、「インターフェイス名:任意の数字」というように複数のインターフェイスを作成し、それぞれにIPアドレスを設定します。

② パケット転送を有効にする

# vi /etc/sysctl.conf
# 28行目のコメントを解除
net.ipv4.ip_forward=1

# sysctl -p
net.ipv4.ip_forward = 1

※ この設定をした時点で、「debrt01」のパケット転送が有効になり、「debsv01」と「debsv02」へIPアドレスの設定をしていればサーバ間の通信が可能になります。

③ iptablesによるNATの設定

# iptables -t nat -A PREROUTING -i enp0s3 -d 192.168.0.22 -j DNAT --to 172.16.1.1
# iptables -t nat -A POSTROUTING -o enp0s3 -s 172.16.1.1 -j SNAT --to 192.168.0.22

-t nat オプション
iptablesコマンドで -t オプションを付けなければ、パケットフィターを行う「filter」テーブルへコマンドの内容が追加されます。
今回はNATを行うので -t nat オプション を付けて、ネットワークアドレス変換を行う「nat」テーブルへコマンドの内容を追加します。

今回設定したチェイン

PREROUTING ルーティングが行われる前(インターフェイスにパケットをが着信した際)に
送信先情報を変換するために利用
POSTROUTING ルーティングが行われる際(インターフェイスからパケットを送信する際)に
送信元情報を変換するために利用

-j DNAT/SNAT –to オプション

DNAT 着信したパケットの送信先を –to オプションで指定したIPアドレスに変換
SNAT 送信するパケットの送信元を –to オプションで指定したIPアドレスに変換

その他オプション

-i インターフェイス 指定のインターフェイスへ着信した場合
-o インターフェイス 指定のインターフェイスから送信する場合
-d IPアドレス 送信先が指定のIPアドレスの場合
-s IPアドレス 送信元が指定のIPアドレスの場合

上記をまとめると、「DNAT」ではパケット着信時に 外部アドレス ⇒ 内部アドレス、SNATでは パケット送信時に 内部アドレス ⇒ 外部アドレス に変換します。

④ iptablesによるIPマスカレードの設定

# iptables -t nat -A POSTROUTING -o enp0s3 -s 172.16.2.0/24 -j SNAT --to 192.168.0.23

上記では、「172.16.2.0/24」から外部ネットワークへの通信が「192.168.0.23」へNAPTされます。

今回はNAPTするIPアドレスを指定しましたが、「enp0s3」へIPアドレスが動的に設定されている場合は、以下のように設定します。

# iptables -t nat -A POSTROUTING -o enp0s3 -s 172.16.2.0/24 -j MASQUERADE

⑤ iptablesの設定を恒久化

iptablesに設定した内容はこのままだと、再起動した際に初期化されてしまいます。
スクリプトを書いて再起動時に設定を再適用する方法もありますが、「iptables-persistent」というパッケージを使用して恒久化させます。

# apt -y install iptables-persistent

iptablesの設定を変更したタイミングで以下を実行することで、再起動後にも設定が保持されます。

# iptables-save > /etc/iptables/rules.v4

debsv01

① インターフェイスの設定

# vi /etc/network/interfaces
auto lo
iface lo inet loopback

auto enp0s3
iface enp0s3 inet static
address 172.16.1.1/24
gateway 172.16.1.254

# systemctl restart networking.service

debsv02

① インターフェイスの設定

# vi /etc/network/interfaces
auto lo
iface lo inet loopback

auto enp0s3
iface enp0s3 inet static
address 172.16.2.1/24
gateway 172.16.2.254

# systemctl restart networking.service

最後に

これで目標としていた「サーバ間の通信、「debsv01」はNAT・「debsv02」はIPマスカレードで外部ネットワークへの接続」が出来るようになりました。
PINGコマンド等で、接続が確認出来るかと思います。

正常にNATやIPマスカレードが動作しているかについては、コネクショントラッキングが出来る「conntrack」というパッケージを使用してみると分かるようです。

# apt -y install conntrack

試しに以下を実行してみると、アドレス変換の様子が分かるかと思います。

# conntrack -L

(あまり詳しく無いので、コマンド実行後の表示内容については各自調べてみてください・・・。)

コメント

  1. […] 前回の記事では、iptablesによるNATとIPマスカレードについて解説しました。 […]

  2. […] 前回までのネットワークトポロジであれば、「debrt01」が所属しているネットワークへサーバが接続されていたので、ルーティング情報が自動で学習されて通信が可能でした。しかし今回は、サーバとの間に「debrt02」、「debrt03」が接続されているため、ルーティング情報をルーティングテーブルへ登録する必要があります。 […]

タイトルとURLをコピーしました