Server By FreeBSD


Router

ファイアウォールルータとして動作させるための設定を行う。

パケットフィルタリング

ipfw (8) を使用してパケットフィルタリングを行い、 ファイアウォールとして動作させる。
パケットフィルタリングの基本設定は /etc/rc.firewall に定義されており、 /etc/rc.conf で変数を定義する事により最低限のフィルタリングは可能である。
但し、標準の設定はあくまでも簡易的な設定なので、 独自の設定ファイルを用意して詳細な設定を行うことにより独自の定義をする。
基本的なポリシーを以下に示す。
  • 断片化したパケットは拒否
  • インターネットからの ping は拒否
  • ローカルネットワーク内の通信は全て許可
  • ppp 経由の通信は全て許可
  • インターネットから private アドレスを詐称して到達するパケットは拒否
  • インターネットから private アドレス宛に到達するパケットは拒否
  • NetBIOS は拒否
  • 通信が確立したパケットは許可
  • 外部に宛たパケットは許可
  • インターネットからの DNS 接続(ポート53)要求は許可
  • 時刻問合わせパケット(Port 123)は許可
  • インターネットからの WWW 接続(ポート80)要求は許可
  • インターネットからの SSL 接続(ポート443)要求は許可
  • インターネットからの SMTP 接続(ポート25)要求は許可
  • インターネットからの SMTPS 接続(ポート465)要求は許可
  • インターネットからの POP 接続(ポート110)要求は許可
  • インターネットからの POPS 接続(ポート995)要求は許可
  • 許可した IP アドレスからの SSH 接続(ポート22)要求は許可
  • インターネットからの SSH 接続(ポート22)要求は拒否
上記のポリシーを実現するために、 以下の設定を設定ファイルに格納して動作を確認する。

# Firewall rules

fwcmd="/sbin/ipfw "
localnet="ローカルネットの指定"
wan="tun0"
flets="tun1"
lan="LAN 側のインタフェース"
ppp="ppp0"

# すべてのルールを初期化
${fwcmd} -f flush

# 断片化したパケットを拒否
${fwcmd} add 100 deny ip from any to any via ${wan} frag

# ループバックを許可
${fwcmd} add 300 allow ip from any to any via lo0

# ローカルネットワークとの通信はすべて許可
${fwcmd} add 400 allow ip from ${localnet} to any via ${lan}
${fwcmd} add 410 allow ip from any to ${localnet} via ${lan}

# ppp クライアントからの通信はすべて許可
${fwcmd} add 600 allow ip from any to any via ${ppp}

# 外のネットワークからローカルアドレスを詐称して来るものを拒否
${fwcmd} add 700 deny all from 192.168.1.0/24 to any recv ${wan}
${fwcmd} add 710 deny all from 172.16.0.0/12 to any recv ${wan}
${fwcmd} add 720 deny all from 10.0.0.0/8 to any recv ${wan}
${fwcmd} add 730 deny all from 127.0.0.0/8 to any recv ${wan}

# 外のネットワークからローカルアドレス宛に来るものを拒否
${fwcmd} add 800 deny all from any to 192.168.1.0/24 via ${wan}
${fwcmd} add 810 deny all from any to 172.16.0.0/12 via ${wan}
${fwcmd} add 820 deny all from any to 10.0.0.0/8 via ${wan}
${fwcmd} add 830 deny all from any to 127.0.0.0/8 via ${wan}

# NetBiosを拒否
${fwcmd} add 2000 deny udp from any 137-139,445 to any # via ${wan}
${fwcmd} add 2100 deny tcp from any 137-139,445 to any # via ${wan}
${fwcmd} add 2200 deny udp from any to any 137-139,445 # via ${wan}
${fwcmd} add 2300 deny tcp from any to any 137-139,445 # via ${wan}

# natの設定
${fwcmd} add 3000 divert natd all from any to any via ${wan}

# 通信が確立したパケットは許可
${fwcmd} add 4000 allow tcp from any to any established

# 外へ出ていくものは許可
${fwcmd} add 4100 allow ip from any to any out via ${wan}

# 外への名前問い合わせを許可
${fwcmd} add 5000 allow udp from any to me 53
${fwcmd} add 5010 allow udp from any 53 to me
${fwcmd} add 5020 allow udp from me 53 to any
${fwcmd} add 5030 allow udp from me to any 53

