ずいぶん久しぶりに Linux を使っての NAT Box を作成しました。
手持ちのブロードバンドルーターが Symmetric NAT のタイプではなかったので、検証のために Linux で Symmetric NAT を作成しました。
NATの種類
NATには、いくつか種類があって フルコーン、アドレス制限、アドレスポート制限、シンメトリック と4種類ほどに大別されます。
・・・というのが数年前のお話でした。実はこれでは現実問題対応出来ないとのことで、現在ではこの区別はレガシー扱いとなっています。
今は、NATのマッピング規則と、フィルタリング規則という2つの観点からルーターNATの特性を判定します。
手持ちのルーターでは、エンドポイント非依存マッピングで、アドレスポート依存フィルタリングというシロモノでした。
というわけで P2P のゲームやアプリにおいては割と都合の良い感じになっています。
しかしプログラムの作成立場としては、ある程度のケースが欲しいもので今回シンメトリックNAT を作ることにしました。
マッピング規則、フィルタリング規則、これらについては検索すると多くの情報が見つかり、わかりやすい記述を見つけることが出来ると思うので、ここでは説明を省略します。
Symmetric NAT の作成
CentOS7 をインストールした、Ethernet Adapter を2枚持つPC環境を用意します。
ひとまず外向き eth0, 内向き eth1 として話を進めます。実際には eno**** とか、 ens**** などアダプタ名になっているかと思いますので読み替えてください。
iptablesの準備
CentOS7 では iptables が使えないようだったので、以下のようにしてインストールします。
firewalld でも今回の機能が作成できるか調べてみたのですが、見つからなかったので iptables を使用する方法で対処しました。
# yum install iptables-services # systemctl stop firewalld # systemctl mask firewalld # systemctl enable iptables # systemctl start iptables
設定
以下のようにコマンドを打ち込んでいきます。内側のネットワークを 192.168.0.0/24 として設定していますので、ご注意ください。
# iptables -t nat -F # iptables -F # iptables -P INPUT DROP # iptables -P FORWARD DROP # iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT # iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT # iptables -t nat -A PREROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE --random
ここでマスカレードのオプションに random をつけることがポイントです。これをつけることでシンメトリックNATのような挙動を見せることになります。
まとめ
iptables で Symmetric NAT の挙動を見せる NATBoxを準備しました。 firewalld のほうでもっと手軽に準備できるのならばそれもありかなと思うのですが、現時点では情報が見つからないので・・・。
内側のネットワークに対して DHCP でアドレス配布を行うと、通常のルーター代わりに使えるようになります。ここまで準備しておくと良さそうです。
コメント