連載
» 2010年02月09日 00時00分 公開

natテーブルを利用したLinuxルータの作成iptablesテンプレート集 改訂版(3)(3/3 ページ)

[鶴長鎮一,@IT]
前のページへ 1|2|3       

テンプレート6
Windowsファイル/プリンタ共有パケットのブロック

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

ルータとして
 Linuxサーバを経由して外部へ出ていくパケットのソースアドレスを変換
 内部アドレスやプライベートアドレスが外部に漏れないようにブロック
 Windowsファイル/プリンタ共有パケット(TCP/UDP 137〜139、445)の転送をブロック
 その他転送パケットで、内部ネット→外部ネットのものは許可。外部ネット→内部ネットへの転送パケットはステートフル性を確認できたものだけ許可

テンプレート5では、内部ネットから外部ネットへ出ていくパケットには特に制限を設けませんでした。テンプレート6では一部のパケットに制限を設けるようにします。例としてWindowsファイル/プリンタ共有機能で利用されるパケットとRPCパケットに制限を設けます。

 1    #! /bin/sh
 2
 3    trusthost='192.168.0.20'
 4    internal_net='192.168.0.0/24'
 5    my_internal_ip='192.168.0.1'
 6
 7    echo 1 > /proc/sys/net/ipv4/ip_forward
 8
 9    ##############
10    #Flush & Reset
11    ##############
12    /sbin/iptables -F
13    /sbin/iptables -t nat -F
14    /sbin/iptables -X
15
16    ##############
17    #Deafult Rule
18    ##############
19    /sbin/iptables -P INPUT DROP
20    /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
21
22    /sbin/iptables -P OUTPUT ACCEPT
23
24    /sbin/iptables -P FORWARD DROP
25    #/sbin/iptables -A FORWARD -i eth1 -o eth0 -s $internal_net -j ACCEPT
26    #/sbin/iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
27
28    #########
29    #loopback
30    #########
31    /sbin/iptables -A INPUT -i lo -j ACCEPT
32
33    ###############################
34    #ICMP trusthost->my_internal_ip
35    ###############################
36    /sbin/iptables -A INPUT -p icmp --icmp-type echo-request -s $trusthost -d $my_internal_ip -j ACCEPT
37    ###############################
38    #ICMP my_internal_ip->trusthost
39    ###############################
40    /sbin/iptables -A INPUT -p icmp --icmp-type echo-reply -s $trusthost -d $my_internal_ip -j ACCEPT
41    ###############################
42    #ssh trusthost-> my_internal_ip
43    ###############################
44    /sbin/iptables -A INPUT -p tcp --syn -m state --state NEW -s $trusthost -d $my_internal_ip --dport 22 -j ACCEPT
45    #################
46    #SNAT(masquerade)
47    #################
48    /sbin/iptables -t nat -A POSTROUTING -o eth0 -s $internal_net -j MASQUERADE
49
50    ################################################
51    #Blocking Private Address
52    ################################################
53    /sbin/iptables -A OUTPUT -o eth0 -d 10.0.0.0/8 -j DROP
54    /sbin/iptables -A OUTPUT -o eth0 -d 176.16.0.0/12 -j DROP
55    /sbin/iptables -A OUTPUT -o eth0 -d 192.168.0.0/16 -j DROP
56    /sbin/iptables -A OUTPUT -o eth0 -d 127.0.0.0/8 -j DROP
57    ##########
58    #Block SMB
59    ##########
60    /sbin/iptables -A FORWARD -p tcp -i eth1 -o eth0 --dport 137:139 -j DROP
61    /sbin/iptables -A FORWARD -p udp -i eth1 -o eth0 --dport 137:139 -j DROP
62    /sbin/iptables -A FORWARD -p tcp -i eth1 -o eth0 --dport 445 -j DROP
63    /sbin/iptables -A FORWARD -p udp -i eth1 -o eth0 --dport 445 -j DROP
64    #####################
65    #Forwarding Rule Etc
66    #####################
67    /sbin/iptables -A FORWARD -i eth1 -o eth0 -s $internal_net -j ACCEPT
68    /sbin/iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
69
70    #########
71    #logging
72    #########
73    /sbin/iptables -N LOGGING
74    /sbin/iptables -A LOGGING -j LOG --log-level warning --log-prefix "DROP:" -m limit
75    /sbin/iptables -A LOGGING -j DROP
76    /sbin/iptables -A INPUT -j LOGGING
77    /sbin/iptables -A FORWARD -j LOGGING
78
テンプレート6

