はじめに
Linux環境にファイアウォールを設定する(ポートの開放/閉塞)場合、オンプレミス環境のLinuxサーバとAWS等のパブリック・クラウド上に構築したLinuxサーバとでは、それぞれ設定方法が異なります。本記事では、RedHat Enterprise Linuxを題材として、それらの違いを簡単にまとめてみました。
オンプレミス環境のLinuxサーバの場合
firewalldデーモンの起動
RedHat Enterprise Linuxでは、firewalldというファイアウォールを司るデーモンが起動しています。起動していない場合には、下記のコマンドでデーモンを起動します。
[root@localhost testuser]# systemctl start firewalld
起動後は、systemctl status firewalldを実行してステータスを確認することもできますし、firewalldを制御するために提供されているfirewall-cmdを使った確認も可能です。
[root@localhost testuser]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor p>
Active: active (running) since Mon 2024-03-18 20:35:52 JST; 4s ago
Docs: man:firewalld(1)
Main PID: 3529 (firewalld)
Tasks: 2 (limit: 22809)
Memory: 34.8M
CGroup: /system.slice/firewalld.service
mq3529 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork >
3月 18 20:35:52 localhost.localdomain systemd[1]: Starting firewalld - dynamic>
3月 18 20:35:52 localhost.localdomain systemd[1]: Started firewalld - dynamic
[root@localhost testuser]# firewall-cmd --state
running
firewall-cmdコマンドを使用したファイアウォール設定
まずは、firewall-cmd --list-allコマンドを実行し、現時点での設定状態を確認します。(下記はサンプル)
[root@localhost testuser]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: bridge0 ens192
sources:
services: cockpit dhcpv6-client ipsec ssh
ports: 22/tcp 990/tcp 40000-50000/tcp
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
上記の出力において、services行に表示されているサービス、ports行に表示されているポート番号/プロトコルのもののみがファイアウォールとして許可(開放)されているものになります。現時点でいずれにも表示されていないFTP(21番ポート)をLinuxサーバーに対して実行すると、許可されていないため、FTPクライアント上は下記のように接続タイムアウトになります。
状態: 192.168.20.129:21 に接続中...
エラー: 非アクティブになってから 20 秒後に接続がタイムアウトになりました
エラー: サーバーに接続できません
そこで、FTPが実行できるように、firewall-cmdを使って許可設定を実施します。サービス名を指定する、ポート番号を指定する、いずれかの方法を実行すればOKです。
- サービス名を指定する場合
[root@localhost testuser]# firewall-cmd --permanent --add-service=ftp
success
- ポート番号を指定する場合
[root@localhost testuser]# firewall-cmd --permanent --add-port=21/tcp
success
--permanentオプションを指定してコマンドを実行することにより、OS再起動後も設定を有効にすることができます。ここでは、下記のコマンドを実行して、firewalldデーモンを再起動します。
[root@localhost testuser]# firewall-cmd --reload
success
今回はポート番号(21)を追加する形で設定しました。設定後のステータスは下記のようになります。
[root@localhost testuser]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: bridge0 ens192
sources:
services: cockpit dhcpv6-client ipsec ssh
ports: 22/tcp 990/tcp 40000-50000/tcp 21/tcp
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
ports行に「21/tcp」の表示が追加されました。これにより、再度FTPを実行すると問題なく実行できるようになります。(筆者の環境では、FTPSを使用することにしているため、下記のように出力されます。)
状態: 192.168.20.129:21 に接続中...
状態: 接続を確立しました。ウェルカム メッセージを待っています...
状態: TLS を初期化しています...
状態: TLS 接続が確立されました。
状態: ログインしました
状態: ディレクトリ リストを取得中...
状態: "/home/testuser" のディレクトリ リストの表示成功
本記事では、RedHat Enterprise Linuxを例に紹介しましたが、Ubuntu Linuxの場合には「ufw」というUbuntu独自のファイアウォール設定コマンドがあります。
パブリック・クラウド上に構築したLinuxサーバの場合
パブリック・クラウド上のLinuxサーバの場合は、クラウドが提供しているセキュリティー・グループと呼ばれるサービスを使用して通信を許可するポート番号の設定を行います。その為、オンプレミス環境のように、Linux上でコマンドを色々実行してファイアウォールの設定をすることはありません。
以下は、Microsoft社のAzure上のLinuxサーバへSSH通信(ポート22番を開放)できるように設定した場合のサンプル画面になります。(赤枠部分を参照)
セキュリティー・グループは、クラウド上のサーバへの着信アクセスは初期状態では拒否の状態であるため、必要なポート番号のみを明示指定して、ポート開放を行います。
さいごに
本記事では、オンプレミス環境とクラウド環境それぞれのLinuxサーバに対するファイアウォールの設定方法をご紹介しました。クラウド環境の場合は、クラウドが提供するサービスを使用してファイアウォールの設定を行う分、Linuxの細かいコマンドをマスターする必要は無く楽かなとは思います。
ですが、今の時代はクラウドだけではなく、クラウドとオンプレミスを接続したハイブリッド・クラウドを運用される形が多いかと思いますので、オンプレミス環境でのLinuxに対するファイアウォールの設定もできるようになるべく、関連するLinuxのコマンドは個人のテスト環境等を作成して、実機で練習されることをお奨めします。