ARM版Ubuntu Serverのインストールも可能! 小さくてもパワフル、OpenBlocks AX3活用レシピ 3ページ

不適切なWebアクセスを阻止するフィルタリングサーバーとして利用する

 最近では個人情報保護などの観点から、オフィスからのWeb閲覧に制限が加えられている例も多い。制限の内容としては、たとえば職務に関係ないWebサイトの閲覧禁止や、アップローダなどへのファイルのアップロードなどが考えられる。また、家庭内でも子供による不適切なサイト閲覧を防ぐためにアクセス制限をかけたい、という例があるだろう。このような制限は「フィルタリング」などと呼ばれており、オフィスなどの場合はプロクシとしてフィルタリングソフトを導入することが多い。

 このようなフィルタリングソフトはいくつかあるが、オープンソースソフトウェアの組み合わせで同様の機能を実現することも可能だ。商用製品のようにきめ細かな設定を行うことは難しいが、特定のWebサイトへのアクセスを禁止したり、POST操作だけを禁止する、といった制限であれば比較的容易に実現できる。そこで、OpenBlocks AX3にプロクシサーバーとして有名なSquidをインストールし、フィルタリング機能付きのルーターとして活用する方法を紹介しよう(図18)。

図18 OpenBlocks AX3とSquidを組み合わせてWebフィルタリングを行う構成例
図18 OpenBlocks AX3とSquidを組み合わせてWebフィルタリングを行う構成例

Squidのインストールと設定

 Debian GNU/Linuxでは、squidパッケージでSquidが提供されている。まずはこのパッケージをインストールする。

# apt-get install squid

 Squidの設定は、/etc/squid/squid.confファイルで行う。squid.confファイルにはコメントとして詳細な書式解説が記述されており非常に長いものとなっているが、アクセス制限のルールは次のようにシンプルなものだ。

 まず、「acl」コマンドでACL(Access Control List、アクセス制御リスト)を作成する。ACLは制限する対象を定義したもので、このACLに対し「allow(許可)」もしくは「deny(拒否)」を指定することで、アクセス制御を行う。acl文の書式は次のようになっている。

acl <ACL名> <制限タイプ> <パラメータ>

 「ACL名(aclname)」というのは、そのACLを識別するための名称で、「ACLタイプ(acltype)」はその設定項目のパラメータが何を意味しているかを指定するものだ。たとえばACLタイプが「src」の場合、パラメータにはIPアドレスを指定できる(表1)。

表1 代表的な制限タイプ
名称 パラメータで設定できる内容
src クライアントのIPアドレス
dst 接続先のIPアドレス
arp クライアントのMACアドレス
dstdomain 接続先のドメイン名
dstdom_regex 接続先のドメイン名。正規表現が利用可能
url_regex 接続先URL。正規表現が利用可能
port 接続先ポート
proto 使用するプロトコル
method 使用するHTTPメソッド
browser WebブラウザのUser-Agent。正規表現が利用可能

 「パラメータ(argument)」では、ACLタイプに対応したパラメータを指定する。このとき、「”<ファイル名>”」のように、ダブルクォーテーションで囲むことでファイルを指定することもできる。この場合、そのファイル内で列挙されているものがパラメータとして使用される。また、「all」を指定するとすべてを対象とすることができる。

 続いて、設定したACLに対し「http_access」文で「allow(許可)」もしくは「deny(拒否)」を指定する。「allow」を設定すると、指定したACLに対する通信が許可されるようになる。「deny」が指定されたACLは通信が拒否される。

http_access <allowもしくはdeny> <許可するACL>

 http_access文では同時に複数のACLを指定することもできる。その場合、指定したACLすべてに該当する通信が対象となる。また、ACLの前に「!」を付けると、そのACLに該当しないものを指定したことになる。なお、http_access文での設定では、先に設定されたものがより優先されるようになっている。

 squid.confではいくつかデフォルトのaclおよびhttp_accessが設定されている。たとえば次の設定では、「Safe_ports」というACLに該当しない通信を拒否するものだ。

http_access deny !Safe_ports

 ACL「Safe_ports」は以下のように設定されている。つまり、このhttp_access文では以下のポート以外への接続を禁止する、という意味になる。

