natテーブルを利用したLinuxルータの作成・3(外部から内部サーバへのアクセスと負荷分散):iptablesテンプレート集 改訂版(5)(2/3 ページ)
この連載では、初心者にとってハードルの高いiptablesの設定を、テンプレートを用いながら紹介していきます。「習うより慣れよ!」の精神でまず試してみてはいかがでしょう。(編集部)
テンプレート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の解説
テンプレート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.