テンプレート6の解説

 テンプレート5をベースに25・26行目をコメントアウトし、57〜73行目を新たに追加しています。内部→外部へ転送されるパケットを制限するには、filterテーブルのFORWARDチェインを利用します。

 ここでは、フィルタを実行する順番が重要です。先に25・26行目が実行されてしまうと、内部→外部へ転送されるパケットは無制限になります。そのため、FORWARDチェインに関するルールをすべて設定し終わった後で、あらためて72・73行目を実行します。それまでにWindowsファイル/プリンタ共有関連パケットをブロックするよう設定します。

    57	##########
    58	#Block SMB
    59	##########
    60	/sbin/iptables -A FORWARD -p tcp -i eth1 -o eth0 --dport 137:139 -j DROP
    61	/sbin/iptables -A FORWARD -p udp -i eth1 -o eth0 --dport 137:139 -j DROP
    62	/sbin/iptables -A FORWARD -p tcp -i eth1 -o eth0 --dport 445 -j DROP
    63	/sbin/iptables -A FORWARD -p udp -i eth1 -o eth0 --dport 445 -j DROP
    64	##########
    65	#Block RFC
    66	##########
    67	/sbin/iptables -A FORWARD -p tcp -i eth1 -o eth0 --dport 111 -j DROP
    68	/sbin/iptables -A FORWARD -p udp -i eth1 -o eth0 --dport 111 -j DROP
    69	#####################
    70	#Forwarding Rule Etc
    71	#####################
    72	/sbin/iptables -A FORWARD -i eth1 -o eth0 -s $internal_net -j ACCEPT
    73	/sbin/iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

 Windowsファイル/プリンタ共有ではTCP 137〜139番と445番、UDP 137〜139番と445番といったサービスポート番号が使用されます。そうしたポートを60〜63行目のようにブロックします。67、68行目については、次の「改造のヒント」で解説します。

改造のヒント:ほかのサービスの転送をブロックする

 特定サービスの転送をブロックするには、使用されているサービスポート番号を基に、設定を追加します。

 例えばUNIXのファイル共有サービスである「NFS」や、PtoP型ファイル共有アプリケーションといったサービスをブロックするには、RFCサービスに関するパケットを転送しないよう設定します。それにはRPCで使用するサービスポート番号のTCP・UDP 111番を転送しないよう、次のような2行を、テンプレート6の72行目の前までに追加します(テンプレート6には追加済み)。

    /sbin/iptables -A FORWARD -p tcp -i eth1 -o eth0 --dport 111 -j DROP
    /sbin/iptables -A FORWARD -p udp -i eth1 -o eth0 --dport 111 -j DROP

 サービスポート番号を把握できれば、どんなサービスもブロックできます。ただし、P2Pソフトのようにポート番号を特定できないサービスでは、別の手段を講じる必要があります。

 今回は、FORWARDチェインでLinuxサーバの内部→外部へ転送されるパケットを制限しました。そのため、Linuxサーバ自身はTCP・UDP 111番を使って外部とアクセスすることができます。サーバそのものが出すパケットも含め、送信パケットすべてをブロックするには、filterテーブルのOUTPUTチェインを使用します。

次回予告

 以上、iptablesのNAT・NAPT機能を解説しました。SNATでブロードバンドルータと同等の働きを持つLinuxサーバを構築できることがお分かりいただけたと思います。

 さらにサーバならではの機能を組み込めば、ブロードバンドルータ以上のものを実現できます。そこで次回は、パケットのディスティネーション側のIPアドレス情報を書き換える「DNAT」について解説します。これをProxyサーバと組み合わせ、「透過型Proxy」を構築してみましょう。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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