Firewallの設定



Salckware-11のKernelは、すでに2.4.33となっており、今までのバージョンと違いFirewallもIpchainsから より、柔軟性のあるiptablesになっています。

RedHat系のiptablesに関する資料は書店に行けば山程あるのですが、Slackwareでiptablesの資料は、 書店やインターネットで調査しても皆無でした。

手探り状態で、iptablesの設定を行った為か、かなりの時間をかけてしまいました。



◆Firewall以下の順序で行ってください、

  1. IPアドレスの説明

  2. グローバルIPアドレスの追加

  3. カーネルの再構築

  4. 設定の確認

  5. Firewallルールの設計

  6. iptablesの設定




◆IPアドレスの説明

Firewall(iptables)とは、グローバルIPアドレス(インターネット用のアドレス)とプライベートIPアドレス

(インターネットに接続できないIPアドレス)の変換を行なう機能の一種です。

プライベートIPアドレスはローカルネットワークの中で使用する意味のものですから、インターネットでは使用できません

インターネットにアクセスする場合はグローバルIPアドレスが必要です。Firewallは限られたグローバルIPアドレスを

複数のコンピュータで共用することで、グローバルIPアドレスの制限を超えてインターネットに接続する方法です。

  1. Firewallが必要な場合

    @グローバルIPアドレスが少ない場合、

    Aローカルネットワークをインターネットに接続したい場合、

    Bローカルネットワークを手間暇かけずに保護したい場合、(セキュリティ)

    CローカルネットワークのIPアドレスを変更しないでドメインサーバを構築したい。

    D外部からのアクセスからローカルネットワークを保護したい、

  2. Firewallを設定しては駄目な場合、

    ◆御使用のルータ等で、Firewallの機能を持っている場合は、そちらを御使用してください。

     

  3. hero-islandの例

    hero-islandで使用している、プライベートIPアドレス、グローバルIPアドレスは以下の通りです。

    これらのIPアドレスを使用して説明します。 インターネット(JPNICに登録してある)に接続するIPアドレスを設定します。


    グローバルIPアドレスローカルIPアドレス
    IPアドレス123.234.123.45〜123.234.123.60192.168.0.0〜192.168.0.255
    サブマスク255.255.255.240255.255.255.0
    ホスト名youyou-gw
    ドメイン名ドメイン名ドメイン名

    (1) ネットワーク構成

    以下にネットワーク構成図を示します

    
    
          ( Internet )
               |
               |
               |
               |  External [eth0]
               |  123.234.123.45〜123.234.123.60
        +------+--------------+
        | F/W (Slackware-11.0) |
        +------+--------------+
               |  Internal [eth1]
               |  192.168.0.254/24
               |
               |
               |
               |       Local Network (192.168.0.0/24)
               +---------+---------+-----------------
               |         |         |
            +--+-+    +--+-+    +--+-+
            | PC |    | PC |    | PC |
            +----+    +----+    +----+
    
    
    


トップへ戻る

◆グローバルIPアドレスの追加

グローバルIPアドレスは、以下の要領で追加します。


# vi /etc/rc.d/rc.inet1.conf[enter] ←rc.inet1.confを開きます。

赤字部分を追加します。
# /etc/rc.d/rc.inet1.conf
#
# This file contains the configuration settings for network interfaces.
# If USE_DHCP[interface] is set to "yes", this overrides any other settings.
# If you don't have an interface, leave the settings null ("").

# Config information for eth0:
IPADDR[0]="192.168.0.1"
NETMASK[0]="255.255.255.0"
USE_DHCP[0]=""
DHCP_HOSTNAME[0]=""

# Config information for eth1:
IPADDR[1]="123.234.123.47" ←DNSサーバのIPアドレス 
NETMASK[1]="255.255.255.240"
USE_DHCP[1]=""
DHCP_HOSTNAME[1]=""

# Config information for eth2:
IPADDR[2]=""
NETMASK[2]=""
USE_DHCP[2]=""
DHCP_HOSTNAME[2]=""

# Config information for eth3:
IPADDR[3]=""
NETMASK[3]=""
USE_DHCP[3]=""
DHCP_HOSTNAME[3]=""

