Linuxルーター構築(rp-pppoe+iptables)

最終更新日: 2012.06.22

<<トップページ <<新着情報 <<リンク集 <<サイト内検索 <<管理人へメール <<Scientific Linuxで自宅サーバー構築 <<Fedoraで自宅サーバー構築

■概要

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

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

【必要な機器】
・ネットワークアダプタ(NIC)×2(インターネット(外部向け)接続用とLAN(内部向け)接続用の2枚)

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

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



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

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

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

[root@centos ~]# 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@centos ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 ← NIC(eth0側)ネットワーク設定ファイル編集
DEVICE=eth0
BOOTPROTO=static
BROADCAST=192.168.1.255
HWADDR=xx:xx:xx:xx:xx:xx
IPADDR=192.168.1.1
NETMASK=255.255.255.0
NETWORK=192.168.1.0
ONBOOT=yes
GATEWAY=192.168.1.1

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

[root@centos ~]# 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@centos ~]# 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: xxx.xxx.xxx.xxx ← プロバイダから通知されたDNSサーバー(プライマリ)を応答
Please enter the IP address of your ISP's secondary DNS server.
If you just press enter, I will assume there is only one DNS server.
Enter the secondary DNS server address here: xxx.xxx.xxx.xxx ← プロバイダから通知されたDNSサーバー(セカンダリ)を応答

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): yes ← yes応答

** Summary of what you entered **

Ethernet Interface: eth1
User name:          xxxxxxxx
Activate-on-demand: No
Primary DNS:        xxx.xxx.xxx.xxx
Secondary DNS:      xxx.xxx.xxx.xxx
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/resolv.conf
  (But first backing it up to /etc/resolv.conf.bak)
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.

[root@centos ~]# vi /etc/sysconfig/network-scripts/ifcfg-ppp0 ← インタフェース設定ファイル編集
LINUX_PLUGIN=/usr/lib/pppd/2.4.4/rp-pppoe.so ← 追加(カーネルモードPPPoE接続)

(2)インターネット接続
[root@localhost ~]# /etc/rc.d/init.d/network restart ← ネットワーク再起動
インターフェース eth0 を終了中:                            [  OK  ]
ループバックインターフェースを終了中                       [  OK  ]
IPv4 パケット転送を無効化中:  net.ipv4.ip_forward = 0
                                                           [  OK  ]
ループバックインターフェイスを呼び込み中                   [  OK  ]
インターフェース eth0 を活性化中:                          [  OK  ]
インターフェース ppp0 を活性化中:                          [  OK  ] ← ppp0起動を確認

(3)インターネット接続確認
[root@centos ~]# 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)iptables設定
[root@centos ~]# vi iptables-router.sh ← iptables設定スクリプト作成
#!/bin/bash

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

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

# WANインタフェース名定義
WAN=ppp0

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

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

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

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

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

# 読み込み対象モジュール追加
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

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

# デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定
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

# WANからの送信元がプライベート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
iptables -A INPUT -i ppp+ -s 127.0.0.0/8    -j LOG_SPOOFING
iptables -A INPUT -i ppp+ -s 10.0.0.0/8     -j LOG_SPOOFING
iptables -A INPUT -i ppp+ -s 172.16.0.0/12  -j LOG_SPOOFING
iptables -A INPUT -i ppp+ -s 192.168.0.0/16 -j LOG_SPOOFING
iptables -A FORWARD -i ppp+ -s 127.0.0.0/8    -j LOG_SPOOFING
iptables -A FORWARD -i ppp+ -s 10.0.0.0/8     -j LOG_SPOOFING
iptables -A FORWARD -i ppp+ -s 172.16.0.0/12  -j LOG_SPOOFING
iptables -A FORWARD -i ppp+ -s 192.168.0.0/16 -j LOG_SPOOFING

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

# 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 ! ppp+ -p icmp --icmp-type echo-request -j LOG_PINGDEATH

