natテーブルを利用したLinuxルータの作成・3(外部から内部サーバへのアクセスと負荷分散)iptablesテンプレート集 改訂版(5)(2/3 ページ)

» 2010年04月27日 00時00分 公開
[鶴長鎮一@IT]

テンプレート9
外部ネットから内部ネットの特定サーバへのアクセスを許可

サーバとして
 受信パケットは破棄。ただしステートフル性を確認しサーバから送信されたパケットに関連するものは許可
 送信パケットは基本的にすべて許可
 ループバックアドレスに関してはすべて許可
 メンテナンスホスト(内部)からのping、メンテナンスホストへのpingを許可
 メンテナンスホスト(内部)からのssh(TCP 22)を許可

ルータとして
 転送パケットで、内部ネット→外部ネットのものは許可。外部ネット→内部ネットへの転送パケットはステートフル性を確認できたものだけ許可
 Linuxルータを経由して外部へ出ていくパケットのソースアドレスを変換
 内部アドレスやプライベートアドレスが外部に漏れないようにブロック

ポート転送のため
 外部ネットからHTTP/HTTPS/SMTP/POP3サーバへの転送を許可
 外部ネットからLinuxルータに入ってくるパケットのうちHTTP/HTTPS/SMTP/POP3サービスのものを次のように変換
 ディスティネーションアドレスをそれぞれのサーバのアドレスに変換
 (※無数のパケットの中から各サービスのパケットだけを区別するには、ディスティネーションポートがTCP 80(HTTP)/443(HTTPS)/25(SMTP)/110(POP3)であるかどうかで判断する)

テンプレート9の表示(別ウィンドウで開く)

テンプレート9の解説

 テンプレート5をベースに、外部ネットから内部ネットの特定サーバへアクセスできるよう設定を加えます。

 HTTP/HTTPS/SMTP/POP3といったサービスのポート転送を可能にするため、新たに50〜77行目を加えています。変更点は、サービスポートによって転送先を変えることだけで、いずれも同様の設定内容です。

 この中からHTTPサービス(53〜56行目)を取り上げ、解説します。

    53    http_ip='192.168.0.2'
    54    http_port='80'
    55    /sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp --dport $http_port -j DNAT --to-destination $http_ip:$http_port
    56    /sbin/iptables -A FORWARD -i eth0 -o eth1 -p tcp -d $http_ip --dport $http_port -j ACCEPT

 53・54行目でHTTPサーバのIPアドレスやポート番号を指定します。55行目では、Linuxルータのeth0側から入ってくるパケットのうち、「-p tcp --dport $http_port」にマッチするもの、つまりディスティネーションポートがHTTPサービスのものを、「--to-destination $http_ip:$http_port」を使って、パケットの送信先をHTTPサーバのアドレスとポートに変換し、転送します。

    55	/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp --dport $http_port -j DNAT --to-destination $http_ip:$http_port
        -t nat        natテーブルを使用
        -A PREROUTING			PREROUTINGチェインを使用し内部ネットからLinuxルータに入ってくるパケットを書き換える  
        -j DNAT       DNATを使用しディスティネーション(あて先)アドレスを書き換える  
        --to-destination $http_ip:$http_port    書き換え後のディスティネーションアドレスとポート番号

 FORWARDチェインのデフォルトルールで破棄(DROP)が設定されているため(24行目)、このままではeth0から入ってきたパケットを内部のサーバへ転送できません。そこで56行目のように、HTTPサーバへの転送を許可(ACCEPT)します。

 ここではHTTPサービスを例に説明しましたが、IPアドレスとポート番号を変更するだけで、ほかのサービスにも応用可能です。HTTPSならばポート番号を443番に(60〜63行目)、SMTPならばポート番号を25番に(67〜70行目)、POP3ならばポート番号を110番に(74〜77行目)に変更します。

 shスクリプトの用意ができたら、前回までと同じようにshスクリプトを実行します。内部クライアントから外部ネットへのアクセスや、外部ネットからWebサーバへのアクセスを確認します。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。