Ubuntuでのufw設定方法


iptablesコマンドは難しいので、ufwで設定する流れがあります。実際ufwを利用すると、ipv4/ipv6両方のiptables/ip6tablesの設定をまとめて実行してくれるので、手間なくipv4/ipv6ファイアウォール設定をするのにお勧めです。

下準備

OSの最新化(apt update; apt upgrade)は必要に応じて済ませておいてください。ファイアウォールのセッティング中は、SSHでリモートから接続・操作している場合にセッションが切れる事があるので、事前に以下を確認してください。

  • 実機に対してキーボードからコンソール接続出来る事・・・SSHが切れた場合に備えて
  • 既存ファイアウォール設定のバックアップ・・・・・・・・ufwでファイアウォールを初期化、設定している感にうまくいかず、元に戻すときの為に

既存ファイアウォール設定のバックアップは以下コマンドで実行し、ホームディレクトリにコマンド名‗今日の日付.txtで保存しておきます。

sudo iptables-save > ~/iptables-save_`date '+%Y%m%d'`.txt
sudo ip6tables-save > ~/ip6tables-save_`date '+%Y%m%d'`.txt

検証時 前提条件(実行する必要はありません)

大抵の環境では、ホワイトリスト型のファイアウォール設定で運用しているかと思いますので、本投稿では、以下の通りSSH接続以外は全て拒否する設定がある前提で検証しました。

# 以下、前提条件として、SSHのみを拒否するコマンドを登録しています。
# 特に何も設定していなければ、全ての通信を許可するはずですので、下記コマンドの実行は不要です。

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT DROP
sudo iptables -P FORWARD DROP
sudo ip6tables -P INPUT DROP
sudo ip6tables -P OUTPUT DROP
sudo ip6tables -P FORWARD DROP

sudo iptables -L
# Chain INPUT (policy DROP)
# target     prot opt source               destination
# ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
# 
# Chain FORWARD (policy DROP)
# target     prot opt source               destination
# 
# Chain OUTPUT (policy DROP)
# target     prot opt source               destination
# ACCEPT     tcp  --  anywhere             anywhere             tcp spt:ssh

sudo ip6tables -L
# Chain INPUT (policy DROP)
# target     prot opt source               destination
#
# Chain FORWARD (policy DROP)
# target     prot opt source               destination
#
# Chain OUTPUT (policy DROP)
# target     prot opt source               destination

ufwを有効化し、適切なルールを入れていく

ufwを有効化した際に、SSH接続が切れるかもしれないけど良いですか?と問われますので、「y」を回答します。この際、接続済みSSHセッションについては途切れませんでした。

sudo ufw enable
# Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
# Firewall is active and enabled on system startup

と言うのも、ufwを設定した直後は、もともと設定していたiptablesで、ssh(tcp/22)を許可する設定が残っていました。試しに何も設定せずに再起動したところ、ssh接続不可となりました。

上記「Firewall is active and enabled on system startup(ファイアウォールは再起動したら有効になります)」は、「既存のiptablesにufwの設定をマージしました。再起動後はufwのみが有効となるので、事実上、再起動したらファイアウォールが有効になります」と言う意味でした。

※上記検証結果より、ここで再起動してしまうとSSH接続不可となるので、ufwの設定が終わるまで再起動しない事をお勧めします。

ufwは、IPやプロトコル、ポート番号で対象を指定できますが、アプリケーション名でも指定することが出来ます。アプリケーション名は以下のように「ufw app list」コマンドで確認することが出来ます。

samba等をaptで追加インストールすると、該当アプリケーション名が「ufw app list」で追加表示されるようになります。

sudo ufw app list
Available applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

アプリケーション等が確認出来たら、ルールを追加していきます。ウェブページを提供している場合には以下です。

# Apacheが80、Apache Secureが443に対応しています。
sudo ufw allow to any app Apache
sudo ufw allow to any app "Apache Secure"

SSHを許可したい場合は以下の通り。

sudo ufw allow to any app OpenSSH

ポート番号で許可したい場合(一例として25番)

sudo ufw allow proto tcp to any port 25

管理用PCのアドレスが固定で決まっている場合で、それ以外からの接続は受け付けない場合(0.0.0.0/32は適宜IPを変更してください。)

export MNG_IP=0.0.0.0/32
sudo ufw allow proto tcp from ${MNG_IP} to any port 22

設定したルールの確認方法

sudo ufw status numbered

#      To                         Action      From
#     --                         ------      ----
# [ 1] OpenSSH                    ALLOW IN    192.168.1.3/24
# [ 2] 25/tcp                     ALLOW IN    Anywhere

不要なルールの確認方法

「ufw app list」の結果の左端に[ 1]等とナンバーが付いています。そのナンバーを指定して削除コマンドを実行します。例えば、2番を削除する場合は以下です。

sudo ufw delete 2

一通りの設定が完了したら、対象サーバを再起動させてください。そこで、初めてufwのみが適用された状態で起動します。

sudo reboot

ufwで設定したファイアウォールの大まかな動きについて

基本的な動きは以下です。

  • INPUT、FORWARDはデフォルトでDROP(許可ルールを与えない限りは通さない)
  • OUTPUTはACCEPT(サーバから外部への通信は通す。例えばapt等のパッケージ更新は設定せずとも動く)
  • 上記基本ルールがある為、穴あけを「sudo ufw allow to any app Apache」のように実施していく。

ufwはiptables及びip6tablesのルールを設定するラッパーのようなものです。ですので、ufw statusコマンドで確認可能なルールを更に深堀しようとした場合には、以下コマンドでufwが設定した結果のファイアウォールを見ることが出来ます。

sudo iptables -L 
sudo iptables -L

# IP等、詳細に見たい場合
sudo iptables -L -n -v
sudo ip6tables -L -n -v

上記コマンドを実行すると、ufwが大量に設定したルールが出てきて「何が何だかわからん」となるかと思います。そういう場合には「DROP」や「ACCEPT」、ないしはポート番号等からあたりをつけて見ていくと良いです。

設定したファイアウォールの動作確認

ファイアウォールを動作確認をすることをお勧めしますが、ローカルからの実行しか出来ない場合には、せめてlocalhostではなく、外部公開用のIPを指定してスキャンしてください。

可能であれば、外部からスキャンした方が良いので、スキャン可能なPCからスキャンしてみてください。

export TARGET=0.0.0.1 # 対象サーバ機のIPに置き換えてください。

sudo apt install nmap
sudo nmap -p- ${TARGET}

# ご参考:ローカルホストに対してnmapした場合。ufwで許可していないものも検知されてしまいます。
Host is up (0.0000090s latency).
Not shown: 65531 closed ports
PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
3306/tcp  open  mysql
33060/tcp open  mysqlx

最後に

ufwは学習も簡単なので、慣れてしまうと「sambaを入れたから、該当ポートを許可したい」等も、一行のコマンドで出来てしまいます。簡単にセキュリティ強化できるため、お勧めです。

ブックマーク パーマリンク.

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください