SUSEfirewall2コマンドの使い方

#1 SUSEfirewall2とは?
ファイアウォールの設定を行うコマンドです。
openSUSEには、GUIの設定ツール(YaST)がありますが、
ここでは、コマンドラインから実行するSUSEfirewall2を使ってみます。


SUSEfirewall2は、CentOS7のfirewall-cmd,Ubuntuのufwと同じ位置づけのコマンドです。
いずれも、iptablesを使って、OSのnetfilterにアクセスします。
図に書くと、以下のようになります。

```
       CentOS7         Ubuntu16.04        openSUSE(Leap 42.3)
  +--------------+    +------------+    +---------------------+   -*-
  | firewall-cmd |    |     ufw    |    |    SUSEfirewall2    |    |
  +--------------+    +------------+    +---------------------+    |
                                                                 ユーザ空間
  +-----------------------------------------------------------+    |
  |                     iptables                              |    |
  +-----------------------------------------------------------+   -*-

  +-----------------------------------------------------------+   -*-
  |                                                           |    |
  |                    OS(netfilter)                          |  カーネル空間
  |                                                           |    |
  +-----------------------------------------------------------+   -*-
```

私が調査した各コマンドの記事は、それぞれ、以下にあります。
[firewall-cmdコマンドの使い方](https://hana-shin.hatenablog.com/entry/2022/02/07/213844)
[ufwコマンドの使い方](https://hana-shin.hatenablog.com/entry/2022/11/08/193443#google_vignette)
[iptablesの使い方](https://hana-shin.hatenablog.com/entry/2022/12/11/214416)

#2 環境
VMware Workstation 14 Playerでゲストマシン(2台)を作成しました。
ゲストマシンの構成、版数は以下のとおりです。

```console:構成
                192.168.3.0/24
client ---------------------------------- server
     .210                                .200
```

```console:版数
server:~ # lsb-release -a
LSB Version:    n/a
Distributor ID: openSUSE project
Description:    openSUSE Leap 42.3
Release:        42.3
Codename:       n/a

server:~ # uname -r
4.4.76-1-default
```



#3 オプション一覧

```
server:~ # SUSEfirewall2 --help
SuSEfirewall2 3.6, Copyright (C) 2005  SUSE LINUX Products GmbH

stateful packet filter rules generator for iptables.

/sbin/SUSEfirewall2 start|test|debug [file FILENAME]
/sbin/SUSEfirewall2 basic|stop|close|status|help
/sbin/SUSEfirewall2 open ZONE TYPE services...
/sbin/SUSEfirewall2 on|off
/sbin/SUSEfirewall2 [-s <service>] update-rpc

Options:
  start       generate and load the firewall filter rules from
              /etc/sysconfig/SuSEfirewall2
  stop        unload all filter rules
  close       no incoming network traffic except bootp+ping (for boot security)
  basic       set basic filter rules that drop all incoming access
  test        generate and load the filter rules but do not drop any packet but log
              to syslog anything which *would* be denied
  status      print the output of "iptables -nvL"
  debug       print the iptables command to stdout instead of executing them
  log         show SuSEfirewall2 related syslog messages in a better readable format
  help        this output
  open        open the specified services in the specified zone. You need to
              restart SuSEfirewall2 for changes to take effect.
  on          add SuSEfirewall2 initscripts to boot process and start
  off         remove SuSEfirwall2 initscripts from boot process and stop
  update-rpc  update rules for dynamic RPC services
              if -s/--service is specified then only rules for the given
              service will be updated, otherwise for all configured RPC
              services

  file FILENAME  same as "start" but load alternate config file FILENAME

Calling /sbin/SUSEfirewall2 without any option is the same as the "start" option.
The "file FILENAME" option may be used with the start, test and debug options.
```


#4 概要
SuSEfirewall2は、/etc/sysconfig/SuSEfirewall2の設定内容をよみとって、
iptablesルールを生成するスクリプトです

```
server:~ # which SUSEfirewall2
/sbin/SUSEfirewall2

server:~ # file /sbin/SUSEfirewall2
/sbin/SUSEfirewall2: symbolic link to `SuSEfirewall2'

server:~ # file /sbin/SuSEfirewall2
/sbin/SuSEfirewall2: symbolic link to `/usr/sbin/SuSEfirewall2'

結局、SUSEfirewall2はシェルスクリプトであることがわかる。
server:~ # file /usr/sbin/SuSEfirewall2
/usr/sbin/SuSEfirewall2: Bourne-Again shell script, ASCII text executable
```

#5 SUSEfirewall2の起動、停止方法
##5.1 起動方法(start)
停止しているSUSEfirewall2を起動する方法を説明します。

```
SUSEfirewall2の状態を確認する。停止していることがわかる。
server:~ # SUSEfirewall2 status
<35>Apr  7 19:29:44 SuSEfirewall2: SuSEfirewall2 not active

SUSEfirewall2を起動する。
server:~ # SUSEfirewall2 start
<38>Apr  7 19:31:08 SuSEfirewall2: Setting up rules from /etc/sysconfig/SuSEfirewall2 ...
<38>Apr  7 19:31:08 SuSEfirewall2: using default zone 'ext' for interface eth0
<38>Apr  7 19:31:09 SuSEfirewall2: Firewall rules successfully set

SUSEfirewall2の状態を確認する。起動していることがわかる。
server:~ # SUSEfirewall2 status
### iptables filter ###
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
   12   744 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate ESTABLISHED
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:5353 PKTTYPE = multicast
    2    64 input_ext  all  --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            limit: avg 3/min burst 5 LOG flags 6 level 4 prefix "SFW2-IN-ILL-TARGET "
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0
-以下、略-
```


##5.2 停止方法(stop)
動作中のSUSEfirewall2を停止する方法を説明します。

```
SUSEfirewall2を停止する。
server:~ # SUSEfirewall2 stop
<38>Apr  7 19:33:59 SuSEfirewall2: Firewall rules unloaded.

SUSEfirewall2の状態を確認する。停止していることがわかる。
server:~ # SUSEfirewall2 status
<35>Apr  7 19:34:03 SuSEfirewall2: SuSEfirewall2 not active
```

#6 OS起動時にSUSEfirewall2の起動、停止する方法

##6.1 OS起動時にSUSEfirewall2を起動する方法(on)

```
server:~ # SUSEfirewall2 on
<38>Apr  7 19:37:49 SuSEfirewall2: Setting up rules from /etc/sysconfig/SuSEfirewall2 ...
<38>Apr  7 19:37:49 SuSEfirewall2: using default zone 'ext' for interface eth0
Created symlink from /etc/systemd/system/multi-user.target.wants/SuSEfirewall2_init.service to /usr/lib/systemd/system/SuSEfirewall2_init.service.
Created symlink from /etc/systemd/system/SuSEfirewall2_setup.service to /usr/lib/systemd/system/SuSEfirewall2.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/SuSEfirewall2.service to /usr/lib/systemd/system/SuSEfirewall2.service.
<38>Apr  7 19:37:50 SuSEfirewall2: Firewall rules successfully set

OSを再起動する。
server:~ # shutdown -r now

OS再起動後のSUSEfirewall2の状態を確認する。SUSEfirewall2が起動していることがわかる。
server:~ # SUSEfirewall2 status
### iptables filter ###
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
   46  6489 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate ESTABLISHED
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:5353 PKTTYPE = multicast
    3   116 input_ext  all  --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            limit: avg 3/min burst 5 LOG flags 6 level 4 prefix "SFW2-IN-ILL-TARGET "
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0
-以下、略-
```

##6.2 OS起動時にSUSEfirewall2を起動しないようにする方法(off)

```
server:~ # SUSEfirewall2 off
Removed symlink /etc/systemd/system/multi-user.target.wants/SuSEfirewall2_init.service.
Removed symlink /etc/systemd/system/multi-user.target.wants/SuSEfirewall2.service.
Removed symlink /etc/systemd/system/SuSEfirewall2_setup.service.
<38>Apr  7 19:43:04 SuSEfirewall2: Firewall rules unloaded.

OSを再起動する。
server:~ # shutdown -r now

OS再起動後のSUSEfirewall2の状態を確認する。SUSEfirewall2が停止していることがわかる。
server:~ # SUSEfirewall2 status
<35>Apr  7 19:44:31 SuSEfirewall2: SuSEfirewall2 not active
```


#7 ポート番号へのアクセスを許可、禁止にする方法

##7.1 アクセスを許可する方法
サーバの11111番ポートにアクセスする方法を説明します。

```console:書式
# SuSEfirewall2 open <ZONE> <TYPE> <services...>
    ZONE : INT,EXT,DMZの中から選択する。
    TYPE : TCP,UDP,IP,RPCの中から選択する。
```

```console:サーバ側の設定
11111番ポートへのアクセスを許可する。
server:~ # SUSEfirewall2 open EXT TCP 11111

設定を有効にするため、SUSEfirewall2を再起動する。
server:~ # SUSEfirewall2 stop
server:~ # SUSEfirewall2 start

設定ファイルに11111番ポートへのアクセス許可が設定されたことがわかる。
server:~ # less /etc/sysconfig/SuSEfirewall2
FW_SERVICES_EXT_TCP="11111"

iptablesのユーザ定義チェイン(input_ext)にも、11111番ポートへのアクセス許可(★)が設定されたことがわかる。
server:~ # iptables -nL input_ext
Chain input_ext (1 references)
target     prot opt source               destination
DROP       all  --  0.0.0.0/0            0.0.0.0/0            PKTTYPE = broadcast
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 4
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 8
LOG        tcp  --  0.0.0.0/0            0.0.0.0/0            limit: avg 3/min burst 5 tcp dpt:11111 flags:0x17/0x02 LOG flags 6 level 4 prefix "SFW2-INext-ACC-TCP "
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0         ★ tcp dpt:11111
LOG        tcp  --  0.0.0.0/0            0.0.0.0/0            limit: avg 3/min burst 5 tcp dpt:22 flags:0x17/0x02 LOG flags 6 level 4 prefix "SFW2-INext-ACC-TCP "
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
DROP       all  --  0.0.0.0/0            0.0.0.0/0            /* sfw2.insert.pos */ PKTTYPE != unicast
LOG        tcp  --  0.0.0.0/0            0.0.0.0/0            limit: avg 3/min burst 5 tcp flags:0x17/0x02 LOG flags 6 level 4 prefix "SFW2-INext-DROP-DEFLT "
LOG        icmp --  0.0.0.0/0            0.0.0.0/0            limit: avg 3/min burst 5 LOG flags 6 level 4 prefix "SFW2-INext-DROP-DEFLT "
LOG        udp  --  0.0.0.0/0            0.0.0.0/0            limit: avg 3/min burst 5 ctstate NEW LOG flags 6 level 4 prefix "SFW2-INext-DROP-DEFLT "
DROP       all  --  0.0.0.0/0            0.0.0.0/0
```

```console:動作確認
サーバ側は11111番ポートでListenする。
server:~ # nc -kl 11111

クライアントからサーバにデータ(12345)を送信する。
client:~ # nc server 11111
12345

サーバ側でデータが受信できたことを確認する。
server:~ # nc -kl 11111
12345
```

##7.2 アクセスを許可する方法（サービス名を指定する方法）
7.1ではポートへのアクセスをポート番号で指定しましたが、ここではサービス名を指定する方法を説明します。サービス名は/etc/servicesに定義されています。

```console:サーバ側
httpアクセスを許可する。
server:~ # SUSEfirewall2 open EXT TCP http

SUSEfirewall2を再起動する。
server:~ # SUSEfirewall2 stop
server:~ # SUSEfirewall2 start

ncコマンドを実行する。80番ポート(http)でListenします。
server:~ # nc -kl 80
```

```console:クライアント側
クライアントからサーバの80番ポートにアクセスする。データ(12345)を送信する。
client:~ # nc server 80
12345
```

```console:サーバ側
サーバ側で受信を確認する。クライアントが送信したデータが受信できたことがわかる。
server:~ # nc -kl 80
12345
```

##7.3 アクセスを禁止にする方法
SUSEfirewall2は、ポートへのアクセスを禁止にするオプションがないように思います。
あったら、教えてください。
設定ファイル(SuSEfirewall2)を編集して、SUSEfirewall2を再起動することで、
許可したポートへのアクセスを禁止にします。

```
11111番ポートへのアクセス許可の設定を削除する。
FW_SERVICES_EXT_TCP="11111"をFW_SERVICES_EXT_TCP=""に変更する。
server:~ # vi /etc/sysconfig/SuSEfirewall2
FW_SERVICES_EXT_TCP=""

設定を有効にするため、SUSEfirewall2を再起動する。
server:~ # SUSEfirewall2 stop
server:~ # SUSEfirewall2 start

iptablesのユーザ定義チェイン(input_ext)から、11111番ポートへのアクセス許可が削除されたことがわかる。
server:~ # iptables -nL input_ext
Chain input_ext (1 references)
target     prot opt source               destination
DROP       all  --  0.0.0.0/0            0.0.0.0/0            PKTTYPE = broadcast
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 4
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 8
LOG        tcp  --  0.0.0.0/0            0.0.0.0/0            limit: avg 3/min burst 5 tcp dpt:22 flags:0x17/0x02 LOG flags 6 level 4 prefix "SFW2-INext-ACC-TCP "
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
DROP       all  --  0.0.0.0/0            0.0.0.0/0            /* sfw2.insert.pos */ PKTTYPE != unicast
LOG        tcp  --  0.0.0.0/0            0.0.0.0/0            limit: avg 3/min burst 5 tcp flags:0x17/0x02 LOG flags 6 level 4 prefix "SFW2-INext-DROP-DEFLT "
LOG        icmp --  0.0.0.0/0            0.0.0.0/0            limit: avg 3/min burst 5 LOG flags 6 level 4 prefix "SFW2-INext-DROP-DEFLT "
LOG        udp  --  0.0.0.0/0            0.0.0.0/0            limit: avg 3/min burst 5 ctstate NEW LOG flags 6 level 4 prefix "SFW2-INext-DROP-DEFLT "
DROP       all  --  0.0.0.0/0            0.0.0.0/0
```

#8 受信パケットを拒否する方法(close)

```console:ファイアウォールの状態確認
ファイアウォールの状態を確認する。
INPUTチェインからユーザ定義チェイン(input_ext)を呼び出して(★)いることがわかる。
server:~ # SUSEfirewall2 status
### iptables filter ###
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
   20  1184 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate ESTABLISHED
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:5353 PKTTYPE = multicast
 ★ 0     0 input_ext  all  --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            limit: avg 3/min burst 5 LOG flags 6 level 4 prefix "SFW2-IN-ILL-TARGET "
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0
```

```console:ユーザ定義チェインの確認
ユーザ定義チェイン(input_ext)の設定内容を確認する。
ssh(★)やICMP echo(■)の受信許可をしていることがわかります。
server:~ # iptables -L input_ext
Chain input_ext (1 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere             PKTTYPE = broadcast
ACCEPT     icmp --  anywhere             anywhere             icmp source-quench
ACCEPT     icmp --  anywhere             anywhere          ■ icmp echo-request
LOG        tcp  --  anywhere             anywhere             limit: avg 3/min burst 5 tcp dpt:ssh flags:FIN,SYN,RST,ACK/SYN LOG level warning tcp-options ip-options prefix "SFW2-INext-ACC-TCP "
ACCEPT     tcp  --  anywhere             anywhere          ★ tcp dpt:ssh
DROP       all  --  anywhere             anywhere             /* sfw2.insert.pos */ PKTTYPE != unicast
LOG        tcp  --  anywhere             anywhere             limit: avg 3/min burst 5 tcp flags:FIN,SYN,RST,ACK/SYN LOG level warning tcp-options ip-options prefix "SFW2-INext-DROP-DEFLT "
LOG        icmp --  anywhere             anywhere             limit: avg 3/min burst 5 LOG level warning tcp-options ip-options prefix "SFW2-INext-DROP-DEFLT "
LOG        udp  --  anywhere             anywhere             limit: avg 3/min burst 5 ctstate NEW LOG level warning tcp-options ip-options prefix "SFW2-INext-DROP-DEFLT "
DROP       all  --  anywhere             anywhere
```

```console:closeの実行
server:~ # SUSEfirewall2 close
<38>Apr  8 09:31:16 SuSEfirewall2: Firewall rules set to CLOSE.
```

```console:ファイアウォールの状態確認
INPUTチェインを確認する。ユーザ定義チェイン(input_ext)が削除されたことがわかる。
つまり、外部からの新規パケット受信が禁止されたことになります。
なお、すでに確立済TCPコネクションのパケット送受信や、外部ホストへのpingは実行できます。
server:~ # SUSEfirewall2 status
### iptables filter ###
Chain INPUT (policy DROP 1 packets, 32 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
   13   784 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate ESTABLISHED
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:5353 PKTTYPE = multicast
```

```console:動作確認
サーバでpingを実行する。pingが実行完了することがわかる。
server:~ # ping -c 1 client
PING client (192.168.3.210) 56(84) bytes of data.
64 bytes from client (192.168.3.210): icmp_seq=1 ttl=64 time=0.566 ms

クライアントでpingを実行する。しかし、pingが実行完了しません。
ここでは、タイムアウトオプションを指定して、pingが1秒でタイムアウトしていることを確認しています。
client:~ # ping -w 1 -c 1 server
PING server (192.168.3.200) 56(84) bytes of data.

--- server ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
```



#9 アクセスログの確認方法(log)

```
ログを確認する。クライアントからサーバの11111番ポートへのアクセスがあったことがわかる。
server:~ # SUSEfirewall2 log
i  ext   ACC-TCP    tcp                    192.168.3.210:51066 > eth0                 192.168.3.200:11111
i  ext   ACC-TCP    tcp                    192.168.3.210:51068 > eth0                 192.168.3.200:11111
i  ext   ACC-TCP    tcp                    192.168.3.210:51070 > eth0                 192.168.3.200:11111
```

#10 おわりに
SUSEfirewall2コマンドは、細かい設定ができないように思いました。
ポート番号へのアクセス許可はできますが、アクセス禁止にするオプションがありません。
使い勝手が悪いと感じました。
また、送信元／送信先IPを指定するオプションもありません。
このようなときは、設定ファイル(SuSEfirewall2)を直接編集して、
ファイアウォールを再起動する必要があります。

#X 参考情報
[SuSEfirewall2](https://en.opensuse.org/SuSEfirewall2)