CentOS7 で NAPT(IP Masquerade) 備忘録

CC0 Public Domain Picture.

CC0 Public Domain Picture.

CentOS7 で NAPT の備忘録です.今まで CentOS などの汎用 UNIX OS でやったこと無かったんですが,ファイヤーウォール (CentOS7 なら firewalld) で実現するんですね.知りませんでした.

色々なところに詳しい説明があるので,詳細についてはそれらのサイトを見て頂くとして,ここでは,ネットワークが2つ(eth0 と eth1 とする)用意されており,

  • eth1 をグローバル側(インターネットに近い側)
  • eth0 をローカル側
  • ローカルにつながる機器からグローバルへは自由に通信可能 (NAPT 利用)
  • グローバル側からはローカルへは特定の通信のみ可能

というある意味最も単純な構成にする手順のみです.これだけなのに意外と情報が分散していて調べにくかったって言うのが備忘録にする理由です.まずは,必要なソフトウェアのインストールからスタートです.

事前準備

前提として,「CentOS-7-x86_64-Minimal-1511」から,ほぼ以下のページの通りにインストールを済ませているとしておきます.要するに最低限のものしか入っていない状態です.

ローカル環境で使う CentOS7 on Hyper-V の基本的な設...

ただし,今回は,eth1 がグローバル側,eth0 がローカル側に接続されており,eth1には DHCP でアドレスが割り当てられているという状態です.ネットワークの状態は以下の通り.

インターフェースの状態は以下の通り.

IP アドレスとルーティングの状態は以下の通り.eth1 側はインターネット(に近い)側で,DHCP でアドレス(192.168.100.109)等の割当が行われていますが,eth0 側は何も設定されていません.

まずは,eth0 に IP アドレス(192.168.0.1)を割り当てます.今回は nmcli を使いましたが,グラフィカルなツールである nmtui を使っても良いと思います.

firewalld のインストールと起動

このままでも iptables が使えるので,やろうと思えば今回の目標は達成できるのだろうとは思いますが,CentOS7 の標準は firewalld です.しかし何故か最小インストールだと firewalld は入っていません.従って,次の通りインストールします.

追加で依存する4つのパッケージがインストールされます./etc/firewalld 以下に設定ファイルが配置され,これを変更しても良いのですが,どうも色々なところをみると,Windows の様にまずは動かし,その後,コマンドで設定を変更していく流れが一般の様です.

この方針に従い,再起動時自動立ち上げとなる設定と,起動設定を行っておきます.

ゾーンの設定

firewalld は Windows と同様に,ネットワークをゾーンという単位で管理します.Windows だと,プライベート,パブリック,ドメインの3種類が標準ですが,firewalld の場合は,block, dmz, drop, external, home, internal, public, trusted, work の8種類です.違いは名付け方から想像できる通りですが,

firewalldの設定方法 | server-memo.net

にある一覧表が分かり易いです(このページは firewalld の設定方法について非常に分かり易く網羅的に解説してくれています).

何も設定されていない場合は,全てのネットワークが public に所属となります.これは以下の様に active な zone を全て表示させると分かります.

見ての通り,public は,ssh と dhcpv6-client の通信のみが許可となっており,かなり厳しめの設定であることが分かります.

そして,今回は,eth1 を external に,eth0 を trusted に設定すれば目的を達成できます.

firewall-cmd で所属ゾーンを変えることもできますが,これは再起動すると元に戻ってしまいます.元に戻らないようにするには nmcli で変更する必要があります.それぞれの詳しい状態は以下の通りです.

eth1 は ssh のみ通り,masquerade が yes となっていますので,NAPT 状態であることが分かります.eth0 には何もサービスが書かれていないので,全て拒否のように見えますが,そうではなく,全て許可という状態です.これは /usr/lib/firewalld/zone にある external.xml と trusted.xml を見ればわかります.

通信許可の設定その1(サービス)

特定の通信を許可する設定は,サービスとして定義されているものとされていないものに分けて考える必要があります.サービスとして定義されているもの一覧は,

とすれば分かりますが,これは /usr/lib/firewalld/services にその設定があります.

http の場合は,

のようになっていますので,この例を参考にして自分でサービスを定義し,firewalld に組み込むことも可能です.ただし,そのシステム特有のサービスの設定は /etc/firewalld/services に保存します.例えば,リモートデスクトップだと,tcp/3389ですので,

のようなファイルを準備し,firewalld の設定を再読み込みすることで,rdp サービスが定義できます.

サービスのゾーンへの適用は,firewall-cmd で行います.ただし,–permanent を付けないと一時的な即時適用として設定され,–permanent を付けると再起動後適用となることに注意が必要です.

逆にサービス削除する場合は,

の様にすれば良いことになります.

通信許可の設定その2(直接指定)

同じことはポートを直接指定することでも実現できます.リモートデスクトップだと次の様になります.

ポートの転送

ポートの転送例は以下の通りです.tcp/3389 を tcp/13389 に転送しています.

また,ポートだけでなく,他の端末(例は 192.168.0.2 に転送)に転送する例は以下の通り.いわゆるファイアーウォールの穴あけと呼ばれる作業ですね.

まとめ

これだけできれば市販のルーターの基本機能とほぼ変わらないと思います.あと足りないのは UPnP への対応位でしょうか.もちろん最近のものはすごく多機能なので,あくまで「基本機能」だけなんですけどね.

UNIX 系の場合,設定ファイルを書き換えて再読み込みがこれまでの基本であり,決まり切った設定だと,設定ファイルの必要部分だけ書き換えるというのは合理的なんですが,ネットワーク周りだけはこれだと使い難いです.

最近は遠隔地にあるサーバの管理を行わないといけないことも増えてきました.ネットにつなぐ以上,ファイアーウォールの設定は厳しめでなければならず,でも,UNIX 系だと色々な設定を行うには ssh で接続できないといけない.だから,標準として適用されるファイヤーウォールのゾーンが public なのだと思います.

そして,運用を始めると,ファイヤーウォールの設定を変更しなければならないことは当然あり得る.でも,これをしくじると,ssh でも接続できなくなりかねない.この場合は指定した時間の後に再起動するよう設定してから,–permanent を付けずにファイヤーウォールの設定を変更し,想定通り動くかどうか確かめれば良い.

失敗しても指定時間が来れば再起動して再び再設定できますし,正しければ再起動を取り消してから(shutdown コマンドだとオプション -c で可能),改めて –permanent を付けた設定を行えば良い訳です.

私の場合も,遠隔地のサーバの設定をしくじった結果,結局現地に行かざるを得なくなった経験がありますので,少しでもこういう危険が避けられる実装はとてもありがたいと思います.

スポンサーリンク
large rectangle advertisement
スポンサーリンク
large rectangle advertisement