firewalldの設定 CentOS 7

firewalldサービスの操作

サービス 有効化

systemctl enable firewalld

Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.

サービス 起動

systemctl start firewalld

サービスが起動していない状態でfirewall-cmdコマンドを使用するとFirewallD is not runningというエラーが発生します。サービスを起動してからコマンドを使用して下さい。

サービス 停止

systemctl stop firewalld

サービス リロード

systemctl reload firewalld.service

サービス 再起動

systemctl restart firewalld

サービス ステータス確認

systemctl status firewalld

● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: active (running) since Wed 20XX-12-26 10:52:08 UTC; 2s ago
     Docs: man:firewalld(1)
 Main PID: 8141 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─8141 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Dec 26 10:52:08 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
Dec 26 10:52:08 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.

設定状況の確認

firewall-cmd --list-allコマンドで現在有効になっているfirewalldの設定を表示します。通常デフォルトのゾーンがpublicゾーンのため、特に何も指定しない場合は、publicゾーンの設定が表示されます。--zone=dmzのように特定のゾーンを指定することもできます。

firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: ssh dhcpv6-client http https
  ports: 24224/tcp 24224/udp 50000-50030/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

特定サービスを公開する (publicゾーン)

Apache(httpd)などのWebサーバをインストールしたと想定して、 http(80番ポート)、https(443番ポート)を公開する(publicゾーンに永続的にpermanentに登録する)。firewalldをreloadして設定を反映します。

firewall-cmd --add-service=http --zone=public --permanent
firewall-cmd --add-service=https --zone=public --permanent
systemctl reload firewalld.service

firewall-cmd --list-services
ssh dhcpv6-client http https

iptablesで実際に設定が反映されているか確認することもできます。

