はじめに
YAMAHA RTX1220(RTXシリーズならたぶん他も同じ)向けにコピペで実行できる絶縁フィルタをUbuntu上で作成する。IPアドレスが変更になったら更新が必要。国コードでフィルターする機能、つけて欲しいなぁ。
大陸トリオ(CN、KR、KP)をブロックするだけでiptables
のDENY_COUNTRY
のログ肥大化が抑えられている(毎日数十万行あったものが数千~数万行になる)。ipアドレスで実際の攻撃元の国籍を判断することは難しいが、大陸トリオに設置されているサーバーは日本の攻撃元を占めている割合が多いのだろう。
RUも同様に記載できれば良いのだが、RUは一国でルールが120を超えており同一のインターフェースに設定できない。市販されているルーターはフィルタルール設定数に上限があり、仕様等に上限数の明記は無いことが多い。困ったもんだ。
RTXルーターのIN, OUT
LAN2にONUを接続、LAN3にサーバーを接続しているとする。
インターネットからこちらのLAN3ポートに接続されたサーバーのウェブサイトを見るときの流れは以下。
インターネット(相手のIPアドレス:80 or 443) → RTX1220 PP(LAN2) IN
↓
こちらのサーバー ← RTX1220 LAN3 OUT
こちらのサーバーに届かないように相手パケットを遮断したいときは、PP IN
にルールを記載するか、LAN3 OUT
にルールを記載する。注意点はLAN2のINに記載しても機能しない。サーバーから見ればどちら(PP IN
又はLAN3 OUT
)に記載されていても相手アドレスはブロックされる(サーバーには届かない)が、当該アドレスがルーターそのものにアクセスできるかどうかが違ってくる。
前提要件
過去の記事で作成したCIDRの一覧を/root/COUNTRY_CODE
にダウンロードしているものとする。
スクリプトを作成する
vi /root/COUNTRY_CODE/RTX_makefilter.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin
###########################################################################################
# cidr.txt のデータを元にRTX用のフィルタルールを作成します。
# 1行あたりの文字数制限があるっぽいのでCIDR 70コ でルール番号更新。
# インターフェースあたり適応できるルール数に上限がある。100程度?
###########################################################################################
# フィルタ開始番号
FILTER_NUM=500
IP_LIST="/root/COUNTRY_CODE/cidr.txt"
MYFILTER="/root/COUNTRY_CODE/rtxfilter"
MyCNT=1
MYSECURE=()
rm -f $MYFILTER
REJECT_COUNTRY_MAKE(){
for addr in `cat $IP_LIST |grep ^$1|awk '{print $2}'`
do
if [[ $MyCNT -eq 1 ]]; then
echo -n "ip filter $FILTER_NUM reject-nolog $addr" >> $MYFILTER
MYSECURE+=($FILTER_NUM)
else
echo -n ",$addr" >> $MYFILTER
fi
MyCNT=$((MyCNT+1))
if [[ $MyCNT -gt 70 ]]; then
echo " * * * *" >> $MYFILTER
FILTER_NUM=$((FILTER_NUM+1))
MyCNT=1
fi
done
if [[ $MyCNT -eq 1 ]]; then
echo " " >> $MYFILTER
else
echo -e " * * * *\n" >> $MYFILTER
fi
FILTER_NUM=$((FILTER_NUM+1))
MyCNT=1
}
# 拒否する国コードをここに記載。
# せいぜい3つくらい。なので定番の大陸三国。
REJECT_COUNTRY_MAKE CN
REJECT_COUNTRY_MAKE KR
REJECT_COUNTRY_MAKE KP
echo "" >> $MYFILTER
echo "" >> $MYFILTER
echo "# Type command following to apply them." >> $MYFILTER
echo "" >> $MYFILTER
echo "pp select 1" >> $MYFILTER
echo "" >> $MYFILTER
echo ip pp secure filter in ${MYSECURE[@]} >> $MYFILTER
Windows で読めるテキストファイルにするにはShift-jisに変換する:-s or --sjis
変換後に/home/samba
などに移動して取り出す。windows機のために拡張子をつけて出力する。
nkf -s --overwrite /root/COUNTRY_CODE/rtxfilter
mv /root/COUNTRY_CODE/rtxfilter /home/samba/rtxfilter.txt
既存のフィルタルールをテキストに追記してからRTXのコンソールコマンドを実行する。
作成したフィルタルールを削除する
更新するときにそのまま上書きしても良いが、古いルールが残って問題が起こる可能性があるので、一度一括で削除してから新しいルールを適応するようにしている。
一つずつno ip filter xxxx
と入力しても良いが、コピペでズバッとやりたいのでこれもスクリプトで。
vi /root/COUNTRY_CODE/RTX_delfilter.sh
#!/usr/bin/bash
LANG=C
# Number starts from...
START_NUM=500
# Number ends at...
END_NUM=593
# Export file
MYFILE="/root/COUNTRY_CODE/rtxdelfilter"
rm -f $MYFILE
## Cっぽいアレで書く場合。ENDの値「未満」に注意。
for ((i=$START_NUM; i < $END_NUM; i++)); do
echo no ip filter $i >> $MYFILE
done
## 数値を直接指定する場合。こちらは記載した数値まで繰り返す。
# for i in {500..592} ; do
# echo no ip filter ${i} >> $MYFILE
# done
(蛇足)ルーターセキュリティ
リモートワークの需要等でVPN機能のあるルーターが人気らしい。インターネット側にVPNのポートを開けているとガンガン認証チャレンジしてくる。大陸三国拒否はこれに対しても効果あり。RTX実機には指定回数に達したら該当IPをしばらく規制するような機能は無いので、超長い事前共有キー、IDパスワードを組み合わせて対処する。
可能ならUDP
ポートの500
、4500
、1701
及びESP
のパケットにCIDR
で制限をかけてPass
する。
ip filter xxxxx pass {cidr} 192.168.1.1 udp * 500
ip filter xxxxx pass {cidr} 192.168.1.1 esp * *
ip filter xxxxx pass {cidr} 192.168.1.1 udp * 4500
ip filter xxxxx pass {cidr} 192.168.1.1 udp * 1701
ip filter 99999 reject-nolog * * * * *
各ISPのIPアドレス範囲を調べて全て記載する。IPアドレスの範囲を公開してくれているISPもある。
ルーターのコンソールにはネット側からtelnetやsshで直接接続できる設定にはせずローカルアドレスからのみのアクセス可として、一度vpnセッションを張ってから内部アクセスとして遠隔操作する。また、ルーター機能のDNSやWEB GUIはインターネット側に非公開とする。