CentOS7でiptablesを使う方法

Firewallというのが追加されました。

CentOS6まではLinuxサーバ上でファイアウォールを稼働さす場合、iptablesを使ったフィルタを実装するのが一般的でした。これをこのままCentOS7で利用することも可能なのですが、新たなファイアウォールとしてfirewalldというのが実装されました。

CentOS7からFirewallとiptablesがどっちでも使えるようになっているという謎。正直Firewall要らないです。どちらも内部的には同じようなものらしいですが、設定方法が少々異なるので面倒くさいです。
Firewallはゾーンという概念で設定するようです。(これはまた今度)

iptablesを使う方の設定

systemctl status firewalld

デフォルトで動いている場合は、ステータスがアクティブになっている筈なので、Firewallの設定はいったん切り。
ちゃんと調べてませんが、おそらくデフォルトではport22しか開いていない筈。

systemctl stop firewalld (停止)
systemctl disable firewalld (自動起動設定解除)

これでその他のミドルウェア的なものの設定には支障ない筈です。サーバー設定の最後にFirewallの設定をしてあげればよいと思います。

iptablesの設定

iptablesはCentOS7にはデフォルトではインストールされていないようです。

yum list iptables-services
Loaded plugins: fastestmirror, priorities
Loading mirror speeds from cached hostfile
Available Packages
iptables-services.x86_64                            1.4.21-17.el7

yumではiptables-services.x86_64 1.4.21-17.el7がインストールできるみたいなので、これを使う。

yum -y install iptables-services

とやると/usr/lib/systemd/system/iptables.serviceに入ってくる。iptablesもデフォルトではport22しか開いていない筈。
最初に起動だけ確認しておきましょう。

systemctl start iptables
systemctl status iptables
* iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled)
   Active: active (exited) since Mon 2017-05-29 14:30:47 JST; 1min 51s ago
  Process: 21344 ExecStart=/usr/libexec/iptables/iptables.init start (code=exited, status=0/SUCCESS)
 Main PID: 21344 (code=exited, status=0/SUCCESS)

May 29 14:30:47 myhost systemd[1]: Starting IPv4 firewall with iptables...
May 29 14:30:47 myhost iptables.init[21344]: iptables: Applying firewall rules: [  OK  ]
May 29 14:30:47 myhost systemd[1]: Started IPv4 firewall with iptables.

問題なしです。

ちなみにイントール直後の設定は、

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

WEBサーバーのiptables設定

vi /etc/sysconfig/iptables

以下iptablesのコマンド使いません。設定ファイルを編集します。
CentOs6と特に変わりはないので、80/443とか通しておけばよいかと思います。

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
# sshd
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
# http (ここ追加)
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
# https (ここ追加)
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

SSHとかのIP制限

固定IPアドレス

ぶっちゃけhosts.allow/hosts.denyでやればよい話ではあるんですが。

-A INPUT -s 12.34.56.xxx/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 12.34.57.xxx/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

IPアドレスをオプション-sでつけてあげればよいです。ネットワークアドレスで設定できる固定IPの場合は/32とか、クラスCのときは/24(だっけ)とかやります。
サブネットの計算してくれるサイトあります。

イーサーネットを指定

ネットワークを組んでいたらeth0とeth1があったりしてグローバルとプライベートでネットワークを切り分けて疎通を設定しないといけない場合があります。-iでイーサーを選択して設定します。

-A INPUT -i eth1 -s 192.168.1.2/24 -j ACCEPT

自動起動の設定

これをやっておかないとサーバー再起動時にデフォルトのFirewallが有効になってiptablesが無効になるという悲惨なことが起こるのできちんと設定しておきましょう。
(Firewalldの設置をしている人は問題ないかと思います。)

Firewalldの自動起動を解除

systemctl disable firewalld.service

iptablesの自動起動設定

systemctl enable iptables.service

確認

systemctl list-unit-files -t service

....
firewalld.service                             disabled
iptables.service                              enabled
....
Last update: 2017.11.20 (月)