オンプレとクラウドにおけるLinuxのファイアウォール設定方法

## はじめに
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番を開放)できるように設定した場合のサンプル画面になります。(赤枠部分を参照)
![Azure terraform実行バージョン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/5e913f3b-3285-846a-6ba3-5b5f8d5a99e1.jpeg)

セキュリティー・グループは、クラウド上のサーバへの着信アクセスは初期状態では拒否の状態であるため、必要なポート番号のみを明示指定して、ポート開放を行います。

## さいごに
本記事では、オンプレミス環境とクラウド環境それぞれのLinuxサーバに対するファイアウォールの設定方法をご紹介しました。クラウド環境の場合は、クラウドが提供するサービスを使用してファイアウォールの設定を行う分、Linuxの細かいコマンドをマスターする必要は無く楽かなとは思います。
ですが、今の時代はクラウドだけではなく、クラウドとオンプレミスを接続したハイブリッド・クラウドを運用される形が多いかと思いますので、オンプレミス環境でのLinuxに対するファイアウォールの設定もできるようになるべく、関連するLinuxのコマンドは個人のテスト環境等を作成して、実機で練習されることをお奨めします。