PCルーター構築(PPPoE+iptables)

最終更新日: 2007.12.10

<<トップページ <<新着情報 <<質問BBS <<逆引き集 <<アンケート <<リンク集 <<サイト内検索 <<ダウンロード <<管理人へメール <<CentOSで自宅サーバー構築

■概要

LinuxサーバーをPCルーターにする。ここでは、一般的な市販のルーターと同じように以下のことができるようにする。
※Linuxサーバーをブロードバンドモデムで直接PPPoE接続する場合のみで、市販ルーター経由接続環境の場合は不可

【PCルーターでできるようにすること】
・グローバルIPアドレス1個で、内部の複数のマシンが同時にインターネットを利用できるようにする(IPマスカレード)
・各種サーバーサービスに必要なポート以外の外部からのアクセスは遮断する(ファイアウォール)
・サーバー機とルーター機が異なる場合でも外部からサーバー機の各種サーバーサービスへアクセス可能にする(NAT)

【必要な機器】
・ネットワークアダプタ(NIC)×2
※ルーターとするサーバーには、インターネット(外部向け)接続用とハブ(内部向け)接続用に2枚必要
・ハブ

【前提とするネットワーク条件】
ネットワークアドレス:192.168.1.0/24
LinuxサーバーIPアドレス:192.168.1.1固定
クライアントIPアドレス:192.168.1.2〜192.168.1.254

【想定するネットワーク環境】



■ネットワークアダプタ(NIC)設定

