【NAT変換】Linuxサーバー配下にプライベートIPを持った端末を管理するための準備

##NAT変換にチャレンジしてみた
演習(課題)として、2台のPCのうち一方を他方に直接つなぎ、繋がれたほうをインターネットにつなぐことによって一つをプライベート空間に配置した状態で直接インターネットにつながっていないほうからインターネットに接続せよというものにチャレンジしてみました。
理由は後述もしていますが、LANポートの数の関係でインターネットに直接繋がないほうがWindows、インターネットに直接つなぐほうがLinuxのPCです。

###前提条件
windowsPCにクラスC(192.168.x.x/24)のIPアドレスを付与
LinuxPCの一方にクラスC、もう一方にクラスB(172.16.x.x/16)のIPアドレスを付与
インターネットに直接つながるゲートウェイ(ルーター)はクラスBのIPアドレスが付与されている
これらをすべてLANケーブルで1本につなぐ
通信の際のポート番号(80番ポートなど)は今は考慮しない(後ほど考慮する)。

###想定する環境
|用意するもの  |詳細  |
|-------------|---------------------------------------------------|
| WindowsPC|バージョンは10。LANポートが1つなので今回はこちらが子になる |
|Linuxサーバー |バージョンはCentOS8。LANポートが3つあるマシンを用いるが、今回は3つのうち2つを使用。こちらが親(子からみたときにゲートウェイの役割)。|
|enp7s0 |サーバーのLANポートのうち、インターネット側へ電気(パケット)を流すほうのインターフェース名|
|enp6s0 |サーバーのLANポートのうち、Windows側へ電気(パケット)を流すほうのインターフェース名　|
|固定IPアドレス| 前提条件にあったIPアドレスをそれぞれのLANポートに付与　|
|その他機器 | LANケーブルやハブ、ルータなど一般的なネットワーク接続に必要な機器 |

##まずは物理マシンでやってみる。
NAT変換に関する情報は巷に溢れていますが、どれも仮想マシンを前提にしたものばかりです。
なぜなら、普通は物理マシンでこんなことはやらないから。(おそらく)

とはいえ、物理マシンで接続してみたことで、同じことを仮想マシンで行えば比較的やりやすくなるのでは
と思えたので記録しておきたいと思います。

##NAT変換をどこで行うか
CentOSでは(他は知りません笑)ファイアーウォールがNAT変換を管理しています。

バージョン6以前ではiptablesというものを用いてルールを設定していたようで
こちらの記事が非常に参考になりました。

[Linuxで作るファイアウォール［NAT設定編］1/2](https://www.atmarkit.co.jp/ait/articles/0111/23/news003.html)
[Linuxで作るファイアウォール［NAT設定編］2/2](https://www.atmarkit.co.jp/ait/articles/0111/23/news003_2.html)

しかしながら、CentOS7以降ではiptablesではなくfirewalldという仕組みでルールを管理することになったようです。
道理で記事で散々使われている"iptables"なんてファイルが存在しなかったわけだ。

##firewalldを用いてNAT変換を行う

こちらの記事を参考に、IPマスカレードの設定を書いていきました。

[CentOS 7.x でのIPマスカレード設定](https://qiita.com/gurere/items/3584df990c98965e785b)
[Firewalld : IPマスカレードの設定](https://www.server-world.info/query?os=CentOS_7&p=firewalld&f=2)

まず、デフォルトの状態ではzoneがpublicしかありません(ないはず！)ので、enp7s0をexternal(外側)、enp6s0をinternal(内側)というようにzoneを設定します。
これはNetworkManagerを使いましょう。

```
# nmcli connection modify enp7s0(インターフェース名) connection.zone external
# nmcli connection modify enp6s0(インターフェース名) connection.zone internal
```
次に、ぞれぞれのzoneを意識しつつfirewalldの設定変更にかかります。
firewalldの設定を変更する際は基本的にsuでルートユーザーになっておきましょう。(sudoではできない操作もあります)

```
# firewall-cmd --zone=external --add-masquerade --permanent
```

これによりNAT変換で必要なIPマスカレードができます。
(iptablesの場合はNATテーブルにいろいろな設定を加えないといけなかったのがこれだけでよくなりました。科学の力ってすげー！)

ちなみにCentOS8の場合、デフォルトでIPマスカレードがonになっているらしいのでコマンドを打つ前に確認してみてもいいかもしれません。

```
# firewall-cmd --list-all --permanent --zone=external
```
masquerade:yesとなっていればOKです。

次にちょっとだけルールを入れます。(現時点では必須じゃないようです。)

```
# firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o enp7s0 -j MASQUERADE
# firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i enp6s0 -o enp7s0 -j ACCEPT
# firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i enp7s0 -o enp6s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
```

1つ目はPOSTROUTINGの設定。NAT変換というのはヘッダ情報のIPアドレスを書き換える動きなのですが、
POSTROUTINGはそのうち送信元の情報を操作するときのルール設定です。サーバーからインターネットに出ていくときにはIPマスカレードしなさいということです。

2つ目はぷらーべーとネットワーク空間であるenp6s0側(WindouwsPCがある側)から来たパケットをenp7s0に流すことを許可するというルールです。

最後に逆向きを許可するルールを追加し、これでLinuxPCのLANポート同士がIPクラスの異なる状態で疎通が可能になりました。

##NAT変換のルール設定が出来たらIPアドレスをうまく合わせる
あとは、プライベート空間同士と、親やゲートウェイのある空間同士のセグメントを間違えないようにIPアドレスを確認して完成。

##今後
今後はこれを仮想マシンなどを用いて、一台ではなく複数台をサーバーの下にぶら下げる設計を作ることになります。
どこがどう変わるのか、機会があればまた書いてみたいと思います。