中小規模の会社ネットワーク その2
こちらの続きです。
ゲートウェイ
名前の通り、外(インタネット)とのやりとりはすべてこの機器によって中継されます。通信パケットフィルターによって、危険性のある通信を遮断し、内(イントラネット)を安全に保つことができます。常時起動であることと、外との通信が容易であることから、DNSやウェブサーバとメールサーバ、NTP等を稼動するのに最適ですし、パケットフィルタリングだけでは処理能力に余裕がありますので、各種のネットワークサービスを稼動することとします。勿論、サービスが重くなれば、他にサーバを立てて処理を分散することも可能です。
GatewayとNAT
ゲートウェイでは通信を中継する際に、ポリシーに沿ってパケットフィルタリングを行います。要するにファイアウォール(防火壁、firewall)を構築します。代表的なポリシーは「何も通さない」と、「内からの通信は許し、外からの通信は遮断」です。いずれにしても、外(インタネット)からのアクセスはゲートウェイ内で処理し、内(イントラネット)には通さないことが原則になります。この場合、イントラネットはプライベートアドレス(192.168.0.0/16、もしくは、172.16.0.0/12)を使うことができます。
何も通さない
基本的に、内(イントラネット)からも外(インタネット)からも通信を開始されることはありません。全てのパケットはゲートウェイ内で破棄されます。その代わり、proxyをゲートウェイ内で稼動し、アプリケーション層で中継することになります。proxyでは通常、内から外へのウェブアクセスとFTPを許可します。アプリケーションはproxy対応が必要となります。
内からの通信は許し、外からの通信は遮断
NATです。内からの通信はゲートウェイのIPとポート番号を持つ通信として第3,4層(TCP/UDP/IP層)で外のサーバに転送(forward)されます。これは外のサーバからも、内のPCからも透過的ですので、通信プログラム(サーバ、アプリケーション共)はNATの存在を意識する必要はありません。
イントラネットからの自由なインタネットの利用を妨げたい特段の理由がなければ、スモールオフィスには適したポリシーです。特段の理由とは、例えば、「P2Pやメッセンジャーが帯域を圧迫するのを防ぐ」、「内からの機密データ流出を完全に阻止したい」、「社員がインタネットで遊んでしまわないようにする」などでしょう。
実装手段
LinuxのNAT実装であるIPマスカレードを含むIPフィルタであるIPTablesを使います。設定の概要は以下の通りです。
$IPTABLES = "/sbin/iptables"
$EXTDEV="ppp0" #-- インターネットに通じるPPPOE仮想NICデバイス
$POEDEV="eth0" #-- インターネットに通じる物理NICデバイス
$INTDEV="eth1" #-- イントラネットに接続されたNICデバイス
$INTRANET="192.168.7.0/16"
まず、基本的なポリシーです。外には出られて、中には入れない。
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT ACCEPT
ローカルホストとイントラネットからのアクセスは受け入れる
#--- allow access from lo, internal_net
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A INPUT -i $INTDEV -j ACCEPT
$IPTABLES -A FORWARD -i $INTDEV -j ACCEPT
インタネットからは、イントラネットから開始された通信中であるパケットのみ受け入れる。
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $EXTDEV -m state --state NEW,INVALID -j DROP
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
ウェブサーバへのインタネットからのアクセス(http, https)だけを受け入れる。
$IPTABLES -A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED --dport 80 -j ACCEPT
$IPTABLES -A INPUT -i $EXTDEV -p tcp --dport 80 -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTDEV -p tcp --sport 80 -j ACCEPT
$IPTABLES -A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED --dport 443 -j ACCEPT
$IPTABLES -A INPUT -i $EXTDEV -p tcp --dport 443 -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTDEV -p tcp --sport 443 -j ACCEPT
NATの設定
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
$IPTABLES -t nat -A POSTROUTING -o $EXTDEV -j MASQUERADE