ファイアウォールとは、ローカルのネットワークをインターネットなど他のネットワークを経由した攻撃から防ぐ目的で設置する、文字通り「防火壁」です。
専用のハードウエアなどもありますが、高価なものが多いのが難点です(最近では安価なものも出てきてはいます)。
そこで、Linuxとフリーソフトを用いてファイアウォールを構築してみましょう。
フリーソフトでも、一定レベルの安全性を求めることは十分に可能です。
ファイアウォールを構築するには、インターネットとローカルネットを論理的に切り離し、直接アクセスを出来なくする必要があります。
そして、データを中継するゲートウェイ・マシンにファイアウォールを構築して、必要なデータ以外を排除することで、セキュリティ上問題のあるデータを食いとめるのです。
ここでは、sendmailとSOCKS5とDelegateというフリーソフトを使って、ファイアウォールを構築する方法について解説しています。
メールについてはsendmailで中継することにしましょう。まずメールの送受信を簡単に図解します。
このような中継を実現するための設定例を以下に解説します。
sendmailの設定ファイルsendmail.cfは、CFを使用して作ると簡単です。
ここではsendmail.cfの元になる設定ファイルsendmail.defを例にしています。
sendmail.defの設定のうち、メールの中継に関連する部分をピックアップして説明します。
GW smtp: mail.lo.ash.jp DOM ash.jp |
sendmail.defの設定のうち、メール転送に関連する部分をピックアップして説明します。
確認方法は、テスト・メールを送信し、メール・ヘッダーを確認することで、ちゃんとゲートウェイが転送してることを確認します。 メールサーバーから、外部のメール・アドレスにメールを出し、外部からのメールを受け取れることを確認します。
SOCKS5とは、米NEC社で開発されたもので、TCP/IPレベルでデータの中継を行うものです。
ICQなどのツールをファイアウォール越しに動作させる場合などに必要になります。
また、VPN(Virtual Private Network)という機能で、インターネット越しに、仮想的なプライベートネットワークを構築することも可能ですが、ここでは、参考程度にとどめておきます。
# # 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は電総研が開発した多機能プロキシです。
ローカルネットからインターネットにアクセスするためのプロキシサーバー機能と、ローカルネットのデータをインターネットに公開するためのマウント機能があります。
対応しているプロトコルには、HTTP, Gopher, Whois, FTP, Telnet, NNTP, SMTP, POPなどがあり、TCP/IPのほとんどの中継処理をこれで行うことができます。
また、httpデータのキャッシュ機能や、各アクセスに対してアクセス制限機能や、ログの採取機能があります。
Delegateは起動時のオプションでこれらの機能を設定します。
オプション | 内容 |
---|---|
-P | delegatedがコマンドラインから起動する場合のポート番号(inetdから起動する場合は無効) |
-vv | デバッグ情報を出力して実行 |
-Fkill | delegatedを終了させる(killコマンドとして動作させる) |
以下のオプションは、識別名=値の形式で設定します。 MOUNT PERMIT EXPIREなどのオプションは、繰り返し指定することができます。
識別名 | 値の書式 | 内容 |
---|---|---|
SERVER | proto://host:port | 中継するプロトコルの種類とサーバー指定 |
PROXY | host:port | プロキシサーバーとそのポート番号 |
DELEGATE | host:port | delegatedの動作するホスト名とポート番号 |
RESOLV | {sys,cache,file,dns} | ホスト名解決の順序 |
SOCKS | socks-host | 利用するSOCKSホスト |
MOUNT | "path URL opt" | //${DELEGATE}/pathにマウントするURL |
PERMIT | Prot:Dst:src | アクセス制御方法 プロトコル:サーバー:クライアント |
ACTDIR | dir-name | 一時データ格納ディレクトリ |
VARDIR | dir-name | 可変データ格納ディレクトリ |
CACHEDIR | dir-name | キャッシュ格納ディレクトリ |
EXPIRE | {days,hours,secs} | キャッシュの有効期間 |
LOGDIR | dir-name | ログ・データ格納ディレクトリ |
LOGFILE | file-name | ログファイル名 |
PROTOLOG | file-name | プロトコルログ格納ファイル名 "${PORT}.${PROTO}" |
OWNER | user-name | delegatedを起動するユーザ名 |
AUTH | "forward:*:" | 認証指定(クライアント・アドレスの通知) |
PERMITの形式 PERMIT=Proto1:Dst1:src1 PERMIT=Proto1,Proto2:Dst1,Dst2:src1,src2 |
PERMITを複数指定した場合は、いずれかに適合した場合に、許可されます。
ホストおよびネットワークは、以下の例のように指定します。
記述 | 許可するホスト |
---|---|
* | すべてのホスト |
*.jp | 日本のすべてのホスト |
!*.jp | 海外のすべてのホスト |
*.ash.jp | ASH内のすべてのホスト |
www.ash.jp | 特定のサーバーのみ |
210.154.87.16/255.255.255.240 | ASH内のすべてのIP(ネットワーク指定) |
210.154.87.[16-31] | ASH内のすべてのIP(ホスト範囲指定) |
210.154.87.18 | 特定のIPのみ |
次にローカルネットからインターネットへの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アドレスで行う方が、多少安全度が増します。
/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起動用のシェル・スクリプトの名前です。
【注意】
ゲートウェイは外部と直接つながる場所なので、sendmailは必ず最新のものを利用しましょう。 また、SPAMメールの中継などをしないように、外部から外部へのメール転送は禁止するようにしましょう。