Docker : firewalldでssh, http, httpsのみ許可する。(CentOS 7)

CentOSでfirewallを設定して、ポート制御をしてみます。
許可するのは、ssh,http,httpsの3でつです。

#### ■ env
docker container内で作業します。環境は以下です。

```bash:centos:latest
[root@1669e8191ed0 /]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core) 

[root@1669e8191ed0 /]# uname -a
Linux 1669e8191ed0 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:55:56 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
```

#### ■ Docker起動時の注意

firewallの起動確認などの際に、`systemctl `コマンドを多用するのですが普通に起動すると使えないので以下のコマンドのように`--privileged`コマンドをつけて起動してください。

```bash
$ docker run --privileged --name centos -d centos /sbin/init
e510cafea520e0688bbf6ed7b9525229fb6f5d873f080af73e711d324a19be32
$ docker exec -ti centos bash
```

参考 : https://qiita.com/setouchi/items/6bfa116fc5a266856177


#### ■ fiewwallをインストールします。※入っていない場合
通常どおり、`yum install`でインストールします。

```bash
[root@e510cafea520 etc]# yum -y install firewalld
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: mirrors.cat.net
 * extras: mirrors.cat.net
 * updates: mirrors.cat.net

~中略~
```

### ■ 起動確認
ステータスの確認は、以下のコマンドで可能です。
`$ systemctl status firewalld`

```bash
[root@e510cafea520 etc]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Mon 2018-09-24 04:20:16 UTC; 2s ago
     Docs: man:firewalld(1)
  Process: 178 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 178 (code=exited, status=0/SUCCESS)

Sep 24 04:20:00 e510cafea520 systemd[1]: Starting firewalld - dynamic firewall daemon...
```

firewalldをサーバ起動時に自動実行させておくとSSHができなくなるため一度停止しておきます。

`$ systemctl stop firewalld`
`$ systemctl list-unit-files | grep firewalld`

```bash
[root@e510cafea520 etc]# systemctl stop firewalld
[root@e510cafea520 etc]# systemctl list-unit-files | grep firewalld
firewalld.service                      disabled //停止中
```

#### ■ デーモン起動 & 利用可能な『Service』と『Port』を確認する。
では、設定していきますので、一度firewalldを起動します。

`$ systemctl start firewalld.service`

```bash
[root@e510cafea520 etc]# systemctl start firewalld.service //起動
[root@e510cafea520 etc]# systemctl list-unit-files |grep firewalld
firewalld.service                      disabled
[root@e510cafea520 etc]# systemctl start firewalld.service
[root@e510cafea520 etc]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-09-24 04:26:18 UTC; 14s ago
     Docs: man:firewalld(1)
 Main PID: 250 (firewalld)
   CGroup: /docker/e510cafea520e0688bbf6ed7b9525229fb6f5d873f080af73e711d324a19be32/system.slice/firewalld.service
           └─250 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
           ‣ 250 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Sep 24 04:26:18 e510cafea520 systemd[1]: Starting firewalld - dynamic firewall daemon...
Sep 24 04:26:18 e510cafea520 systemd[1]: Started firewalld - dynamic firewall daemon.
```

**利用可能サービスとポート確認**
以下のコマンドで、現状利用可能なServiceとPortが確認できます。

Service
`$ firewall-cmd --list-services`

Port 
`$ firewall-cmd --list-ports`

```bash
[root@e510cafea520 etc]# firewall-cmd --list-services
ssh dhcpv6-client
[root@e510cafea520 etc]# firewall-cmd --list-ports

[root@e510cafea520 etc]#
```

#### ■ http, httpsを追加していきます。
では、現状は上のコマンドで**ssh**は開放されているのでhttp,httpsを追加していきます。


```bash
# Service add
$ firewall-cmd --add-service=http
$ firewall-cmd --add-service=https
```

```
# 再起動時にも自動実行されるように設定
$ firewall-cmd --permanent --zone=public --add-service=http
$ firewall-cmd --permanent --zone=public --add-service=https
```

```bash
[root@kusanagi71 ~]# firewall-cmd --add-service=http
success
[root@kusanagi71 ~]# firewall-cmd --add-service=https
success

[root@kusanagi71 ~]# firewall-cmd --list-services
dhcpv6-client http ssh https

# 再起動して再度確認
[root@kusanagi71 ~]# systemctl restart firewalld.service
[root@kusanagi71 ~]# firewall-cmd --list-services
dhcpv6-client http ssh https
```

以上です。無事、設定できました。