ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

ファイアーウォール構築

 ファイアウォールとは、ローカルのネットワークをインターネットなど他のネットワークを経由した攻撃から防ぐ目的で設置する、文字通り「防火壁」です。 専用のハードウエアなどもありますが、高価なものが多いのが難点です(最近では安価なものも出てきてはいます)。 そこで、Linuxとフリーソフトを用いてファイアウォールを構築してみましょう。 フリーソフトでも、一定レベルの安全性を求めることは十分に可能です。
 ファイアウォールを構築するには、インターネットとローカルネットを論理的に切り離し、直接アクセスを出来なくする必要があります。 そして、データを中継するゲートウェイ・マシンにファイアウォールを構築して、必要なデータ以外を排除することで、セキュリティ上問題のあるデータを食いとめるのです。
 ここでは、sendmailとSOCKS5とDelegateというフリーソフトを使って、ファイアウォールを構築する方法について解説しています。

メールの中継方法(sendmail)

 メールについてはsendmailで中継することにしましょう。まずメールの送受信を簡単に図解します。

メール送信図 メール受信図

 このような中継を実現するための設定例を以下に解説します。
 sendmailの設定ファイルsendmail.cfは、CFを使用して作ると簡単です。 ここではsendmail.cfの元になる設定ファイルsendmail.defを例にしています。

ゲートウェイ側のsendmailの設定について

 sendmail.defの設定のうち、メールの中継に関連する部分をピックアップして説明します。

MX_SENDMAIL=yes
DNSを利用するかどうかの設定です。
ゲートウェイは、DNSを利用して外部にメールを配送するので、yesにします。
MY_DOMAIN='ash.jp'
MY_NAME='mail'
自分自身の名前です。
インターネットに接続されているので、インターネットでの名前を書きます。
ACCEPT_AddRS=''
受け取るメール・アドレスを設定します。
ゲートウェイ自身はメールを受け取らない(メールサーバーにすべて転送する)ので、ここには何も書きません。
STATIC_ROUTE_FILE='sendmail.route'
静的な配送先を設定します。
ここでは、sendmail.route内に配送先が書き込まれています。別ファイルで指定しておくと、ドメイン追加などの際にsendmail.cfを作り直す必要がなくなり、運用時の手間を減らすことができます。
sendmail.routeの内容
GW      smtp: mail.lo.ash.jp
DOM     ash.jp
これは、GW行で指定したmail.lo.ash.jp(ローカルのメールサーバー)のSMTPに、DOM行で指定したash.jpドメイン名のメールを送るという設定です。
DIRECT_DELIVER_DOMAINS=all
直接配送するドメイン名を設定します。
ゲートウェイは、外部にメールを配信しなければいけないので、allを指定します。

ローカル側のsendmailの設定について

 sendmail.defの設定のうち、メール転送に関連する部分をピックアップして説明します。

MX_SENDMAIL=no
メールサーバーは、基本的にすべてのメールをゲートウェイに送るだけなので、NOMX_SENDMAIL(DNSを利用しない)設定にしておきます。
MY_DOMAIN='lo.ash.jp'
MY_NAME='mail'
自分自身の名前です。ローカルネットなので、lo.ash.jpになります。
MY_ALIAS='mail.ash.jp'
自分自身の別名です。
ALIAS_REWRITE=no
別名を、メール配送時にOFFICIAL_NAMEに書き換えないようにする設定です。
ACCEPT_AddRS='$m $w.$m ash.jp'
$mはMY_DOMAIN、$wはMY_NAMEで指定したものです。
内部へのメールしか受け取らない設定になっています。
DIRECT_DELIVER_DOMAINS='ash.jp'
ash.jp宛てのメールに関しては、直接配送します(ゲートウェイに送らない)
DEFAULT_RELAY='smtp:gwsv.lo.ash.jp'
DIRECT_DELIVER_DOMAINSで指定されなかったドメイン宛てのメールの転送先を設定します。
ゲートウェイのSMTPを指定しています。

 確認方法は、テスト・メールを送信し、メール・ヘッダーを確認することで、ちゃんとゲートウェイが転送してることを確認します。 メールサーバーから、外部のメール・アドレスにメールを出し、外部からのメールを受け取れることを確認します。

【注意】
 ゲートウェイは外部と直接つながる場所なので、sendmailは必ず最新のものを利用しましょう。 また、SPAMメールの中継などをしないように、外部から外部へのメール転送は禁止するようにしましょう。

サーキットレベルの中継方法(socks5)

 SOCKS5とは、米NEC社で開発されたもので、TCP/IPレベルでデータの中継を行うものです。
 ICQなどのツールをファイアウォール越しに動作させる場合などに必要になります。 また、VPN(Virtual Private Network)という機能で、インターネット越しに、仮想的なプライベートネットワークを構築することも可能ですが、ここでは、参考程度にとどめておきます。

socks5.confの例
#
# socks5.conf 1998.11.26
#
set      SOCKS5_BINDPORT 1080
auth     - - -
route    10.0.1. - eth1
route    - - eth0
permit   - - 10.0.1. - - -

 これは、1080ポートでsocks5を動かす設定で、eth1をローカルネットに、eth0をインターネットに割り当てています。 permit行で、ローカルネットからのアクセスを許可しています。

アプリケーションレベルの中継方法(Delegate)

 Delegate電総研が開発した多機能プロキシです。 ローカルネットからインターネットにアクセスするためのプロキシサーバー機能と、ローカルネットのデータをインターネットに公開するためのマウント機能があります。 対応しているプロトコルには、HTTP, Gopher, Whois, FTP, Telnet, NNTP, SMTP, POPなどがあり、TCP/IPのほとんどの中継処理をこれで行うことができます。 また、httpデータのキャッシュ機能や、各アクセスに対してアクセス制限機能や、ログの採取機能があります。
 Delegateは起動時のオプションでこれらの機能を設定します。