(1)NIC(eth1側)を外部接続用に設定
[root@fedora ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth1 ← NIC(eth1側)設定ファイル編集
DEVICE=eth1
ONBOOT=no

[root@fedora ~]# /etc/rc.d/init.d/network reload ← ネットワーク設定反映
インターフェース eth0 を終了中:                            [  OK  ]
ループバックインターフェースを終了中                       [  OK  ]
ネットワークパラメーターを設定中:                          [  OK  ]
ループバックインターフェイスを呼び込み中                   [  OK  ]
インターフェース eth0 を活性化中:                          [  OK  ]
eth1が起動しないことを確認

[root@fedora ~]# ifconfig eth1 ← NIC(eth1側)設定確認
eth1      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:588 (588.0 b)
inet addrが表示されないことを確認

(2)NIC(eth0側)を内部接続用に設定
[root@fedora ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 ← NIC(eth0側)ネットワーク設定ファイル編集
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.1
NETMASK=255.255.255.0
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
GATEWAY=192.168.1.1

[root@fedora ~]# /etc/rc.d/init.d/network reload ← ネットワーク設定反映
インターフェース eth0を終了中:                             [  OK  ]
ループバックインターフェース を終了中                      [  OK  ]
ネットワークパラメーターを設定中:                          [  OK  ]
ループバックインターフェイスを呼び込み中                   [  OK  ]
インターフェース eth0を活性化中:                           [  OK  ]

[root@fedora ~]# ifconfig eth0 ← NIC(eth0側)ネットワーク設定確認
eth0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0 ← IPアドレスが192.168.1.1になっていること
          inet6 addr: fe80::290:99ff:fe80:272d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:22625 errors:0 dropped:0 overruns:0 frame:0
          TX packets:29064 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2536922 (2.4 Mb)  TX bytes:21279369 (20.2 Mb)
          Interrupt:3 Base address:0x7400

■ブロードバンドモデムでインターネット接続(PPPoE)

(1)インターネット接続設定
[root@fedora ~]# adsl-setup ← ADSL接続設定コマンド投入
Welcome to the ADSL client setup.  First, I will run some checks on
your system to make sure the PPPoE client is installed properly...


LOGIN NAME

Enter your Login Name (default root): XXXXXXXX ← プロバイダから通知されたユーザIDを応答

INTERFACE

Enter the Ethernet interface connected to the ADSL modem
For Solaris, this is likely to be something like /dev/hme0.
For Linux, it will be ethX, where 'X' is a number.
(default eth0): eth1 ← eth1応答

Do you want the link to come up on demand, or stay up continuously?
If you want it to come up on demand, enter the idle time in seconds
after which the link should be dropped.  If you want the link to
stay up permanently, enter 'no' (two letters, lower-case.)
NOTE: Demand-activated links do not interact well with dynamic IP
addresses.  You may have some problems with demand-activated links.
Enter the demand value (default no):  ← 空ENTER

DNS

Please enter the IP address of your ISP's primary DNS server.
If your ISP claims that 'the server will provide dynamic DNS addresses',
enter 'server' (all lower-case) here.
If you just press enter, I will assume you know what you are
doing and not modify your DNS setup.
Enter the DNS information here:  ← 空ENTER

PASSWORD

Please enter your Password:  ← プロバイダから通知されたパスワードを応答※表示はされない
Please re-enter your Password:  ← プロバイダから通知されたパスワードを応答(確認)※表示はされない

USERCTRL

Please enter 'yes' (two letters, lower-case.) if you want to allow
normal user to start or stop DSL connection (default yes): no ← no応答(rootユーザのみインターネット接続操作を許可)

FIREWALLING

Please choose the firewall rules to use.  Note that these rules are
very basic.  You are strongly encouraged to use a more sophisticated
firewall setup; however, these will provide basic security.  If you
are running any servers on your machine, you must choose 'NONE' and
set up firewalling yourself.  Otherwise, the firewall rules will deny
access to all standard servers like Web, e-mail, ftp, etc.  If you
are using SSH, the rules will block outgoing SSH connections which
allocate a privileged source port.

The firewall choices are:
0 - NONE: This script will not set any firewall rules.  You are responsible
          for ensuring the security of your machine.  You are STRONGLY
          recommended to use some kind of firewall rules.
1 - STANDALONE: Appropriate for a basic stand-alone web-surfing workstation
2 - MASQUERADE: Appropriate for a machine acting as an Internet gateway
                for a LAN
Choose a type of firewall (0-2): 2 ← 2応答

Start this connection at boot time

Do you want to start this connection at boot time?
Please enter no or yes (default no):  ← 空ENTER

** Summary of what you entered **

Ethernet Interface: eth1
User name:          XXXXXXXX
Activate-on-demand: No
DNS:                Do not adjust
Firewalling:        MASQUERADE
User Control:       no
Accept these settings and adjust configuration files (y/n)? y ← 設定確認してy応答
Adjusting /etc/sysconfig/network-scripts/ifcfg-ppp0
Adjusting /etc/ppp/chap-secrets and /etc/ppp/pap-secrets
  (But first backing it up to /etc/ppp/chap-secrets.bak)
  (But first backing it up to /etc/ppp/pap-secrets.bak)



Congratulations, it should be all set up!

Type '/sbin/ifup ppp0' to bring up your xDSL link and '/sbin/ifdown ppp0'to bring it down.
Type '/sbin/adsl-status /etc/sysconfig/network-scripts/ifcfg-ppp0'to see the link status.



(2)問合せ先DNSサーバー設定
[root@fedora ~]# sed -i '/^nameserver/d' /etc/resolv.conf ← 旧問合せ先DNSサーバー設定削除

[root@fedora ~]# echo "nameserver XXX.XXX.XXX.XXX" >> /etc/resolv.conf
 ← 問合せ先DNSサーバーにプロバイダから通知されたDNSサーバー(プライマリ)を設定

[root@fedora ~]# echo "nameserver XXX.XXX.XXX.XXX" >> /etc/resolv.conf
 ← 問合せ先DNSサーバーにプロバイダから通知されたDNSサーバー(セカンダリ)を設定

[root@fedora ~]# cat /etc/resolv.conf | grep nameserver ← 問合せ先DNSサーバーのIPアドレス確認
nameserver XXX.XXX.XXX.XXX
nameserver XXX.XXX.XXX.XXX

(4)インターネット接続
[root@fedora ~]# vi /etc/rc.d/init.d/adsl ← ADSL起動スクリプト作成
#!/bin/bash
#
# adsl                     This script starts or stops an ADSL connection
#
# chkconfig: 2345 99 01
# description: Connects to ADSL provider
#
# LIC: GPL
#
# Copyright (C) 2000 Roaring Penguin Software Inc.  This software may
# be distributed under the terms of the GNU General Public License, version
# 2 or any later version.

# Source function library if it exists
test -r /etc/rc.d/init.d/functions && . /etc/rc.d/init.d/functions

# From AUTOCONF
prefix=/usr
exec_prefix=/usr

# Paths to programs
START=/sbin/ifup
STOP=/sbin/ifdown
STATUS=/usr/sbin/adsl-status

# Paths to config
IFCFG=/etc/sysconfig/network-scripts/ifcfg-ppp*

start() {
    echo -n "Bringing up ADSL link"
    for cfg in `ls $IFCFG`
    do
        DEVICE=`grep DEVICE $cfg|cut -d = -f 2`
        $START $DEVICE
        if [ $? -ne 0 ]; then
            echo_failure
            exit
        fi
    done
    touch /var/lock/subsys/adsl
    echo_success
    echo ""
}

stop() {
    echo -n "Shutting down ADSL link"
    for cfg in `ls $IFCFG`
    do
        DEVICE=`grep DEVICE $cfg|cut -d = -f 2`
        PIDFILE=`grep PIDFILE $cfg|cut -d = -f 2`
        if [ -f $PIDFILE ]; then
            ps `cat $PIDFILE` > /dev/null 2>&1
            if [ $? -eq 0 ]; then
                $STOP $DEVICE > /dev/null 2>&1
                if [ $? -ne 0 ]; then
                    echo_failure
                    exit
                fi
            fi
        fi
    done
    rm -f /var/lock/subsys/adsl
    echo_success
    echo ""
}

case "$1" in
    start)
        start
        ;;

    stop)
        stop
        ;;

    restart)
        stop
        start
        ;;

    status)
        for cfg in `ls $IFCFG`
        do
            $STATUS $cfg
        done
        ;;

    *)
        echo "Usage: adsl {start|stop|restart|status}"
        exit 1
