ip6tablesのスクリプト

ネットワークエンジニア

みんなサーバーを構築した時、必ずやるのがipv6の無効化設定ですよね!

それくらい嫌われてるww

しかし、今回はそのipv6をip6tablesで実装してみたいと思います。

実装環境はさくらVPSを想定しています。

iptablesのインストール
# yum -y install iptables

ip6tablesをinitに登録
# cp /usr/libexec/iptables/ip6tables.init /etc/rc.d/init.d/ip6tables

★スクリプト作成。
注意するのは事前にipv6はリンクローカルとグローバルがあるということを理解しておきましょう。
このふたつをipについて設定する必要があります。ifconfigなどでipv6を確認しておきましょう。
変数はGLOBALとLINKで設定してます。

# ifconfig
eth0: flags=4163  mtu 1500
        inet 160.16.135.9  netmask 255.255.254.0  broadcast 160.16.135.255
        inet6 fe80::9ea3:baff:fe02:2da3  prefixlen 64  scopeid 0x20
        inet6 2001:e42:102:1703:160:16:135:9  prefixlen 64  scopeid 0x0
        ether 9c:a3:ba:02:2d:a3  txqueuelen 1000  (Ethernet)
        RX packets 5678874  bytes 823506053 (785.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1382041  bytes 921254140 (878.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# vi ip6tables.sh

スクリプトの中身
※CentOSで自宅サーバーさんのスクリプトを改造しています。
#!/bin/bash

#---------------------------------------#
# 設定開始                              #
#---------------------------------------#
# ネットワークアドレスだけ変数に代入
GLOBAL=2001:e42:102:1703::/64
LINK=fe80::/64

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

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

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

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

# 内部からのアクセスをすべて許可
ip6tables -A INPUT -s $GLOBAL -j ACCEPT
ip6tables -A INPUT -s $LINK -j ACCEPT

# 内部から行ったアクセスに対する外部からの返答アクセスを許可
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

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

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

# 外部とのNetBIOS関連のアクセスはログを記録せずに破棄
# ※不要ログ記録防止
ip6tables -A INPUT ! -s $GLOBAL -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
ip6tables -A INPUT ! -s $GLOBAL -p udp -m multiport --dports 135,137,138,139,445 -j DROP
ip6tables -A OUTPUT ! -d $GLOBAL -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
ip6tables -A OUTPUT ! -d $GLOBAL -p udp -m multiport --sports 135,137,138,139,445 -j DROP

ip6tables -A INPUT ! -s $LINK -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
ip6tables -A INPUT ! -s $LINK -p udp -m multiport --dports 135,137,138,139,445 -j DROP
ip6tables -A OUTPUT ! -d $LINK -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
ip6tables -A OUTPUT ! -d $LINK -p udp -m multiport --sports 135,137,138,139,445 -j DROP

# 1秒間に4回を超えるpingはログを記録して破棄
# ※Ping of Death攻撃対策
ip6tables -N LOG_PINGDEATH
ip6tables -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
ip6tables -A LOG_PINGDEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] : '
ip6tables -A LOG_PINGDEATH -j DROP
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j LOG_PINGDEATH

# 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄
# ※不要ログ記録防止
ip6tables -A INPUT -d FF01:0:0:0:0:0:0:1/128 -j DROP
ip6tables -A INPUT -d FF02:0:0:0:0:0:0:1/128 -j DROP

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

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

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

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

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

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

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

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

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

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

# 外部からのTCP587番ポート(SUBMISSION)へのアクセス
# ※SMUBMISSIONサーバーを公開する場合のみ
ip6tables -A INPUT -p tcp --dport 587 -j ACCEPT

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

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

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

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

# 外部からのTCP10000番ポート(WEBMIN)へのアクセス
#ip6tables -A INPUT -p tcp --dport 10000 -j ACCEPT

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

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

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

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

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

後はsh ip6tables.shでスクリプトを実行してみてください。

FWのルールはip6tables -Lで確認。

コメント