fierewalld で ipset を用いる手続きをメモしておいた

September 10, 2017 – 3:47 pm

現在、我がサーバはScientific Linux 7.3上で動作している(更新ログ情報)。このバージョン以降、ipsetがfirewalldと連携して動作可能になり、ipsetを活用したファイアウォールの構築が容易になった。

このポストでは、個人的な備忘録として、firewalld で ipsetを用いる際の手続きをメモしておいた。

ipsetとは
ipsetユーティリティについてRHEL7 のマニュアルで次のように説明されている:

ipsetユーティリティは、LinuxカーネルでIPセットを管理するために使用します。IPセットはIPアドレス、ポート番号、IPとMACアドレスのペア、またはIPアドレスとポート番号のペアを格納するために行われるフレームワークです。IPセットが非常に大きい場合であってもIPセットに対する照合が非常に高速で行わえるようIPセットにはインデックスが作成されます。IPセットにより、設定が簡素化され、iptablesを使用した場合にパフォーマンスが向上します。

ポイントは、ipsetユーティリティを利用することで、iptablesでpacketのフィルタリングをする際、従来のように個別のip-アドレス、ポート番号をフィルタリングの対象として扱かうことなく、ひとまとめのIPセットとして扱かうことができるようになった。

ipsetの作成とfirewalld zone drop への登録手続き

ipsetを新たに作成(セット名をblacklistとする)

firewall-cmd --permanent --new-ipset=blacklist --type=hash:net

これにより /etc/firewalld/ipsets に blacklist.xmlファイルが以下のように作成される

blacklist.xml:

<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:net">
</ipset>

作成したipsetがruntime状態にて利用可能にする

firewall-cmd --permanent --reload

ipset blacklist に複数のipaddressを登録する

firewall-cmd --permanent --ipset=ipset_sample --add-entry=192.168.1.4
firewall-cmd --permanent --ipset=ipset_sample --add-entry=192.168.1.5
firewall-cmd --permanent --ipset=ipset_sample --add-entry=192.168.1.6

これは、/etc/firewalld/ipsets に blacklist.xmlファイルに以下のように反映される

blacklist.xml:

<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:net">
  <entry>192.168.1.5</entry>
  <entry>192.168.1.4</entry>
  <entry>192.168.1.6</entry>
</ipset>

ipsetには上述のようにipアドレス等を個別に登録するだけでなく、ファイルを通じて一括して登録反映することも可能になっている。
sample_fileと名付けられたファイルがあり、以下のようなsample_fileがあるとする

sample-flie:

192.168.1.7
192.168.1.8
192.168.2.0/24

sample-fileに記述されているipアドレスを以下の要領で blacklistに登録する

firewall-cmd --permanent --ipset=ipset_sample --add-entries-from-file=sample-file

/etc/firewalld/ipsets に blacklist.xmlファイルに以下のように反映される

blacklist.xml:

<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:net">
  <entry>192.168.1.8</entry>
  <entry>192.168.1.7</entry>
  <entry>192.168.1.6</entry>
  <entry>192.168.1.5</entry>
  <entry>192.168.1.4</entry>
  <entry>192.168.2.0/24</entry>
</ipset>

blacklist.xmlファイルには、sample-fileに記述されていたアドレスが一括して登録されていることが理解される。

ここで作成したipset blacklistを、以下のコマンドで、firewalldのzone dropに登録することにより、ipset blacklistに登録されているアドレスを一括してブロックすることができる。

firewall-cmd --permanent --zone=drop --add-source=ipset:blacklist

これにより、/etc/firewalld/zone/drop.xml は以下のようになる

dorp.xml:

<?xml version="1.0" encoding="utf-8"?>
<zone target="DROP">
  <short>Drop</short>
  <description>Unsolicited incoming network packets are dropped. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description>
  <source ipset="blacklist"/>
</zone>

以上の手続きを有効にするため、以下のコマンドでxmlの内容をreload

firewall-cmd --reload

firewall-cmd のman を関連個所以下にアップしておいた:

NAME
       firewall-cmd - firewalld command line client

SYNOPSIS
       firewall-cmd [OPTIONS...]