# 送信元IPアドレスがLANネットワーク範囲外のアクセスはログを記録して破棄
# ※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

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

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

# LANからのインターネットへの同時接続を可能にする
# ※IP masquerade(NAPT) 
iptables -t nat -A POSTROUTING -o ppp+ -j MASQUERADE

# LANから行ったアクセスに対するWANからの返答アクセスを許可
iptables -A INPUT -i ppp+ -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i ppp+ -m state --state ESTABLISHED,RELATED -j ACCEPT

# DNS応答アクセスを許可
iptables -A INPUT -p udp --sport 53 -j ACCEPT

# WANからの必須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

# ACCEPT_COUNTRY_MAKE関数定義
# 指定された国のIPアドレスからのアクセスを許可するユーザ定義チェイン作成
ACCEPT_COUNTRY_MAKE(){
    for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'`
    do
        iptables -A ACCEPT_COUNTRY -s $addr -j ACCEPT
    done
}

# DROP_COUNTRY_MAKE関数定義
# 指定された国のIPアドレスからのアクセスを破棄するユーザ定義チェイン作成
DROP_COUNTRY_MAKE(){
    for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'`
    do
        iptables -A DROP_COUNTRY -s $addr -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES DENY_COUNTRY] : '
        iptables -A DROP_COUNTRY -s $addr -j DROP
    done
}

# IPアドレスリスト取得
. /root/iptables_functions
IPLISTGET

# 日本からのアクセスを許可するユーザ定義チェインACCEPT_COUNTRY作成
iptables -N ACCEPT_COUNTRY
ACCEPT_COUNTRY_MAKE JP
# 以降,日本からのみアクセスを許可したい場合はACCEPTのかわりにACCEPT_COUNTRYを指定する

# 中国・イラン・台湾・韓国※からのアクセスをログを記録して破棄
# ※全国警察施設への攻撃元上位4カ国(日本・アメリカを除く)
# http://www.npa.go.jp/cyberpolice/detect/observation.htmlより
iptables -N DROP_COUNTRY
DROP_COUNTRY_MAKE CN
DROP_COUNTRY_MAKE IR
DROP_COUNTRY_MAKE TW
DROP_COUNTRY_MAKE KR
iptables -A INPUT -j DROP_COUNTRY
iptables -A FORWARD -j DROP_COUNTRY

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

router_eq_server(){

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

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

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

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

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

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

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

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

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

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

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

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

}

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

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

router_ne_server(){

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

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

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

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

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

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

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

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

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

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

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

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

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



}

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

# 拒否IPアドレスからのアクセスはログを記録せずに破棄
# ※拒否IPアドレスは/root/deny_ipに1行ごとに記述しておくこと
# (/root/deny_ipがなければなにもしない)
if [ -s /root/deny_ip ]; then
    for ip in `cat /root/deny_ip`
    do
        iptables -I INPUT -s $ip -j DROP
    done
fi