esac

exit 0

[root@fedora ~]# chmod +x /etc/rc.d/init.d/adsl ← ADSL起動スクリプトへ実行権限付加

[root@fedora ~]# /etc/rc.d/init.d/adsl start ← ADSL起動
Bringing up ADSL link                                      [  OK  ]

[root@fedora ~]# chkconfig --add adsl ← ADSL起動スクリプトをchkconfigへ追加

[root@fedora ~]# chkconfig adsl on ← ADSL自動起動設定

[root@fedora ~]# chkconfig --list adsl ← ADSL自動起動設定確認
adsl            0:off   1:off   2:on    3:on    4:on    5:on    6:off ← ランレベル2〜5のon確認

(5)インターネット接続確認
[root@fedora ~]# ping -c 4 www.linux.or.jp ← 外部(www.linux.or.jp)と通信できるか確認
PING mizuho.linux.or.jp (210.171.226.47) 56(84) bytes of data.
64 bytes from mizuho.linux.or.jp (210.171.226.47): icmp_seq=0 ttl=59 time=14.6 ms
64 bytes from mizuho.linux.or.jp (210.171.226.47): icmp_seq=1 ttl=59 time=13.9 ms
64 bytes from mizuho.linux.or.jp (210.171.226.47): icmp_seq=2 ttl=59 time=14.2 ms
64 bytes from mizuho.linux.or.jp (210.171.226.47): icmp_seq=3 ttl=59 time=14.5 ms

--- mizuho.linux.or.jp ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms ← 0% packet lossを確認
rtt min/avg/max/mdev = 13.995/14.340/14.639/0.275 ms, pipe 2

■IPマスカレード&ファイアウォール設定

(1)IPマスカレード&ファイアウォール設定
[root@fedora ~]# vi iptables-router.sh ← IPマスカレード&ファイアウォール設定スクリプト作成※
#!/bin/bash


#---------------------------------------#
# 設定開始                              #
#---------------------------------------#

# 内部インタフェース名定義
LAN=eth0

# 公開外部インタフェース名定義
PUBLIC_WAN=ppp0

# 公開サーバープライベートIPアドレス定義
SERVER=192.168.1.1


#---------------------------------------#
# 設定終了                              #
#---------------------------------------#

# 自ホストプライベートIPアドレス取得
IPADDR=`ifconfig $LAN|sed -e 's/^.*inet addr:\([^ ]*\).*$/\1/p' -e d`