delegateの起動時オプション
オプション内容
-Pdelegatedがコマンドラインから起動する場合のポート番号(inetdから起動する場合は無効)
-vvデバッグ情報を出力して実行
-Fkilldelegatedを終了させる(killコマンドとして動作させる)

 以下のオプションは、識別名=値の形式で設定します。 MOUNT PERMIT EXPIREなどのオプションは、繰り返し指定することができます。

delegateのオプション
識別名値の書式内容
SERVERproto://host:port中継するプロトコルの種類とサーバー指定
PROXYhost:portプロキシサーバーとそのポート番号
DELEGATEhost:portdelegatedの動作するホスト名とポート番号
RESOLV{sys,cache,file,dns}ホスト名解決の順序
SOCKSsocks-host利用するSOCKSホスト
MOUNT"path URL opt"//${DELEGATE}/pathにマウントするURL
PERMITProt:Dst:srcアクセス制御方法
プロトコル:サーバー:クライアント
ACTDIRdir-name一時データ格納ディレクトリ
VARDIRdir-name可変データ格納ディレクトリ
CACHEDIRdir-nameキャッシュ格納ディレクトリ
EXPIRE{days,hours,secs}キャッシュの有効期間
LOGDIRdir-nameログ・データ格納ディレクトリ
LOGFILEfile-nameログファイル名
PROTOLOGfile-nameプロトコルログ格納ファイル名
"${PORT}.${PROTO}"
OWNERuser-namedelegatedを起動するユーザ名
AUTH"forward:*:"認証指定(クライアント・アドレスの通知)
PERMITの形式
 PERMIT=Proto1:Dst1:src1
 PERMIT=Proto1,Proto2:Dst1,Dst2:src1,src2

 PERMITを複数指定した場合は、いずれかに適合した場合に、許可されます。

 ホストおよびネットワークは、以下の例のように指定します。

delegateのアクセス制限の記述例
記述許可するホスト
*すべてのホスト
*.jp日本のすべてのホスト
!*.jp海外のすべてのホスト
*.ash.jpASH内のすべてのホスト
www.ash.jp特定のサーバーのみ
210.154.87.16/255.255.255.240ASH内のすべてのIP(ネットワーク指定)
210.154.87.[16-31]ASH内のすべてのIP(ホスト範囲指定)
210.154.87.18特定のIPのみ

 次にローカルネットからインターネットへのhttp中継と、インターネットからローカルネットへのhttp中継を例にして、具体的な設定を解説します。

ローカルネットからインターネットへのhttp中継例

/usr/local/sbin/delegated -P8080 SERVER='http'
OWNER=wmaster
PERMIT='*:*:*.lo.ash.jp'
AUTH="forward:*:"
ACTDIR=/usr/local/etc/delegate
VARDIR=/usr/local/etc/delegate
LOGFILE=""

 これは、8080ポートでhttpの中継を行う設定です。 ローカルネットから、インターネットのブラウジングをするために使用しています。
 PERMIT='*:*:*.lo.ash.jp'という設定により、ローカルネット内のクライアントからのみ、自由なサーバーにアクセスすることを許可しています。 PERMITによってクライアントの限定を行っていないと、自由な場所からアクセスできるようになり、悪用される可能性があるので注意しましょう。
 許可/不許可するホストの指定はIPアドレスで行う方が、多少安全度が増します。

インターネットからローカルネットへのhttp中継例

/usr/local/sbin/delegated -P80 SERVER='http://sv01.lo.ash.jp/'
OWNER=wmaster
PERMIT='*:sv01.lo.ash.jp:*'
AUTH="forward:*:"
ACTDIR=/usr/local/etc/delegate
VARDIR=/usr/local/etc/delegate
LOGFILE="" PROTOLOG="${PORT}.${PROTO}"

 これは、80ポートでhttpの中継を行う設定です。ローカルのWWWサーバーのデータを公開するのに使用しています。 PERMIT='*:sv01.lo.ash.jp:*'という設定により、インターネット上の自由なクライアントから、ローカルネット内のWWWサーバーにのみ、アクセスを許可しています。

 次にDelegateの起動方法について触れておきます。
 Delegateは、デーモンとして起動しておく場合と、inetdで起動する場合があります。httpなどの使用頻度の高いものはデーモン起動、外部からのtelnetやftpなどの使用頻度が低いものについてはinetd起動にするのがいいでしょう。実際の運用形態に合わせて調整してください。
 デーモン起動する場合は、それぞれのDelegeteを1つのスクリプトから起動できるようにしておき、etc/rc.d/rc.localに、そのスクリプトを実行するコマンドを追加します。inetd起動の場合は、それぞれのDelegateについて起動するためのスクリプトを作り、inetd.confに、それぞれの起動設定を追加します。

 以下はinetd.confの記述例です。

delegate-ftp    stream  tcp     nowait  root    /usr/sbin/tcpd  ftpgate
delegate-telnet stream  tcp     nowait  root    /usr/sbin/tcpd  telnetgate

 delegate-ftp delegate-telnetは、中継用のポート番号として、/etc/servicesで定義したものです。 ftpgate telnetgateは、Delegate起動用のシェル・スクリプトの名前です。



Copyright (C)1995-2002 ASH multimedia lab.
mail : info@ash.jp