# 外への時刻問い合わせを許可
${fwcmd} add 5100 allow udp from any to any 123 out
${fwcmd} add 5110 allow udp from any 123 to any in

# 外からのWWW接続を許可
${fwcmd} add 5200 allow tcp from any to any 80 setup via ${wan}

# 外からのSSL接続を許可
${fwcmd} add 5300 allow tcp from any to any 443 setup via ${wan}

# 外からのSMTP接続を許可
${fwcmd} add 5400 allow tcp from any to any 25 setup via ${wan}

# 外からのSMTPS接続を許可
${fwcmd} add 5500 allow tcp from any to any 465 setup via ${wan}

# 外からのPOP3接続を許可
${fwcmd} add 5600 allow tcp from any to any 110 setup via ${wan}

# 外からのPOP3S接続を許可
${fwcmd} add 5700 allow tcp from any to any 995 setup via ${wan}

# 許可した IPアドレスからの SSH接続を許可
${fwcmd} add 7000 allow tcp from IPアドレス to any 22 setup via ${wan}
${fwcmd} add 7001 allow tcp from IPアドレス to any 22 setup via ${wan}
# 外からのSSH接続を拒否
${fwcmd} add 7999 deny tcp from any to any 22 setup via ${wan}

# 上記に該当しないものはログを取って拒否
${fwcmd} add 65532 deny log tcp from any to any
${fwcmd} add 65533 deny log udp from any to any
${fwcmd} add 65534 deny log icmp from any to any

特にルールの初期化を実行すると全ての通信が遮断されるので、 設定の確認を実施している場合は必ずコンソールを確保して作業するのが望ましい。
動作が問題ない場合は起動時にルールが適用される様に /etc/rc.conf に以下の設定を追加する。

firewall_enable="YES"                           # firewall を有効にする
firewall_script="設定ファイル名"                # 設定ファイルのフルパス

NAT の設定

natd(8) を利用するための設定を行う。
NAT とは Network Address Translation の略で、 ネットワークアドレス変換機能の事を示す。
プライベートアドレスしか付与されていないコンピュータは インターネットと通信を行う事ができないので、 パケットが通過する際にパケットの送信元に設定されているプライベートアドレスを 自分自身のグローバルアドレスに書き換えてインターネットに送信し、 戻ってきたパケットの送信先に設定されている自分自身のアドレスを 元の送信先プライベートアドレスに書き換えて パケットを送信したコンピュータに送信する仕組みである。
NAT の機能を実現するために、以下の設定を設定ファイルに格納する。

deny_incoming no                  # 内部変換テーブルに存在しないパケットの入力を拒否しない
use_sockets yes                   # FTP data コネクション等を確立する際に socket を割り当てる
                                  # ポートが衝突する場合でもコネクションを保証
same_ports yes                    # 変換時にできるだけポート番号を変更しないようにする
unregisterd_only yes              # 登録されていない発信元のパケットのみを変換する
dynamic yes                       # IPアドレスの変更に動的に対応する
log no                            # 統計や情報を出力しない
verbose no                        # 起動時に daemon (3) をコールして制御端末から切り離す

起動時に natd が有効になるよう /etc/rc.conf に以下の設定を追加する。

firewall_enable="YES"                           # firewall を有効にする
natd_enable="YES"                               # natd を有効にする
natd_interface="インタフェース"                 # NAT による変換を実施するインタフェース指定
natd_flags="-f 設定ファイル名"                  # 設定ファイルを明示的に指定

シリアルコンソールによるアクセス

サーバとして運用する場合、通常時はディスプレイやキーボードを接続しない。
しかし、その状態だと緊急時の作業が非常に困難になってしまうので、 緊急時にはシリアルコンソールを使用して操作を可能とする。
起動時にキーボードを検出した場合は内蔵コンソールを使用し、 そうでない場合はシリアルコンソールを使用するために、 ブートブロックに -Pオプションを設定する。 そのために、 /boot.config というファイルを作成し、 以下の内容を記述する。

-P

ブートメッセージが表示された後、シリアルコンソールからログインするために /etc/ttys に以下の記述を追加する。

#デバイス gettyプログラム               端末タイプ 起動 rootログイン
ttyd0     "/usr/libexec/getty std.9600" vt100      on   secure

Last Update: 4 Feb. 2010