# Default gateway IP address:
GATEWAY="123.234.123.46" ←ルータのIPアドレス

# Change this to "yes" for debugging output to stdout.  Unfortunately,
# /sbin/hotplug seems to disable stdout so you'll only see debugging output
# when rc.inet1 is called directly.
DEBUG_ETH_UP="no"


トップへ戻る

◆カーネルの再構築

カーネルの中身を調査しました結果、カーネルの再構築をしなくてもiptablesに必要なmodulesは組み込まれていました。カーネルの再構築は不要です。どうしてもチャレンジしたい方は以下に示します。

# cd /usr/src/linux

そして、

# make menuconfig

ネットワークオプションの設定

Networking options」を選択してください。

Networking options
Network packet filtering *
Network packet filtering debugging*
IP netfilter configuration
Connection tracking (required for masq/NAT)*
FTP protocol supportM
IRC protocol supportM
IP tables support (required for filtering/masq/NAT)*
limit match supportM
MAC address match supportM
netfilter MARK match supportM
Multiple port match supportM
TOS match support M
tcpmss match supportM
Connection state match supportM
Unclean match support (EXPERIMENTAL)M
Owner match support (EXPERIMENTAL)M
Packet filtering*
REJECT target supportM
MIRROR target support (EXPERIMENTAL)M
Full NATM
MASQUERADE target support*
REDIRECT target supportM
Packet manglingM
TOS target supportM
MARK target supportM
LOG target support*
ipchains (2.2-style) supportM

# make dep

# make clean

# make bzImage

# make modules

# make modules_install

再起動をおこないます。


トップへ戻る

◆設定の確認

再起動したら、フィルタリング機能とナット機能、グローバルIPの設定を確認します。
# iptables -L と入力して、以下のように表示されるか確認します。
Chain INPUT (policy ACCEPT) 
target     prot opt source               destination 
 
Chain FORWARD (policy ACCEPT) 
target     prot opt source               destination 
 
Chain OUTPUT (policy ACCEPT) 
target     prot opt source               destination 

表示内容が違う場合は、カーネルの再構築に失敗していると思えます。

# iptables -L -t nat と入力して、以下のように表示されるか確認します。
 Chain PREROUTING (policy ACCEPT) 
target     prot opt source               destination 
 
Chain POSTROUTING (policy ACCEPT) 
target     prot opt source               destination 
 
Chain OUTPUT (policy ACCEPT) 
target     prot opt source               destination

次にグローバルIPアドレス設定の確認をします。
# ifconfig
eth0     Link encap:Ethernet HWaddr 52:54:00:D9:60:14
         inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
                            以下省略
lo       Link encap:Local Looppack
         inet addr:127.0.0.1 Mask:255.0.0.0
         UP BROADCAST LOOKBACK RUNNING MTU:3584 Metric:1
         RX packets:20 errors:0 overruns:0 frame:0
         TX packets:20 errors:0 overruns:0 frame:0
         collision:0

eth1     Link encap:Ethernet HWaddr 52:54:00:D9:60:14
         inet addr:123.234.123.47 Bcast:123.234.123.60 Mask:255.255.255.254
         UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
                            以下省略