OPTIONS
       For sequence options, this are the options that can be specified multiple times, the exit code is 0 if there is at least one
       item that succeded. The ALREADY_ENABLED (11), NOT_ENABLED (12) and also ZONE_ALREADY_SET (16) errors are treated as succeeded.
       If there are issues while parsing the items, then these are treated as warnings and will not change the result as long as there
       is a succeeded one. Without any succeeded item, the exit code will depend on the error codes. If there is exactly one error
       code, then this is used. If there are more than one then UNKNOWN_ERROR (254) will be used.

   General Options
       -h, --help
           Prints a short help text and exits.

       -V, --version
           Print the version string of firewalld. This option is not combinable with other options.

       -q, --quiet
           Do not print status messages.


   Status Options
       --state
           Check whether the firewalld daemon is active (i.e. running). Returns an exit code 0 if it is active, NOT_RUNNING otherwise
           (see the section called “EXIT CODES”). This will also print the state to STDOUT.

       --reload
           Reload firewall rules and keep state information. Current permanent configuration will become new runtime configuration,
           i.e. all runtime only changes done until reload are lost with reload if they have not been also in permanent configuration.

       --complete-reload
           Reload firewall completely, even netfilter kernel modules. This will most likely terminate active connections, because
           state information is lost. This option should only be used in case of severe firewall problems. For example if there are
           state information problems that no connection can be established with correct firewall rules.

       --runtime-to-permanent
           Save active runtime configuration and overwrite permanent configuration with it. The way this is supposed to work is that
           when configuring firewalld you do runtime changes only and once you're happy with the configuration and you tested that it
           works the way you want, you save the configuration to disk.

       --get-log-denied
           Print the log denied setting.

       --set-log-denied=value
           Add logging rules right before reject and drop rules in the INPUT, FORWARD and OUTPUT chains for the default rules and also
           final reject and drop rules in zones for the configured link-layer packet type. The possible values are: all, unicast,
           broadcast, multicast and off. The default setting is off, which disables the logging.

           This is a runtime and permanent change and will also reload the firewall to be able to add the logging rules.

 
      ( 省 略 )

   Options to Handle Bindings of Sources

       Binding a source to a zone means that this zone settings will be used to restrict traffic
       from this source.

       A source address or address range is either an IP address or a network IP address with a
       mask for IPv4 or IPv6 or a MAC address or an ipset with the ipset: prefix. For IPv4, the
       mask can be a network mask or a plain number. For IPv6 the mask is a plain number. The use
       of host names is not supported.

       Options in this section affect only one particular zone. If used with --zone=zone option,
       they affect the zone zone. If the option is omitted, they affect default zone (see
       --get-default-zone).

       For a list of predefined zones use firewall-cmd [--permanent] --get-zones.


       [--permanent] [--zone=zone] --add-source=source[/mask]|MAC|ipset:ipset
           Bind the source to zone zone. If zone is omitted, default zone will be used.

       [--zone=zone] --change-source=source[/mask]|MAC|ipset:ipset
           Change zone the source is bound to to zone zone. It's basically --remove-source
           followed by --add-source. If the source has not been bound to a zone before, it
           behaves like --add-source. If zone is omitted, default zone will be used.

       [--permanent] [--zone=zone] --query-source=source[/mask]|MAC|ipset:ipset
           Query whether the source is bound to the zone zone. Returns 0 if true, 1 otherwise.

       [--permanent] --remove-source=source[/mask]|MAC|ipset:ipset
           Remove binding of the source from zone it was previously added to.


   IPSet Options
       --permanent --new-ipset=ipset --type=ipset type [--option=ipset option[=value]]
           Add a new permanent and empty ipset with specifying the type and optional options.

       --permanent --new-ipset-from-file=filename [--name=ipset]
           Add a new permanent ipset from a prepared ipset file with an optional name override.

       --permanent --delete-ipset=ipset
           Delete an existing permanent ipset.

       --permanent --load-ipset-defaults=ipset
           Load ipset default settings or report NO_DEFAULTS error.

       [--permanent] --info-ipset=ipset
           Print information about the ipset ipset. The output format is:

               ipset
                 type: type
                 options: option1[=value1] ..
                 entries: entry1 ..

       [--permanent] --get-ipsets
           Print predefined ipsets as a space separated list.

       --permanent --ipset=ipset --set-description=description
           Set new description to ipset

       --permanent --ipset=ipset --get-description
           Print description for ipset

       --permanent --ipset=ipset --set-short=description
           Set short description to ipset

       --permanent --ipset=ipset --get-short
           Print short description for ipset

       [--permanent] --ipset=ipset --add-entry=entry
           Add a new entry to the ipset.

       [--permanent] --ipset=ipset --remove-entry=entry
           Remove an entry from the ipset.

       [--permanent] --ipset=ipset --query-entry=entry
           Return whether the entry has been added to an ipset. Returns 0 if true, 1 otherwise.

       [--permanent] --ipset=ipset --get-entries
           List all entries of the ipset.

       [--permanent] --ipset=ipset --add-entries-from-file=filename
           Add a new entries to the ipset from the file. For all entries that are listed in the file but
           already in the ipset, a warning will be printed.

           The file should contain an entry per line. Lines starting with an hash or semicolon are ignored.
           Also empty lines.

       [--permanent] --ipset=ipset --remove-entries-from-file=filename
           Remove existing entries from the ipset from the file. For all entries that are listed in the
           file but not in the ipset, a warning will be printed.

           The file should contain an entry per line. Lines starting with an hash or semicolon are ignored.
           Also empty lines.

参考にしたサイト

RHEL7: How to get started with Firewalld.


Post a Comment