acl SSL_ports port 443          # https
acl SSL_ports port 563          # snews
acl SSL_ports port 873          # rsync
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl Safe_ports port 631         # cups
acl Safe_ports port 873         # rsync
acl Safe_ports port 901         # SWAT

 また、「localhost」というACLに対しては許可が設定されている。

http_access allow localhost

 「localhost」というACLは次のように定義されており、通信元が「127.0.0.1」、つまりlocalhostからの通信すべてを許可する、という設定になっている。

acl localhost src 127.0.0.1/32

 squid.confではACL「all」に対し、「拒否」が設定されている。

acl all src all
# And finally deny all other access to this proxy
http_access deny all

 これは「すべての接続元」に対し接続を拒否する、という意味となる。つまり、squid.confで明示的に許可を設定した通信以外はすべて拒否される設定となっている。

 Squidのデフォルト設定ではこのように、ローカルホストからの接続以外はすべて拒否するようになっている。まずはこれを変更し、指定したネットワーク内からの接続を許可するように設定しておこう。たとえば「192.168.1.0/24」というネットワークを許可するには、次のようにする。

 まず、acl文で許可するネットワークを指定する。

acl acceptable_network src 192.168.1.0/24

 次に、このACLに対し許可を設定する。

http_access allow acceptable_network

 設定を変更したら、Squidを再起動する。

# /etc/init.d/squid restart

 これで、ネットワーク内からOpenBlocks AX3をHTTPプロクシとして使用できるようになる。Webブラウザの設定を変更し、プロクシ経由で接続するよう設定を変更して試してみよう。

特定のホストやURLをブロックする

 特定のホストやURLに対する接続を禁止するには、dstdomainやdstdom_regex、url_regexといったACLを使用する。たとえば、次のようなACLを設定しておく。

acl blacklist_domain dstdom_regex "/etc/squid/blacklist_domain"
acl blacklist_url url_regex "/etc/squid/blacklist_url"

 この設定は、「/etc/squid/blacklist_domain」ファイルにブロックしたいドメインを、「/etc/squid/blacklist_url」ファイルにブロックしたいURLを記述する、というものだ。ドメインやURLの指定には正規表現が使用できる。

 次に、これらACLに対し「deny」を指定する。

http_access deny blacklist_domain
http_access deny blacklist_url

 たとえば「blacklist_domain」ファイルで「.*¥.2ch¥.net」を指定すると、すべての.2ch.netドメインへのアクセスをブロックできる。

# blacklist for domain
.2ch.net

 接続を拒否するよう設定されているドメインにアクセスすると、次のようにエラー画面が表示される(図19)。

図19 2ch.netドメインにアクセスしようとすると、アクセスが禁止されている旨が表示される
図19 2ch.netドメインにアクセスしようとすると、アクセスが禁止されている旨が表示される

 特定のWebサイトに対しその一部のみを閲覧できるようにするには、「/etc/squid/blacklist_url」ファイル内に正規表現でそのサイトのURLを指定する。たとえばslashdot.jpのトップページのみを閲覧できるようにするには、「.*slashdot\.jp/.+」や「slashdot\.jp/.+」と指定すれば良い。

# blacklist for url
.*slashdot\.jp/.+
slashdot\.jp/.+

POSTをブロックする

 掲示板への書き込みやファイルのアップロードをブロックする方法の1つに、HTTPのPOSTメソッドを禁止する、というものがある。これら操作にはPOSTメソッドが利用されるからだ。POSTメソッドを禁止するには、まず次のようにACLを定義する。

acl post method post

 続いて、このACLをdenyに設定する。

acl deny post

 ただし、POSTメソッドを禁止すると、Ajaxを利用しているサイトや、ログインが必要なサイトの利用などが行えなくなるので、この設定を行う場合には十分に注意してほしい。

透過プロクシの設定を行う

 上記のようにプロクシでフィルタリングを行う場合、プロクシを経由しない通信についてはフィルタリングが行えない。そこで、パケットルーティングの設定を変更し、すべてのHTTP通信を強制的にプロクシ経由で行うように設定しておこう。このようなプロクシは、「透過プロクシ」と呼ばれている。まず、squid.confファイル内でSquidのポートを指定している「http_port」行に、以下のように「transparent」を追加する。

http_port 3128 transparent

 次に、iptablesでルーティングを指定する。たとえば、eth1がローカル側LANに接続されている場合、次のような設定を行う。

# *[iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT to-port 3128]

 以上で設定は完了だ。