動作環境
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
(あまり詳しく無いので、コマンド実行後の表示内容については各自調べてみてください・・・。)
コメント
[…] 前回の記事では、iptablesによるNATとIPマスカレードについて解説しました。 […]
[…] 前回までのネットワークトポロジであれば、「debrt01」が所属しているネットワークへサーバが接続されていたので、ルーティング情報が自動で学習されて通信が可能でした。しかし今回は、サーバとの間に「debrt02」、「debrt03」が接続されているため、ルーティング情報をルーティングテーブルへ登録する必要があります。 […]