FreeBSD/natdによるインターネット接続

1998年3月27日改訂

限られたIPアドレス

OCNエコノミー等の低価格のインターネット接続サービスが開始され、小規模のオフィス、個人でもインターネットへのネットワーク接続が可能な環境になってきました。
ただしこれらのサービスの多くは、割り当てられるIPアドレスの数は8とか16しかありません。それ以上必要な時は、ネームサーバー、WWWサーバー、FTPサーバー等のインターネットからアクセスのあるサーバーにだけ公式なグローバルIPアドレスを割り当て、インターネットからのアクセスの必要が無いクライアント等のマシンは、プライベートネットワーク上でプライベートIPアドレスを割り当て、アプリケーションゲートウェイを通してインターネットにアクセスするという方法をとります。

プライベートIPアドレスはインターネットとIPレベルで接続しない限り自由に使用できるアドレスのことで
クラスA:10.0.0.0〜10.255.255.255
クラスB:172.16.0.0〜172.31.255.255
クラスC:192.168.0.0〜192.168.255.255
の範囲があります。

しかしこの方法の不便なところは、

ということです。

natdによるIPアドレス変換

アプリケーションゲートウェイ方式に対してIPアドレス変換方式では上記の様な不便もなくインターネットとのネットワーク接続が可能になります。
プライベートネットワークとインターネット側のネットワークを中継するゲートウェイマシンにIPアドレス変換機能を持たせ、プライベートIPアドレスを持つマシンからインターネットへ向けて出されたパケットに含まれる始点アドレスを、プライベートIPアドレスからグローバルIPアドレスへ変換します。
従って、プライベートネットワーク内からはインターネットへ直接アクセスしているように見えますが、インターネット側からはグローバルIPアドレスを持ったインターネット上のマシンからのアクセスに見えます。
一般的にはNAT(Network Address Translation)とよばれ、特にLinuxでは IP Masquerade が実装されています。

今回はFreeBSDで動作するnatdを紹介します。NATではグローバルIPアドレスとプライベートIPアドレスは1対1変換のため同時に複数の接続はできないと言われていますが、natdはPacket Aliasingというしくみで、1つのグローバルIPアドレスで複数の同時接続を可能にしています(IP Masqueradeも同時接続可能です)。

natdのインストール

ここではFreeBSD 2.2.2-RELEASEとnatd 1.10で説明します。FreeBSD 2.2以降でないとdivert socketに対応していないので使用できません。

natdを動かすマシンのネットワーク環境は次のようにします。

インターネット側
ネットワークインターフェース:ed0
IPアドレス:xxx.xxx.xxx.aaa
ネットマスク:xxx.xxx.xxx.mmm
ゲートウェイ:xxx.xxx.xxx.ggg
プライベートネットワーク側
ネットワークインターフェース:ed1
IPアドレス:192.168.1.254
ネットマスク:255.255.255.0

FreeBSDカーネルの再構築

次のオプションを付けカーネルを再構築します。
options IPFIREWALL
options IPDIVERT

rc.confの編集

/etc/rc.confに次のように設定します。
network_interfaces="ed0 ed1 lo0"
ifconfig_ed0="inet xxx.xxx.xxx.aaa netmask xxx.xxx.xxx.mmm"
ifconfig_ed1="inet 192.168.1.254 netmask 255.255.255.0"
ifconfig_lo0="inet 127.0.0.1"
defaultrouter="xxx.xxx.xxx.ggg"
gateway_enable="NO"
sendmail_enable="NO"
二つのネットワークインターフェース間のIPパケットの転送はここではいったん無効にしておきます。

servicesの編集

/etc/servicesに次の行を追加します。
natd 6668/divert

natdのコンパイル

/usr/local/sbinディレクトリがなければあらかじめ作っておきます。
natd_1.10.tar.gzを適当なディレクトリで展開し、
make
make install
でコンパイル、インストールします。

natd.cfの設定

/usr/local/etc/natd.cfを次のように設定します。
#
# Configuration file for natd.
#
#
# Logging to /var/log
#
log no
#
# Incoming connections.
#
deny_incoming yes
#
# Use sockets to avoid port clashes.
#
use_sockets no
#
# Avoid port changes if possible. Makes rlogin work
# in most cases.
#
same_ports yes
#
# Verbose mode. Enables dumping of packets and disables
# forking to background.
#
verbose no
#
# Divert port. Can be a name in /etc/services or numeric value.
#
port 6668
#
# Interface name or address being aliased. Either one,
# not both is required.
#
# alias_address xxx.xxx.xxx.aaa
interface ed0
#
# Alias unregistered addresses or all addresses.
#
unregistered_only yes
#
# Configure permanent links. If you use host names instead
# of addresses here, be sure that name server works BEFORE
# natd is up - this is usually not the case. So either use
# numeric addresses or hosts that are in /etc/hosts.
#
# Map connections coming to port 30000 to telnet in my_private_host.
# Remember to allow the connection /etc/rc.firewall also.
#permanent_link tcp my_private_host:telnet 0.0.0.0:0 30000
#
# Map connections coming from host.xyz.com to port 30001 to
# telnet in another_host.
#permanent_link tcp another_host:telnet host.xyz.com:0 30001
※付属のnatd.cfは、same_portsがsame_portと間違っているので注意してください。

natd起動スクリプトの作成

/usr/local/etc/rc.d/natd.shを次のように作成します。
#!/bin/sh

#ipfwのルールのフラッシュ
/sbin/ipfw -f flush

#ed0から出入りするIPパケットをdivert port 6668に流す
/sbin/ipfw add divert 6668 ip from any to any via ed0
#IPパケットの通過を許可する
/sbin/ipfw add allow ip from any to any

#natdの起動
/usr/local/sbin/natd -log -config /usr/local/etc/natd.cf

#ネットワークインターフェース間のIPパケットの転送を有効にする
/usr/sbin/sysctl -w net.inet.ip.forwarding=1 >/dev/null 2>&1

natdの起動

マシンを再起動するとnatdが自動起動します。
ed0から出入りするIPパケットはすべてdivert portに入り、そこでnatdがIPアドレスの変換を行います。

クライアントの設定

プライベートネットワーク内のクライアントは次のように設定します。
IPアドレス:プライベートIPアドレス
サブネットマスク:255.255.255.0
ゲートウェイ:192.168.1.254
ネームサーバー:インターネット側のネームサーバーアドレス

もどる

ご意見、ご感想