lo       Link encap:Local Looppack
         inet addr:127.0.0.1 Mask:255.0.0.0
         UP BROADCAST LOOKBACK RUNNING MTU:3584 Metric:1
         RX packets:20 errors:0 overruns:0 frame:0
         TX packets:20 errors:0 overruns:0 frame:0
         collision:0

  • routeの確認

    # routeを力すると以下のように表示されます。赤色の部分を確認してください。

    
    # route
    Kernel routing table
    Destinnation      Gateway         Genmask          Flages    Metric Ref  Use  Iface
    
    123.234.123.45      *            255.255.255.240       U          0     0    0    eth0 
    localnet               *            255.255.255.0          U          0     0    0    eth0:0 (カードが2枚の場合はeth1) 
    loopback              *            255.255.255.0          U          0     0    1    lo
    default      123.234.123.46   0.0.0.0                UG         1     0    0    eth0   
    

    トップへ戻る

    ◆Firewallルールの設計

    以上で、Firewaallの環境設定は完了です。
    これから、Firewallを円滑に運用するためにルールの設計をしなければなりません。
    ルールの設計が不十分だと、Firewallも無意味になってしまいます。また、ルールが強すぎると
    必要なサービスまで使えなくなってしまい不便な環境となってしまいます。
    何を何から守るべきか、必要なものと不必要なものを明確にする必要があります。
    hero-islandのルールは、以下のとおりです。

    ★フィルタリングのルール

    1. PORT80のwebサーバは、誰にでも、どこからでもアクセスを許可する。

    2. PORT53のDNSサーバは、誰にでも、どこからでもアクセスを許可する。

    3. PORT25のMailサーバは、誰にでも、どこからでもアクセスを許可する。

    4. 各サーバからのFirewallを介したSYNパケットのみでは外部に出さない。

    5. 各サーバは同一セグメント上のホストに直接アクセスできない。必ずFirewallを通過させる。

    6. 上記以外は、全て許可しない。


    トップへ戻る

    ◆iptablesの設定

    1. 基本的な説明
      赤字の部分を実際に入力してください。
       vi /etc/iptables.sh    ←/etc/iptables.shを開きます。
      #!/bin/bash
      iptables -P INPUT ACCEPT ←INPUT は、全てを許可( ACCEPT)します。
      iptables -P FORWARD DROP ←FORWARD は使わないので放棄(DROP)します。
      iptables -P OUTPUT ACCEPT ←OUTPUT は、全てを許可(ACCEPT)します。
      #
      iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT ←loopback自分自身は許可(ACCEPT)
      iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT ←loopback自分自身は許可(ACCEPT)
      iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j ACCEPT ←eth1(内部)からのアクセスはすべて許可します。
      iptables -A OUTPUT -o eth1 -d 192.168.0.0/24 -j ACCEPT ←eth1(内部)からのアクセスはすべて許可します。
      #
      iptables -A INPUT   -m state --state ESTABLISHED,RELATED -j ACCEPT ←接続が確立したパケットの応答は許可します。
      #
      iptables -A INPUT -p udp --sport 53 -j ACCEPT ←DNSへの問合せはすべて許可します。
      iptables -A OUTPUT -p udp --dport 53 -j ACCEPT ←DNSへの問合せはすべて許可します。
      #
      iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ←マスカレードを定義します。
      echo 1 > /proc/sys/net/ipv4/ip_forward
      #
      echo 1 > /proc/sys/net/ipv4/tcp_syncookies
      iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT ←SYN FLOOD攻撃対策
      #
      echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter ←IP Spoofing防御用
      #
      echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts ←BroadcastへのPingの無視
      #
      echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses ←偽のエラーレスポンスを無視
      #
      iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j ACCEPT ←PORT-SCAN対策
      #
      iptables -A FORWARD -p icmp --icmp-typep echo-request -m limit --limit 1/s -j ACCEPT ←ping of death対策
      #
      iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset ←113PORTのレスポンス低下防止
      #
      iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT ←接続が確立したパケットの応答は許可します。
      #
      iptables -A FORWARD -i eth1 -p icmp -j ACCEPT ←外部へのpingを許可します。
      #
      iptables -A FORWARD -i eth0 -p tcp --dport 80 -j ACCEPT←wwwの通過および応答を許可します。
      iptables -A FORWARD -i eth0 -p tcp --dport 25 -j ACCEPT←mail(smtp)の通過および応答を許可します。
      iptables -A FORWARD -i eth0 -p tcp --dport 110 -j ACCEPT←mail(pop3)の通過および応答を許可します。
      iptables -A FORWARD -i eth0 -p tcp --dport 143 -j ACCEPT
      iptables -A INPUT -i eth1 -p udp --dport 137 -j ACCEPT←ローカルネットワーク内からのSAMBAへのアクセスをすべて許可します。
      iptables -A INPUT -i eth1 -p udp --dport 138 -j ACCEPT
      iptables -A INPUT -i eth1 -p tcp --dport 139 -j ACCEPT
      iptables -A INPUT -i eth1 -p tcp --dport 445 -j ACCEPT
      iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 10000 -j ACCEPT←ローカルネットワーク内からのWebmin(10000番ポート)への接続を許可します。
      iptables -P INPUT DROP←上記以外のパケットは全て無視します。
      #iptables -A FORWARD  -i eth0 -j LOG←うまくサービスが動作しない時には、コメントを外し/var/log/messages を見ます。

      wqでセーブします。

    2. 設定をSAVEする。
      以前は、全てコマンドで打ち込んでいましたが、入力ミスが多発した為にシェルを作成した次第です。

      以下の例ではシェルを実行してセーブをしていますが、面倒な場合は/etc/rc.d/rc.localでシェルを実行させても問題はありません。
      # chmod 755 /etc/iptables.sh

      # cd /etc

      /etc# ./iptables.sh

      /etc# iptables-save > /etc/iptables.rules

    3. restoreの追加
      vi /etc/rc.d/rc.local

      /etc/rc.d/rc.localに以下の行を追加します。
      if [ -f /etc/iptables.rules ]; then
         echo "Starting IPTABLES: /etc/iptables.rules" 
         /usr/sbin/iptables-restore < /etc/iptables.rules
      fi
      

      ここで、REBOOTをします。

    4. iptablesの確認
      iptables -L
      Chain INPUT (policy DROP)
      target
      ACCEPT    tcp -- anywhere   anywhere    tcp dpt:http
      ACCEPT    tcp -- anywhere   anywhere    tcp dpt:domain
      ACCEPT    udp -- anywhere   anywhere    tcp dpt:domain
      ACCEPT    tcp -- anywhere   anywhere    tcp dpt:smtp
      ACCEPT    tcp -- anywhere   anywhere    tcp spt:smtp
      ACCEPT    tcp -- anywhere   anywhere    tcp dpt:pop3
      ACCEPT    tcp -- anywhere   anywhere    tcp spt:pop3
      ACCEPT    tcp -- localnet   anywhere    tcp dpt:10000
      ACCEPT    tcp -- localnet   anywhere    tcp spt:10000
      ACCEPT    tcp -- anywhere   anywhere    tcp flags:SYM,RST,ACK/SYM limit avg 1/sec burst 5
      ACCEPT    icmp -- anywhere   anywhere   limit: avg 1/sec burst 5 icmp echo-request
      
      Chain FORWADR (policy DROP) 
      target     prot opt source               destination 
      
      Chain OUPUT (policy ACCEPT) 
      target     prot opt source               destination 
      
      

    5. lsmodによるmodulesの確認
      Iptablesを実行すると以下のmodulesの存在を確認します。
      lsmod ←lsmodコマンドを投入します。
      Module         Size   Use by     Not trainted
      ipt_REJECT     3288   1  (autoclean)  ←存在を確認します。
      ipt_limit       888   3  (autoclean)  ←存在を確認します。
      ipt_MASQUERADE 2368   1  (autoclean)  ←存在を確認します。
      iptable_nat   26374   1  (autoclean) [ipt_MASQUERADE] ←存在を確認します。
      ipt_state       536   2  (autoclean)  ←存在を確認します。
      ipt_conntrack 31256   0  (autoclean) [ipt_MASQUERADE iptable_nat ipt_state] ←存在を確認します。
      iptable_filter 1708   1  (autoclean)  ←存在を確認します。
      ip_tables     15360   0  (autoclean) [ipt_REJECT ipt_limit ipt_MASQUERADE iptable_nat ipt_state iptable_filter] ←存在を確認します。
      

      私が作成したiptables.shを実行すると上記のmodulesがloadされる筈ですが、

      上記のmodulesが存在しない場合は、カーネルの再構築が上手くいっていないことになります。

      iptableが実行されていない状態では当然loadされていませんので勘違いしないでください。

      iptablesが動作しない!あるいは部分的に動作しない原因の多くは、これならの問題だと思います。

    トップへ戻る


    前ページへ戻る








    ご質問・お問い合わせ - 免責事項
    Copyright (C) 1998 hero-island. All Rights Reserved.