# 内部ネットワークのネットマスク取得
LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d`

# 内部ネットワークアドレス取得
LOCALNET_ADDR=`netstat -rn|grep $LAN|grep $LOCALNET_MASK|grep 0.0.0.0|cut -f1 -d' '`
LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK

# 外部インタフェース名取得
# ※マルチセッション対応
cd /etc/sysconfig/network-scripts
WANLIST=`ls ifcfg-ppp* | LANG=C egrep -v '(ifcfg-lo|:|-range|rpmsave|rpmorig|rpmnew)' | \
            LANG=C egrep -v '(~|\.bak)$' | \
            LANG=C egrep 'ifcfg-[A-Za-z0-9\._-]+$' | \
            sed 's/^ifcfg-//g' |
            sed 's/[0-9]/ &/' | LANG=C sort -k 1,1 -k 2n | sed 's/ //'`

# 読み込み対象モジュール追加
sed -i '/IPTABLES_MODULES/d' /etc/sysconfig/iptables-config
modinfo ip_nat_pptp > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "IPTABLES_MODULES=\"ip_conntrack_ftp ip_nat_ftp ip_nat_pptp\"" >> /etc/sysconfig/iptables-config
else
    echo "IPTABLES_MODULES=\"ip_conntrack_ftp ip_nat_ftp\"" >> /etc/sysconfig/iptables-config
fi

# パケット転送停止
# ※ルール設定中のパケット通過防止
sysctl -w net.ipv4.ip_forward=0 > /dev/null

# ファイアウォール停止(すべてのルールをクリア)
/etc/rc.d/init.d/iptables stop

# デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定
iptables -P INPUT   DROP   # 受信はすべて破棄
iptables -P OUTPUT  ACCEPT # 送信はすべて許可
iptables -P FORWARD DROP   # 通過はすべて破棄

# SYN Cookiesを有効にする
# ※TCP SYN Flood攻撃対策
sysctl -w net.ipv4.tcp_syncookies=1 > /dev/null
sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf

# ブロードキャストアドレス宛pingには応答しない
# ※Smurf攻撃対策
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null
sed -i '/net.ipv4.icmp_echo_ignore_broadcasts/d' /etc/sysctl.conf
echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf

# ICMP Redirectパケットは拒否
sed -i '/net.ipv4.conf.*.accept_redirects/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
    sysctl -w net.ipv4.conf.$dev.accept_redirects=0 > /dev/null
    echo "net.ipv4.conf.$dev.accept_redirects=0" >> /etc/sysctl.conf
done

# Source Routedパケットは拒否
sed -i '/net.ipv4.conf.*.accept_source_route/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
    sysctl -w net.ipv4.conf.$dev.accept_source_route=0 > /dev/null
    echo "net.ipv4.conf.$dev.accept_source_route=0" >> /etc/sysctl.conf
done

# フラグメント化されたパケットはログを記録して破棄
iptables -N LOG_FRAGMENT
iptables -A LOG_FRAGMENT -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES FRAGMENT] : '
iptables -A LOG_FRAGMENT -j DROP
iptables -A INPUT -f -j LOG_FRAGMENT
iptables -A FORWARD -f -j LOG_FRAGMENT

# 外部からの送信元がプライベートIPアドレスのパケットはログを記録して破棄
# ※IP spoofing攻撃対策
iptables -N LOG_SPOOFING
iptables -A LOG_SPOOFING -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES SPOOFING] : '
iptables -A LOG_SPOOFING -j DROP
for WAN in $WANLIST
do
    iptables -A INPUT -i $WAN -s 127.0.0.0/8    -j LOG_SPOOFING
    iptables -A INPUT -i $WAN -s 10.0.0.0/8     -j LOG_SPOOFING
    iptables -A INPUT -i $WAN -s 172.16.0.0/12  -j LOG_SPOOFING
    iptables -A INPUT -i $WAN -s 192.168.0.0/16 -j LOG_SPOOFING
    iptables -A FORWARD -i $WAN -s 127.0.0.0/8    -j LOG_SPOOFING
    iptables -A FORWARD -i $WAN -s 10.0.0.0/8     -j LOG_SPOOFING
    iptables -A FORWARD -i $WAN -s 172.16.0.0/12  -j LOG_SPOOFING
    iptables -A FORWARD -i $WAN -s 192.168.0.0/16 -j LOG_SPOOFING
done

# 外部とのNetBIOS関連のアクセスはログを記録せずに破棄
for WAN in $WANLIST
do
    iptables -A INPUT -i $WAN -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
    iptables -A INPUT -i $WAN -p udp -m multiport --dports 135,137,138,139,445 -j DROP
    iptables -A OUTPUT -o $WAN -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
    iptables -A OUTPUT -o $WAN -p udp -m multiport --sports 135,137,138,139,445 -j DROP
    iptables -A FORWARD -i $WAN -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
    iptables -A FORWARD -i $WAN -p udp -m multiport --dports 135,137,138,139,445 -j DROP
    iptables -A FORWARD -o $WAN -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
    iptables -A FORWARD -o $WAN -p udp -m multiport --sports 135,137,138,139,445 -j DROP
done

# 1秒間に4回を超えるpingはログを記録して破棄
iptables -N LOG_PINGDEATH
iptables -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A LOG_PINGDEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] : '
iptables -A LOG_PINGDEATH -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH
iptables -A FORWARD -o ! $WAN -p icmp --icmp-type echo-request -j LOG_PINGDEATH

# 送信元IPアドレスが内部ネットワーク範囲外のアクセスはログを記録して破棄
# ※Ingress対策
iptables -N LOG_INGRESS
iptables -A LOG_INGRESS -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES INGRESS] : '
iptables -A LOG_INGRESS -j DROP
iptables -A FORWARD -i $LAN -s ! $LOCALNET -j LOG_INGRESS

# パスMTU問題対処
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

# 自ホストからのアクセスをすべて許可
iptables -A INPUT -i lo -j ACCEPT

# 内部からのアクセスをすべて許可
iptables -A INPUT -i $LAN -j ACCEPT
iptables -A FORWARD -i $LAN -j ACCEPT

# 内部からのインターネットへの同時接続を可能にする
# ※IP masquerade(NAPT) 
for WAN in $WANLIST
do
    iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE
done

# 内部から行ったアクセスに対する外部からの返答アクセスを許可
for WAN in $WANLIST
do
    iptables -A INPUT -i $WAN -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A FORWARD -i $WAN -m state --state ESTABLISHED,RELATED -j ACCEPT
done

# 外部からの必須ICMPパケットを許可
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type source-quench -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type parameter-problem -j ACCEPT

# 113番ポート(IDENT)へのアクセスには拒否応答
# ※メールサーバ等のレスポンス低下防止
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
iptables -A FORWARD -p tcp --dport 113 -j REJECT --reject-with tcp-reset

#----------------------------------------------------------#
# 自ホストが各種サービスを公開する場合の設定(ここから)     #
#----------------------------------------------------------#

router_eq_server(){

    # 外部からの22番ポート(SSH)へのアクセスを許可
    # ※SSHサーバーを公開する場合のみ
    iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 22 -j ACCEPT

    # 外部からのTCP/UDP53番ポート(DNS)へのアクセスを許可
    # ※外部向けDNSサーバーを運用する場合のみ
    iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 53 -j ACCEPT
    iptables -A INPUT -i $PUBLIC_WAN -p udp --dport 53 -j ACCEPT

    # 外部からの80番ポート(HTTP)へのアクセスを許可
    # ※Webサーバーを公開する場合のみ
    iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 80 -j ACCEPT

    # 外部からの443番ポート(HTTPS)へのアクセスを許可
    # ※Webサーバーを公開する場合のみ
    iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 443 -j ACCEPT

    # 外部からの21番ポート(FTP)へのアクセスを許可
    # ※FTPサーバーを公開する場合のみ
    iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 21 -j ACCEPT

    # 外部からのPASV用ポート(FTP-DATA)へのアクセスを許可
    # ※FTPサーバーを公開する場合のみ
    # ※PASV用ポート60000:60030は当サイトの設定例
    iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 60000:60030 -j ACCEPT

    # 外部からの25番ポート(SMTP)へのアクセスを許可
    # ※SMTPサーバーを公開する場合のみ
    iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 25 -j ACCEPT

    # 外部からの465番ポート(SMTPS)へのアクセスを許可
    # ※SMTPSサーバーを公開する場合のみ
    iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 465 -j ACCEPT

    # 外部からの110番ポート(POP3)へのアクセスを許可
    # ※POP3サーバーを公開する場合のみ
    iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 110 -j ACCEPT

    # 外部からの995番ポート(POP3S)へのアクセスを許可
    # ※POP3Sサーバーを公開する場合のみ
    iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 995 -j ACCEPT

    # 外部からの143番ポート(IMAP)へのアクセスを許可
    # ※IMAPサーバーを公開する場合のみ
    iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 143 -j ACCEPT

    # 外部からの993番ポート(IMAPS)へのアクセスを許可
    # ※IMAPSサーバーを公開する場合のみ
    iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 993 -j ACCEPT

    # 外部からの1723番ポート(PPTP)へのアクセスを許可
    # 外部からのGREプロトコルへのアクセスを許可
    # ※PPTPサーバーを公開する場合のみ
    iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 1723 -j ACCEPT
    iptables -A INPUT -i $PUBLIC_WAN -p gre -j ACCEPT
}

#----------------------------------------------------------#
# 自ホストが各種サービスを公開する場合の設定(ここまで)     #
#----------------------------------------------------------#

#----------------------------------------------------------#
# 他ホストが各種サービスを公開する場合の設定(ここから)     #
#----------------------------------------------------------#

router_ne_server(){

    # 外部からの公開サーバーの22番ポート(SSH)へのアクセスを許可&転送
    # ※SSHサーバーを公開する場合のみ
    iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 22 -j ACCEPT
    iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 22 -j DNAT --to $SERVER

    # 外部からの公開サーバーのTCP/UDP53番ポート(DNS)へのアクセスを許可&転送
    # ※外部向けDNSサーバーを運用する場合のみ
    iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 53 -j ACCEPT
    iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 53 -j DNAT --to $SERVER
    iptables -A FORWARD -i $PUBLIC_WAN -p udp -d $SERVER --dport 53 -j ACCEPT
    iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p udp --dport 53 -j DNAT --to $SERVER

    # 外部からの公開サーバーの80番ポート(HTTP)へのアクセスを許可&転送
    # ※Webサーバーを公開する場合のみ
    iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 80 -j ACCEPT
    iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 80 -j DNAT --to $SERVER

    # 外部からの公開サーバーの443番ポート(HTTPS)へのアクセスを許可&転送
    # ※Webサーバーを公開する場合のみ
    iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 443 -j ACCEPT
    iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 443 -j DNAT --to $SERVER

    # 外部からの公開サーバーの21番ポート(FTP)へのアクセスを許可&転送
    # ※FTPサーバーを公開する場合のみ
    iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 21 -j ACCEPT
    iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 21 -j DNAT --to $SERVER

    # 外部からの公開サーバーのPASV用ポート(FTP-DATA)へのアクセスを許可&転送
    # ※FTPサーバーを公開する場合のみ
    # ※PASV用ポート60000:60030は当サイトの設定例
    iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 60000:60030 -j ACCEPT
    iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 60000:60030 -j DNAT --to $SERVER

    # 外部からの公開サーバーの25番ポート(SMTP)へのアクセスを許可&転送
    # ※SMTPサーバーを公開する場合のみ
    iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 25 -j ACCEPT
    iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 25 -j DNAT --to $SERVER

    # 外部からの公開サーバーの465番ポート(SMTPS)へのアクセスを許可&転送
    # ※SMTPSサーバーを公開する場合のみ
    iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 465 -j ACCEPT
    iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 465 -j DNAT --to $SERVER

    # 外部からの公開サーバーの110番ポート(POP3)へのアクセスを許可&転送
    # ※POP3サーバーを公開する場合のみ
    iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 110 -j ACCEPT
    iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 110 -j DNAT --to $SERVER

    # 外部からの公開サーバーの995番ポート(POP3S)へのアクセスを許可&転送
    # ※POP3Sサーバーを公開する場合のみ
    iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 995 -j ACCEPT
    iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 995 -j DNAT --to $SERVER

    # 外部からの公開サーバーの143番ポート(IMAP)へのアクセスを許可&転送
    # ※IMAPサーバーを公開する場合のみ
    iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 143 -j ACCEPT
    iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 143 -j DNAT --to $SERVER

    # 外部からの公開サーバーの993番ポート(IMAPS)へのアクセスを許可&転送
    # ※IMAPSサーバーを公開する場合のみ
    iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 993 -j ACCEPT
    iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 993 -j DNAT --to $SERVER

    # 外部からの公開サーバーのUDP1194番ポート(OpenVPN)へのアクセスを許可&転送
    # ※OpenVPNサーバーを公開する場合のみ
    iptables -A FORWARD -i $PUBLIC_WAN -p udp -d $SERVER --dport 1194 -j ACCEPT
    iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p udp --dport 1194 -j DNAT --to $SERVER


    iptables -A FORWARD -i $PUBLIC_WAN -p udp -d $SERVER --dport 2304 -j ACCEPT
    iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p udp --dport 2304 -j DNAT --to $SERVER

}

#----------------------------------------------------------#
# 他ホストが各種サービスを公開する場合の設定(ここまで)     #
#----------------------------------------------------------#

# 公開サーバーが自ホストの場合のルール設定を行う
[ "$SERVER" = "$IPADDR" ] || [ $SERVER = 127.0.0.1 ] && router_eq_server

# 公開サーバーが他ホストの場合のルール設定を行う
[ "$SERVER" != "$IPADDR" ] && [ $SERVER != 127.0.0.1 ] && router_ne_server


# 上記のルールにマッチしなかったアクセスはログを記録して破棄
iptables -A INPUT -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES INPUT] : '
iptables -A INPUT -j DROP
iptables -A FORWARD -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES FORWARD] : '
iptables -A FORWARD -j DROP

# 再起動時にも上記設定が有効となるようにルールを保存
/etc/rc.d/init.d/iptables save

# ファイアウォール起動
/etc/rc.d/init.d/iptables start

# パケット転送開始
sysctl -w net.ipv4.ip_forward=1 > /dev/null
sed -i '/net.ipv4.ip_forward/d' /etc/sysctl.conf
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf


[root@fedora ~]# chmod 700 iptables-router.sh ← IPマスカレード&ファイアウォール設定スクリプトへ実行権限付加

[root@fedora ~]# ./iptables-router.sh ← IPマスカレード&ファイアウォール設定スクリプト実行
ファイアウォールルールを適用中:                            [  OK  ]
チェインポリシーを ACCEPT に設定中filter nat               [  OK  ]
iptables モジュールを取り外し中                            [  OK  ]
ファイアウォールのルールを /etc/sysconfig/iptables に保存中[  OK  ]
ファイアウォールルールを適用中:                            [  OK  ]
チェインポリシーを ACCEPT に設定中nat filter               [  OK  ]
iptables モジュールを取り外し中                            [  OK  ]
iptables ファイアウォールルールを適用中:                   [  OK  ]
iptables モジュールを読み込み中ip_conntrack_ftp ip_nat_ftp [  OK  ]
※IPマスカレード&ファイアウォール設定スクリプトは、「wget http://fedorasrv.com/iptables-router.txt」でダウンロード可能

(2)特定国からのアクセス拒否ルールの自動更新
iptablesで特定国からのアクセス拒否ルールを設定した場合、IPアドレス情報は頻繁に更新されるので、自動的に最新のIPアドレス情報で特定国からのアクセス拒否ルールを更新するようにする
[root@fedora ~]# vi /etc/cron.daily/otherfilter_check.sh ← IPアドレス情報チェックスクリプト作成
#!/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# IPアドレス情報チェックを行うCountry Code(ここでは中国と韓国)をCOUNTRYLISTにスペース区切りで指定
COUNTRYLIST='CN KR'

cd /tmp

# APNIC(http://www.apnic.net/)より最新のIPアドレス情報をダウンロード
# ※ローカルより新しい場合のみダウンロード
wget -q -N http://ftp.apnic.net/stats/apnic/delegated-apnic-latest

# IPアドレス情報更新チェック
switch=0
for country in $COUNTRYLIST
do
    grep "apnic|$country|ipv4|" delegated-apnic-latest > $country.new
    diff -q $country $country.new > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        switch=1
        /bin/mv $country.new $country
    else
        rm -f $country.new
    fi
done

cd

# IPアドレス情報が更新されている場合のみiptables設定スクリプトを実行(ルール最新化)
[ $switch -eq 1 ] && /root/iptables-router.sh > /dev/null

[root@fedora ~]# chmod +x /etc/cron.daily/otherfilter_check.sh ← IPアドレス情報チェックスクリプトに実行権限付加

(3)IPマスカレード&ファイアウォール自動起動設定
インターネット接続時に実行される/etc/ppp/firewall-masqで、次回インターネット接続時にもファイアウォールが起動されるようにする
[root@fedora ~]# mv /etc/ppp/firewall-masq /etc/ppp/firewall-masq.org ← デフォルトの/etc/ppp/firewall-masqをリネーム

[root@fedora ~]# vi /etc/ppp/firewall-masq ← /etc/ppp/firewall-masq作成
#!/bin/bash

# ファイアウォール起動
/etc/rc.d/init.d/iptables start

■IPマスカレード確認(クライアントがWindowsの場合)

クライアントにIPアドレスを固定で割当てて、クライアント側からLinuxサーバーを経由してインターネット接続できるか確認する。
※ここではクライアントのIPアドレスを手動で割当てるが、あとでDHCPサーバーを構築して自動で割当てるようにする

(1)クライアント側ネットワーク設定
「マイネットワーク」右クリック⇒「プロパティ」⇒「ローカル エリア接続」⇒「プロパティ」⇒「インターネットプロトコル(TCP/IP)」

「次のIPアドレスを使う」にチェック

・IPアドレス⇒192.168.1.10 ← サーバーIPアドレス以外の適当なIPアドレスを指定
・サブネットマスク⇒255.255.255.0
・デフォルトゲートウェイ⇒192.168.1.1 ← サーバーIPアドレスを指定

「次のDNSサーバーのアドレスを使う」にチェック
・優先DNSサーバー⇒XXX.XXX.XXX.XXX ← プロバイダから通知されたDNSサーバー(プライマリ)のIPアドレスを指定
・代替DNSサーバー⇒XXX.XXX.XXX.XXX ← プロバイダから通知されたDNSサーバー(セカンダリ)のIPアドレスを指定

(2)IPマスカレード(クライアントからのインターネット接続)確認
C:\Documents and Settings\fedora>ping www.linux.or.jp ← 外部(www.linux.or.jp)と通信できるか確認

Pinging mizuho.linux.or.jp [210.171.226.47] with 32 bytes of data:

Reply from 210.171.226.47: bytes=32 time=14ms TTL=58
Reply from 210.171.226.47: bytes=32 time=14ms TTL=58
Reply from 210.171.226.47: bytes=32 time=14ms TTL=58
Reply from 210.171.226.47: bytes=32 time=13ms TTL=58

Ping statistics for 210.171.226.47:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), ← 0% lossを確認
Approximate round trip times in milli-seconds:
    Minimum = 13ms, Maximum = 14ms, Average = 13ms

■IPマスカレード確認(クライアントがLinuxの場合)

クライアントにIPアドレスを固定で割当てて、クライアント側からLinuxサーバーを経由してインターネット接続できるか確認する。
※ここではクライアントのIPアドレスを手動で割当てるが、あとでDHCPサーバーを構築して自動で割当てるようにする

(1)クライアント側ネットワーク設定
[root@client ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 ← ネットワーク設定ファイル編集
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.20 ← サーバーIPアドレス以外の適当なIPアドレスを指定
NETMASK=255.255.255.0
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
GATEWAY=192.168.1.1 ← サーバーIPアドレスを指定

[root@client ~]# /etc/rc.d/init.d/network reload ← ネットワーク設定反映
インターフェース eth0を終了中:                             [  OK  ]
ループバックインターフェース を終了中                      [  OK  ]
ネットワークパラメーターを設定中:                          [  OK  ]
ループバックインターフェイスを呼び込み中                   [  OK  ]
インターフェース eth0を活性化中:                           [  OK  ]

[root@client ~]# sed -i '/^nameserver/d' /etc/resolv.conf ← 旧問合せ先DNSサーバー設定削除

[root@client ~]# echo "nameserver XXX.XXX.XXX.XXX" >> /etc/resolv.conf
 ← 問合せ先DNSサーバーにプロバイダから通知されたDNSサーバー(プライマリ)を設定

[root@client ~]# echo "nameserver XXX.XXX.XXX.XXX" >> /etc/resolv.conf
 ← 問合せ先DNSサーバーにプロバイダから通知されたDNSサーバー(セカンダリ)を設定

(2)IPマスカレード(クライアントからのインターネット接続)確認
[root@client ~]# ping -c 4 www.linux.or.jp ← 外部(www.linux.or.jp)と通信できるか確認
PING mizuho.linux.or.jp (210.171.226.47) 56(84) bytes of data.
64 bytes from mizuho.linux.or.jp (210.171.226.47): icmp_seq=0 ttl=59 time=14.6 ms
64 bytes from mizuho.linux.or.jp (210.171.226.47): icmp_seq=1 ttl=59 time=13.9 ms
64 bytes from mizuho.linux.or.jp (210.171.226.47): icmp_seq=2 ttl=59 time=14.2 ms
64 bytes from mizuho.linux.or.jp (210.171.226.47): icmp_seq=3 ttl=59 time=14.5 ms

--- mizuho.linux.or.jp ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms ← 0% packet lossを確認
rtt min/avg/max/mdev = 13.995/14.340/14.639/0.275 ms, pipe 2

■ファイアウォール確認

Shields UP! - Internet Vulnerability Profilingで"Proceed"ボタン(2つあるがどちらでもよい)をクリック⇒"All Service Ports"ボタンをクリックして、外部からのアクセスを許可または拒否応答しているポートのみOPENまたはCLOSEDで、その他のポートはSTEALTHであることを確認



▲このページのトップへ戻る

LPIロゴ Copyright© 2004-2008 fallenangels, All rights reserved.
ご自由にリンクしてください(連絡は不要です)
本ページへのご意見・ご要望、誤字・脱字・リンク切れ等のご連絡はこちらからお願いします