ということで、ルータを介して接続制限などをしていればよいですが、いきなりネットワークへ繋ぐと大変なので、ここでセキュリティの設定をしておきます。
大まかにはルータ・nft or iptables・ipsetの3つで3重にします。
Firewalld+ipset構成も考えたんですが、一旦iptables+ipsetでやることにしました。
そして次にiptablesの設定を行っておきます。
しかしiptablesもfirewalldやnftablesに置き換わっていくとのことなので、早めに移行しなきゃなんですよね。
設定変更が容易に行えるようにシェルスクリプトに記述してそれを実行する形式をとります。
うちで使ってるのは次のようなかんじです。
IPアドレスとかは適宜変更して使うといいです。
うちでは基本的に以下のポリシーで運用しています。
- Outputパケットは基本的に許可
- それ以外のパケットについては一部を除いて破棄
- Inputパケットは主要ポート以外は破棄
- Forwardパケットはルータとして利用しないので破棄
- Icmpパケットは1分間に10回応答したら以降は破棄
- 基本的にDropしたパケットはログをとる
- 確立されたコネクションに対してのInputは許可
- Synから始まらないコネクションは許可してるポートでも破棄
- チョンとか中国からの接続は拒否したいのでhttp://akionweb.com/myobjects/adl/apache/からCN.txt KR.txt等を毎日ダウンロードするスクリプトを作成し海外からの拒否を簡略化
akionwebさんが落ちてるっぽいので、
自作してみました。
arin.netなど5箇所から最新のファイルを持ってくるんですが、
それをIPアドレス/サブネットにするのが一部困難で、
若干その辺がおかしいですがとりあえず展開することが出来るようになったので、それを使って落としてきます。
もしこのスクリプトがほしい方が居たらコメントなりに残しておいてもらえると、公開するかもしれません。
PS: PHP5.3.0以上で大部分がハードコーティングされてるので
ある程度知識がない方じゃないと動かせないかもしれません。
シェルスクリプト
#!/bin/bash
ipt="/sbin/iptables"
eth=eth0
mynets="192.168.0.0/24"
#ポリシーの定義
$ipt -P INPUT DROP
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD ACCEPT
#ポリシーの初期化
$ipt -F
$ipt -t nat -F
$ipt -X LOG_FRAGMENT
$ipt -X LOG_PINGDEATH
$ipt -X LOG_DENYHOST
/bin/sh /etc/openvpn/openvpn-startup
$ipt -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$ipt -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$ipt -A INPUT -i lo -j ACCEPT
$ipt -A INPUT -s $mynets -j ACCEPT
$ipt -A INPUT -i eth1 -j ACCEPT
$ipt -A INPUT -i tun0 -j ACCEPT
$ipt -A INPUT -p udp -m udp --dport 514 -s 192.168.0.1 -j ACCEPT
$ipt -A INPUT -p tcp -m tcp --dport 15091 -j ACCEPT
$ipt -N LOG_FRAGMENT $ipt -A LOG_FRAGMENT -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES FRAGMENT] : '
$ipt -A LOG_FRAGMENT -j DROP
$ipt -A INPUT -f -j LOG_FRAGMENT
$ipt -N LOG_PINGDEATH $ipt -A LOG_PINGDEATH -p icmp --icmp-type echo-request -m limit --limit 1/m --limit-burst 10 -j ACCEPT
$ipt -A LOG_PINGDEATH -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES PINGDEATH] : '
$ipt -A LOG_PINGDEATH -j DROP $ipt -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH
$ipt -A INPUT -p icmp -s $mynets -j ACCEPT $ipt -A INPUT -d 255.255.255.255 -j DROP $ipt -A INPUT -d 224.0.0.1 -j DROP
#拒否
$ipt -N LOG_DENYHOST
$ipt -A LOG_DENYHOST -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES DENY_HOST] : '
$ipt -A LOG_DENYHOST -j DROP
for i in `cat /etc/LOCAL/ip.txt`
do
$ipt -A INPUT -s $i -j LOG_DENYHOST
done
#いろいろな許可設定(全体)
# ftp-data
$ipt -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
# FTP
$ipt -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
# SMTP
$ipt -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
# DNS
$ipt -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
$ipt -A INPUT -p udp -m udp --dport 53 -j ACCEPT
# HTTP
$ipt -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# POP
$ipt -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
# IMAP
$ipt -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
# SSL
$ipt -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
# SMTPS
$ipt -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT
# SMTP submission
$ipt -A INPUT -p tcp -m tcp --dport 587 -j ACCEPT
# IMAPS
$ipt -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
# POP3S
$ipt -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT
# GIT
$ipt -A INPUT -p tcp -m tcp --dport 9418 -j ACCEPT
$ipt -A INPUT -j LOG --log-level debug --log-prefix "[IPTABLES INPUT] : " --log-tcp-options --log-ip-options
#基本的に全部シャットダウン
$ipt -P INPUT DROP
#Fedora16移行
/usr/libexec/iptables.init save
/bin/systemctl restart iptables.service
#Fedora15まで
/etc/init.d/iptables save
/etc/init.d/iptables restart
/etc/iptables/ip.txtを作成するシェルスクリプトの作成です。
上記で案内したURLのtxtファイルはApache用なので、iptablesで認識できるように修正します
#!/bin/bash
#拒否したい国をリストする
list="CN KR TW"
cd /etc/iptables/tmp/
rm -f *.txt
rm -f *.txt.1
for i in $list; do
wget http://akionweb.com/myobjects/adl/apache/$i.txt
done cat /etc/iptables/tmp/*.txt | grep -v '#' | grep -v '^$' |sed 's/deny from //g' > /tmp/ip.txt
cp /tmp/ip.txt /etc/iptalbes/ip.txt
これでとりあえずのセキュリティは保たれるとおもいます。
firewalldは結局バックエンドにnftables使ってるらしいので移行先はnftablesですかね。
一応以下のコマンドで既存のiptablesの設定をnftに食わせるためのコンバートをしてくれるようです。
iptables-restore-translate -f /etc/sysconfig/iptables > /etc/nftables/xxx.nft
ただ、ipset周りで設定したものは移行対象にならないようなので、別途設定しなおす必要がありそうです。
これもipsetのファイルを出力してnftに食わせることで対応可能なようですな。
それをどうやってiptablesのときと近づけるかはまた今度かな
ipset save > /tmp/ipset.save
ipset-translate restore < /tmp/ipset.save > /tmp/ipset.nft
ちなみに/tmp/ipset.nftで出力したファイルのadd set inet global NAME { type xxxxxx }の{}内にflags interval;がないと重複したアドレスがあるとエラーで取り込んでくれません。。。
例:192.168.0.0/16があるのに192.168.1.0/24があったり192.168.255.1/32があったりするとエラーになるっぽい。
コメントを追加