Closed7

Ubuntuで国外からのアクセスをfirewallでブロックする

takumitakumi

ufeの使い方を簡単にまとめる

ufwはiptablesコマンドのラッパーであり、シンプルにfirewallの設定を行うことができる
firewallの状態を確認

$ ufw stasus

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       192.168.11.2              
22/tcp                     ALLOW       Anywhere                  
DNS                        ALLOW       Anywhere                  
80/tcp                     ALLOW       Anywhere                  
443                        ALLOW       Anywhere                  
25/tcp                     ALLOW       Anywhere                  
22/tcp (v6)                ALLOW       Anywhere (v6)             
DNS (v6)                   ALLOW       Anywhere (v6)             
80/tcp (v6)                ALLOW       Anywhere (v6)             
443 (v6)                   ALLOW       Anywhere (v6)             
25/tcp (v6)                ALLOW       Anywhere (v6)           
takumitakumi

世界の国別IPv4アドレス割り当てリストを用いて日本からのアクセスを許可する。
http://nami.jp/ipv4bycc/

まずは、/etc/ufw/before.rulesファイルのCOMMITの前に以下の3行を追加

:DROP_EXCEPT_JP - [0:0]
-A DROP_EXCEPT_JP -j ACCEPT
-A ufw-before-input -j DROP_EXCEPT_JP
# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT

before.rulesファイルはufwが初期化される前に適応させたいルールセットを記述する。各行で行っていることは以下の通り。

  • DROP_EXCEPT_JPというカスタムチェインを作成(1行目)
  • DROP_EXCEPT_JPチェインに一致するすべての通信を許可(2行目)
  • ufw-before-inputチェインに到達したパケットをDROP_EXCEPT_JPチェインに渡す(3行目)
takumitakumi

/etc/ufw/after.initファイルに以下を記述する

start)
    # typically required
    /etc/ufw/after.init.drop_except_jp
    ;;
stop)
    # typically required
    iptables -F DROP_EXCEPT_JP
    ;;

/etc/ufw/after.initはufwの初期化後に実行される。start)、stop)のセクションはそれぞれufwが開始した時と終了した時を表す。

takumitakumi

以下のシェルスクリプトで日本からのアクセスを許可するiptablesコマンドを生成する

#!/bin/sh
IPTABLES=iptables
EXCLUDE_PORTS=80,443,25
wget -q -N http://nami.jp/ipv4bycc/cidr.txt.gz
gunzip -q -f -c cidr.txt.gz > cidr.txt
if [ -f cidr.txt ]; then
    echo $IPTABLES -F DROP_EXCEPT_JP
    echo $IPTABLES -A DROP_EXCEPT_JP -p tcp -m multiport --dport $EXCLUDE_PORTS -m state --state NEW -j RETURN
    sed -n 's/^JP\t//p' cidr.txt | while read address; do
        echo $IPTABLES -A DROP_EXCEPT_JP -s $address -j RETURN
    done
    echo $IPTABLES -A DROP_EXCEPT_JP -j DROP
fi

上記のシェルスクリプトの標準出力を/etc/ufw/after.init.drop_except_jpファイルにリダイレクトさせる

sudo sh drop_except_jp.sh | sudo tee /etc/ufw/after.init.drop_except_jp > /dev/null
takumitakumi

IPアドレスリストは更新されるため、毎日スクリプトを実行しアドレスリストを最新の状態に保つ。
/etc/cron.dailyディレクトリにiplist_update.shを作成し、以下のスクリプトを記述

#!/bin/bash

sh /root/drop_except_jp.sh > /etc/ufw/after.init.drop_except_jp
systemctl restart ufw
このスクラップは2023/04/09にクローズされました