サーバとして
・受信パケットは破棄。ただしステートフル性を確認し、サーバから送信されたパケットに関連するものは許可
・送信パケットは基本的にすべて許可
・ループバックアドレスに関してはすべて許可
・メンテナンスホスト(内部)からの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
テンプレート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」を構築してみましょう。
Copyright © ITmedia, Inc. All Rights Reserved.