iptables -L
(抜粋表示)
Chain IN_public_allow (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh ctstate NEW
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http ctstate NEW
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https ctstate NEW

firewall-cmdによる設定変更

firewall-cmdコマンドを使用した具体的なfirewalldの設定について説明します。

ここでは、基本的に一時的な設定ではなく、--permanentを指定した永続的な設定について説明します。一時的な設定では、サーバを再起動、firewalldを再起動・リロードすると設定が消えてしまいますが、永続的な設定ではそれらの操作をした後も設定が残ります。

また、永続的設定を変更した後にはfirewalldサービスのリロードが必要となります。

特定サービスを公開停止する (publicゾーン)

http、httpsサービスを公開停止にする(publicゾーンから永続的permanentに削除する)。firewalldをreloadして設定を反映します。

firewall-cmd --remove-service=http --zone=public --permanent
firewall-cmd --remove-service=https --zone=public --permanent
systemctl reload firewalld.service

firewall-cmd --list-services
ssh dhcpv6-client

firewall-cmdで指定できるサービス名の確認

firewall-cmdコマンドの--add-service--remove-serviceオプションで指定できるサービス名の一覧を表示します。

firewall-cmd --get-services

RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nfs3 nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server

代表的なサービスを以下に挙げておきます。

  • ログイン: ssh, ftp
  • Web: http, https
  • メール: smtp, smtps, pop3 pop3s, imap, imaps
  • DNS: dns

特定ポートを公開する (publicゾーン)

サービス名ではなく直接ポート番号を指定して公開する場合はプロトコル(tcpもしくはudp)も指定してfirewall-cmd --add-portを実行します。

ポート番号24224のtcpとudpの両方を公開します。

firewall-cmd --add-port=24224/tcp --zone=public --permanent
success
firewall-cmd --add-port=24224/udp --zone=public --permanent
success
systemctl reload firewalld.service

firewall-cmd --list-ports
24224/tcp 24224/udp

ポート番号の範囲を指定する場合はハイフンを使って50000-50030/tcpのように記述します。

firewall-cmd --zone=public --add-port=50000-50030/tcp --permanent
systemctl reload firewalld.service

firewall-cmd --list-ports
24224/tcp 24224/udp 50000-50030/tcp

特定ポートを公開停止する (publicゾーン)

ポート番号を指定して公開停止する場合はプロトコル(tcpもしくはudp)も指定してfirewall-cmd --remove-portを実行します。

firewall-cmd --remove-port=24224/tcp --zone=public --permanent
success
firewall-cmd --remove-port=24224/udp --zone=public --permanent
success
systemctl reload firewalld.service

firewall-cmd --list-ports
50000-50030/tcp

ポート番号の範囲を指定する場合は同様に次のとおりです。

firewall-cmd --zone=public --remove-port=50000-50030/tcp --permanentsuccess
systemctl reload firewalld.service

firewall-cmd --list-ports
(何も表示されない)

一時的に特定IPアドレス・ネットワークをブロック

公開されているサーバを運用しているとよく分かりますが、ログをみると各種サービスに対して攻撃を受けることが思ったよりも頻繁にあります。

特定のIPアドレスから攻撃を受けていることがわかり、とりあえずの処置として一時的にブロックしたいという状況があります。

blockゾーンに--add-sourceオプションでIPアドレスを追加することで、該当IPアドレスからのアクセスをブロックすることができます。

一時的な設定の場合はすぐに設定が反映されるため、firewalldサービスのリロードは必要ありません。逆にサーバの再起動、firewalldサービスの再起動・リロード後には設定が消えますのでご注意下さい。

firewall-cmd --zone=block --add-source=192.168.7.100
success

firewall-cmd --list-sources --zone=block
192.168.7.100

--add-sourceオプションにはネットワークを指定することもできます。

firewall-cmd --zone=block --add-source=192.168.11.0/24
success

firewall-cmd --list-sources --zone=block
192.168.7.100 192.168.11.0/24

設定を削除したい場合は--add-sourceオプションを使います。

特定IPアドレス・ネットワークからのアクセスを許可

自分が管理しているサーバやネットワークからのアクセスを許可したい場合は、trustedゾーンにIPアドレスやネットワークを追加します。

監視サーバは様々なポートへのアクセスが必要なため、個人的には監視サーバのIPアドレスをtrustedゾーンに追加しています。

IPアドレスではなくネットワークを追加するには192.168.246.0/24のように設定します。

trustedゾーンはpublicゾーンよりも優先度が高いため、trustedゾーンに追加されたIPアドレス・ネットワークからはpublicゾーンに許可されていないポートへのアクセスも可能です。

firewall-cmd --zone=trusted --permanent --add-source=192.168.246.1
systemctl reload firewalld

firewall-cmd --list-sources --zone=trusted
192.168.246.1

設定を削除したい場合は--add-sourceオプションを使います。

ipコマンドの使い方

ネットワーク関連の設定をするifconfigコマンドが、CentOSでobsoleteになりました。
CentOS 7のminimalインストール直後の状態では、ifconfigが含まれていません。
ifconfigの代替として、iprouteパッケージに含まれるipコマンドを使用する事になります。

net-toolsパッケージをインストールすることでifconfigを使用し続けることはできますが、いずれifconfigを使用することができない環境が増えてくるものと思われます。
今のうちにipコマンドに慣れておくと良いでしょう。

Red Hatが公開しているチートシートも参考になります。PDFでダウンロードできます。
Red Hat Enterprise Linux の ip コマンドチートシート

閲覧系コマンド

ネットワークデバイスやIPアドレスの一覧などを表示する閲覧系コマンドは一般ユーザでも実行できます。

IPアドレスの表示 ip address show

IPアドレスを含むネットワークデバイスの一覧を表示します。各デバイスのデバイス名、IPv4アドレス、IPv6アドレス、MACアドレス、デバイスの状態などを確認できます。
個人的に最もよく使用するサブコマンドで、普段はaddressの部分をかなり省略してip aと入力しています。ここではip addrとしました。

ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.10/24 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 XXXX::XXXX:XXXX:XXXX:XXXX/64 scope link
       valid_lft forever preferred_lft forever

ネットワークデバイスの表示 ip link show

ネットワークデバイスの一覧を表示します。各デバイスのデバイス名、MACアドレス、デバイスの状態などを確認できます。

ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff

ネットワークデバイスに関する統計の表示 ip -s link show

ip -s link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    RX: bytes  packets  errors  dropped overrun mcast
    81784055   726405   0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    81784055   726405   0       0       0       0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    14879508675 194399446 0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    29021979217 63591982 0       0       0       0

ルーティングテーブルの表示 ip route show

デフォルトルートが192.168.0.1に設定されていることが分かります。

ip route
default via 192.168.0.1 dev eth0  proto static  metric 100
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.10  metric 100

ARPテーブルの表示 ip neigh show

ip neigh
192.168.0.10 dev eth0 lladdr XX:XX:XX:XX:XX:XX STALE
192.168.0.1 dev eth0 lladdr XX:XX:XX:XX:XX:XX REACHABLE
192.168.0.2 dev eth0 lladdr XX:XX:XX:XX:XX:XX STALE

設定系コマンド

各種デバイスへの設定コマンドについて説明します。設定にはroot権限が必要となります。rootになってコマンドを実行するかsudoコマンドを付けて実行する必要があります。

ちなみに、一般ユーザで設定系のコマンドを実行するとRTNETLINK answers: Operation not permittedというエラーが発生します。

デバイス リンクアップ ip link set DEVICE up

ip link setコマンドでデバイスの状態をUPに設定します。ip link showコマンドなどで指定したデバイスのstateがUPになっていることを確認します。

# ip link set eth1 up
# ip link show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff

デバイス リンクダウン ip link set DEVICE down

ip link setコマンドでデバイスの状態をDOWNに設定します。

# ip link set eth1 down
# ip link show eth1
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff

IPアドレス設定 (追加) ip address add

ip address addコマンドでデバイスにIPアドレスを設定(追加)します。1つのデバイスに複数のIPアドレスを設定することができます。

# ip addr add 172.16.44.132/24 dev eth1

IPアドレス削除 ip address del

ip address delコマンドでデバイスに設定されているIPアドレスを削除します。

# ip addr del 172.16.44.132/24 dev eth1

VLANインターフェイスの作成 ip link add type vlan

ip link addコマンドで特定のVLAN IDでタグ付けされたVLANインターフェイスを作成します。

作成したVLANインターフェイスを利用するには状態をUPにしておく必要があります。

ここでは、物理インターフェイスeth1に対してVLAN ID101を指定したVLANインターフェイスeth1.101を作成します。

インターフェイスの詳細を表示すると、プロトコル802.1QでVLAN ID 101が設定されていることが分かります。

# ip link add link eth1 name eth1.101 type vlan id 101
# ip link set eth1.101 up
# ip -d link show eth1.101
4: eth1.101@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff promiscuity 0
    vlan protocol 802.1Q id 101 <REORDER_HDR> addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535

ブリッジの作成 ip link add type bridge

ip link addコマンドでブリッジインターフェイス(ネットワークブリッジ)を作成します。

ここではbr1_101という名前のブリッジを作成します。

ブリッジの詳細を表示すると、デバイスの種類がbridgeであることが分かります。

# ip link add name br1_101 type bridge
# ip link set up dev br1_101
# ip -d link show br1_101
5: br1_101: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff promiscuity 0
    bridge forward_delay 1500 hello_time (省略)

デバイスをブリッジにアタッチするにはip link setmasterを設定します。

ここでは、VLANインターフェイスeth1.101をブリッジbr1_101にアタッチします。つまり、eth1.101に対してmasterとしてbr1_101を設定します。

# ip link set dev eth1.101 master br1_101
# ip link show eth1.101
4: eth1.101@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br1_101 state UP mode DEFAULT group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff

例えば、KVMの仮想マシンの仮想NICをブリッジbr1_101へアタッチすることで、eth1から外に出るパケットはVLAN ID101でタグ付けされることになります。

ちなみに、brctlコマンドで確認した場合は次の様になります。ブリッジ周りに関しては、brctlの方が表示やコマンド体系がわかりやすいかもしれません。

brctl show br1_101
bridge name	bridge id		STP enabled	interfaces
br1_101		8000.000c29b8658b	no		eth1.101

Linux arpコマンド

現在のarpの状況を表示するにはarpコマンドを利用する。

arp
--------------------------------
Address                  HWtype  HWaddress           Flags Mask            Iface
1.0.168.192.in-addr.arp  ether   00:80:6D:7A:01:5D   C                     eth0
192.168.0.14             ether   00:01:80:58:1B:AA   C                     eth0
arp
--------------------------------

デフォルトゲートウェイの設定 routeコマンド

リアルタイムでデフォルトゲートウェイを設定するには、routeコマンドを利用します。

現在の設定の確認

routeコマンドを引数無しで実行すると、現在のルーティングの設定が表示されます。

Destination (宛先) という項目にdefaultと書かれている行があります。その行のGatewayの値 192.168.100.1 が、現在設定されているデフォルトゲートウェイのIPアドレスです。

route
-------------------------------------------------
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.100.0   *               255.255.255.0   U     0      0        0 eth0
192.168.122.0   *               255.255.255.0   U     0      0        0 virbr0
169.254.0.0     *               255.255.0.0     U     0      0        0 eth0
default         192.168.100.1   0.0.0.0         UG    0      0        0 eth0
-------------------------------------------------

デフォルトゲートウェイの削除

デフォルトゲートウェイを再設定するには一度現在の設定を削除する必要があります。実行した時点でネットワークがつながらなくなることがあるので、リモートログインしている際には注意してください。

route delete default

デフォルトゲートウェイの設定

デフォルトゲートウェイを192.168.100.254に設定します。

route add default gw 192.168.100.254

設定ファイルによるデフォルトゲートウェイの変更

設定ファイルを変更してネットワークをリスタートすることでデフォルトゲートウェイを変更することもできます。

vi /etc/sysconfig/network
--------------------------------
GATEWAY=192.168.100.254
--------------------------------

設定変更後すぐに設定を反映

/etc/rc.d/init.d/network restart