# 公開サーバーが自ホストの場合のルール設定を行う
[ "$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@centos ~]# chmod 700 iptables-router.sh ← iptables設定スクリプトへ実行権限付加

[root@centos ~]# vi iptables_functions ← ファイアウォール設定スクリプト外部関数作成
# IPアドレスリスト取得関数定義
IPLISTGET(){
    # http://nami.jp/ipv4bycc/から最新版IPアドレスリストを取得する
    wget -q http://nami.jp/ipv4bycc/cidr.txt.gz
    gunzip cidr.txt.gz
    # 最新版IPアドレスリストが取得できなかった場合
    if [ ! -f cidr.txt ]; then
        if [ -f /tmp/cidr.txt ]; then
            # バックアップがある場合はその旨をroot宛にメール通知して処理を打ち切る
            echo cidr.txt was read from the backup! | mail -s $0 root
            return
        else
            # バックアップがない場合はその旨をroot宛にメール通知して処理を打ち切る
            echo cidr.txt not found!|mail -s $0 root
            exit 1
        fi
    fi
    # 最新版IPアドレスリストを /tmpへバックアップする
    /bin/mv cidr.txt /tmp/cidr.txt
}


[root@centos ~]# ./iptables-router.sh ← iptables設定スクリプト実行
ファイアウォールルールを適用中:                            [  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  ]

(2)iptables自動起動設定
インターネット接続時に実行される/etc/ppp/firewall-masqで、次回インターネット接続時にもファイアウォールが起動されるようにする。
※iptablesはデフォルトで自動起動するようになっているが、インターネット接続(network起動)よりも先に起動してしまうため、インターネット接続後にiptablesを起動し直す必要がある
[root@centos ~]# mv /etc/ppp/firewall-masq /etc/ppp/firewall-masq.org ← デフォルトの/etc/ppp/firewall-masqをリネーム

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

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

(3)IPアドレスリスト更新チェック
IPアドレスリストは頻繁に更新されるので、毎日自動でIPアドレスリストの更新有無をチェックし、更新がある場合はファイアウォール設定スクリプトを再起動するようにする。
[root@centos ~]# vi /etc/cron.daily/iplist_check-router.sh ← IPアドレスリストチェックスクリプト作成
#!/bin/bash

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

# 新旧IPLIST差分チェック件数(0を指定するとチェックしない)
# ※新旧IPLIST差分がSABUN_CHKで指定した件数を越える場合はiptables設定スクリプトを実行しない
# ※新旧IPLIST差分チェック理由はhttp://centossrv.com/bbshtml/webpatio/1592.shtmlを参照
SABUN_CHK=100
[ $# -ne 0 ] && SABUN_CHK=${1}

# チェック国コード
COUNTRY_CODE='JP CN TW RU'

# iptables設定スクリプトパス
IPTABLES=/root/iptables-router.sh

# iptables設定スクリプト外部関数取り込み
. /root/iptables_functions

# IPアドレスリスト最新化
rm -f IPLIST.new
IPLISTGET
for country in $COUNTRY_CODE
do
    if [ -f /tmp/cidr.txt ]; then
        grep ^$country /tmp/cidr.txt >> IPLIST.new
    else
        grep ^$country /tmp/IPLIST >> IPLIST.new
    fi
done
[ ! -f /tmp/IPLIST ] && cp IPLIST.new /tmp/IPLIST

# IPアドレスリスト更新チェック
diff -q /tmp/IPLIST IPLIST.new > /dev/null 2>&1
if [ $? -ne 0 ]; then
    if [ ${SABUN_CHK} -ne 0 ]; then
        if [ $(diff /tmp/IPLIST IPLIST.new | egrep -c '<|>') -gt ${SABUN_CHK} ]; then
            (
             diff /tmp/IPLIST IPLIST.new
             echo
             echo "$IPTABLES not executed."
            ) | mail -s 'IPLIST UPDATE' root
            rm -f IPLIST.new
            exit
        fi
    fi
    /bin/mv IPLIST.new /tmp/IPLIST
    $IPTABLES > /dev/null
else
    rm -f IPLIST.new
fi



[root@centos ~]# chmod +x /etc/cron.daily/iplist_check-router.sh ← IPアドレスリストチェックスクリプトに実行権限付加
※CRONより/root/iptables-router.sh not executed.という内容のメールが届いた場合の対処
なんらかの理由で、http://nami.jp/ipv4bycc/から取得した最新のIPアドレスリストと、前回取得したIPアドレスリストとの差分が100件を超えたため、iptables設定スクリプトを実行しなかったことを示す。
サーバーを長時間停止していた等、前回取得したIPアドレスリストとの差分が100件を超える理由が明確な場合には、「/etc/cron.daily/iplist_check-router.sh 0」と実行することにより強制的にiptables設定スクリプトを実行する。



■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\centos>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© 2014 fallenangels, All rights reserved.
ご自由にリンクしてください(連絡は不要です)
本ページへのご意見・ご要望、誤字・脱字・リンク切れ等のご連絡はこちらからお願いします