[RTX1220]Ubuntuでルーター用のフィルタールールを作る

# はじめに
　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`にダウンロードしているものとする。

https://qiita.com/yukisku/items/6efcee95186883ce6acb

# スクリプトを作成する

```bash
vi /root/COUNTRY_CODE/RTX_makefilter.sh
```


```:/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機のために拡張子をつけて出力する。

```bash
nkf -s --overwrite /root/COUNTRY_CODE/rtxfilter
mv /root/COUNTRY_CODE/rtxfilter /home/samba/rtxfilter.txt
```

　既存のフィルタルールをテキストに追記してからRTXのコンソールコマンドを実行する。


# 作成したフィルタルールを削除する

　更新するときにそのまま上書きしても良いが、古いルールが残って問題が起こる可能性があるので、一度一括で削除してから新しいルールを適応するようにしている。

　一つずつ`no ip filter xxxx`と入力しても良いが、コピペでズバッとやりたいのでこれもスクリプトで。

```bash
vi /root/COUNTRY_CODE/RTX_delfilter.sh
```

```:/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`する。

```:RTXコマンド
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もある。

https://www.au.com/developer/android/kaihatsu/network/

　ルーターのコンソールにはネット側からtelnetやsshで直接接続できる設定にはせずローカルアドレスからのみのアクセス可として、一度vpnセッションを張ってから内部アクセスとして遠隔操作する。また、ルーター機能のDNSやWEB GUIはインターネット側に非公開とする。