AIDEMOIRE

【アイデモワール】

LinuxでNATルータを構成するメモ

ESXiをソフトウェアiSCSIでブートできるようになったので(ESXi 5をソフトiSCSIでブート - AIDEMOIRE)、ESXiの環境を整えようと考えました。

VMware Playerの頃は、サーバ自身にNAT等のネットワーク構築機能が付いていたので、設定だけで良かったのですが、ESXiになってからはNATネットワークを作成するためには仮想マシンでNATルータ作る必要があります。(正確にはNATではなくPATですが、ここではNATで。)ルータ/ファイヤウォール/NATの機能を提供するフリーの仮想アプライアンスもあるのですが、結局アプライアンスではやれることが限られているので、Linuxでルータ、というかプチサーバを構成する方がベターです。

ところが、Linuxでルータの設定なんかは、久しぶりなので、ちょっと手間取ってしまいました。次回、右往左往しないようにメモっておきます。

LinuxでNATルータを構成するメリットは

  • 超軽量である
  • ファイヤウォールやNATの機能をきめ細かく設定することができる
  • ルータ/ファイヤウォール/NAT以外の機能も追加できる

と、言ったところです。超軽量プチサーバを構成するにはGUIを持たないサーバ型のディストリビューションを使います。私はUbuntu Server 12.04をベースに構築するのですが、仮想HDDは2GBあれば十分ですし、仮想メモリも512MBもあれば動きます。(VMwareはきめ細かいメモリ管理を行っているので、私は1GBを割り当てています。しかし、定常状態では実質は300MBも使っていません。)

LinuxでNAT/ファイヤウォールを実現するには iptablesを使うのが一般的かと思います。iptablesは非常に細かい設定ができるのでGUIベースのアプライアンスでは出来ないような条件でも設定できます。

また、Linuxをベースにしていれば、SSHトンネルサーバ、メールの中継サーバの機能を提供することもできますし、DNSDHCPのスレーブサーバとして冗長構成を実現するためにも使えます。

さて、それではNATルータの構成方法についてメモっておきますが、詳しくは次のURLを参照して下さい。
IptablesHowTo - Community Ubuntu DocumentationHow to enable IP Forwarding in Linux - MDLog:/sysadmin
なお、以下のサンプルでコマンドはルート権限で実行します。私は一々 sudoせずにsudo -sでルートになってから実行しています。

NAT/フィルタを設定します

このメモは iptablesの使い方を書いたものではありませんので、詳しい解説は上のWebページを参照してもらうとして、ここでは、ごく基本的なNATの設定だけ載せておきます。今回は物理LANへのインタフェースとESXi内に4つの論理ネットワーク セグメントを作るので、合計で5つの仮想NICを持ちます。eth0が物理LANへのインタフェースで、eth1~eth4がNAT用の仮想LANへのインタフェースとなります。
次のコマンドを実行してNATとしての機能を設定します。

iptables -t nat -F

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -j MASQUERADE

iptables -t nat -I PREROUTING -d 172.16.81.123 -i eth0 -p tcp -m tcp --dport 60022 -j DNAT --to-destination "192.168.2.2:22"

最後のコマンドは、外部からのSSH接続をNATセグメント中のサーバへポートフォワードするためのものです。

これで設定は終わりなのですが、これをプチサーバを立ち上げる度に実行する必要があります。

iptablesを自動実行するように設定します

この方法はDebian系とRedhat系で異なるようです。私はUbuntuを使っていますのでDebian系の設定方法となります。

まず、現在の設定を /etc/iptables.rules に保存します。(ファイル名は任意で構ないと思いますが、習慣上 /etc/iptables.rules を使っています。ファイルの性格上、/etcよりは/var/libの方のような気もしますが。)

iptables-save -c > /etc/iptables.rules

“-c”オプションは現在のパケットのカウンタ値も保存する、という意味です。カウンタ値を使ってフィルタの条件を設定する場合に意味を持ってきます。その必要がなければ“-c”オプションは不要となります。付けておいて害はないので、これも習慣上、付けておきます。

/etc/iptables.rules の内容は次のようになります。

# Generated by iptables-save v1.4.12 on Fri Oct  4 19:45:36 2013
*mangle
:PREROUTING ACCEPT [1406:124163]
:INPUT ACCEPT [1398:123875]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1097:123781]
:POSTROUTING ACCEPT [1097:123781]
COMMIT
# Completed on Fri Oct  4 19:45:36 2013
# Generated by iptables-save v1.4.12 on Fri Oct  4 19:45:36 2013
*nat
:PREROUTING ACCEPT [28:5147]
:INPUT ACCEPT [26:5075]
:OUTPUT ACCEPT [40:2891]
:POSTROUTING ACCEPT [40:2891]
[0:0] -A PREROUTING -d 172.16.81.123/32 -i eth0 -p tcp -m tcp --dport 50883 -j DNAT --to-destination 192.168.2.2:22
[0:0] -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
[0:0] -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE
[0:0] -A POSTROUTING -s 192.168.3.0/24 -j MASQUERADE
[0:0] -A POSTROUTING -s 192.168.4.0/24 -j MASQUERADE
COMMIT
# Completed on Fri Oct  4 19:45:36 2013
# Generated by iptables-save v1.4.12 on Fri Oct  4 19:45:36 2013
*filter
:INPUT ACCEPT [1398:123875]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1097:123781]
COMMIT
# Completed on Fri Oct  4 19:45:36 2013

次にこの設定を使って、システムの起動時にiptablesの値の読み込むようにします。幾つか方法はあるようですが、私は次のような設定にしています。

  • /etc/network/if-pre-up.d/iptablesload を作成します

/etc/network/if-pre-up.d というディレクトリに置くのであればファイル名は任意です。

#!/bin/sh

if [ -f /etc/iptables.rules ]; then
	iptables-restore < /etc/iptables.rules
fi

exit 0

このファイルには実行権を付けておきます。

chmod +x /etc/network/if-pre-up.d/iptablesload
  • /etc/network/if-post-down.d/iptablessave

こちらは任意です。シャットダウン時に現在の状態を保存したい場合に設定します。もし、システム起動時に毎回同じ設定にするのであれば必要ないでしょう。(ただし、パケット カウンタを条件としていて、カウンタの累計値を使う場合には保存しておく必要があります。

#!/bin/sh

iptables-save -c > /etc/iptables.rules

if [ -f /etc/iptables.downrules ]; then
	iptables-restore < /etc/iptables.downrules
fi

exit 0

こちらのファイルにも実行権を付けておきます。

chmod +x /etc/network/if-post-down.d/iptablessave

これで、NAT/ファイヤウォールの設定はおしまいです。しかし、このままでは肝心の“パケットのルーティング”を実行してくれません。以上の設定はフィルタの設定なので、パケットのルーティングを実行する設定は別途必要になります。

ルータの機能を有効にします

パケットのルーティング機能は /etc/sysctl.conf を設定すること有効にします。

net.ipv4.ip_forward=1

デフォルトではコメントアウトされていますので、“#”を取ります。IPv6もルーティングするのであれば、こちらも次のようにコメントアウトします。

net.ipv6.conf.all.forwarding=1

これでプチサーバを再起動すればルータ/ファイヤウォール/NATとして動きます。

あとは各自の環境に合わせて追加の機能を設定してください。