CentOS7のfirewalldで特定IPだけ許可するアクセス制御


# はじめに

CentOS7でiptablesを使いたかったのですが、上手く出来ませんでした。
（どこに設定ファイルあるのか分からへん……）

そこで、デフォルトで使われているfirewalldを使う方法を調べたのでまとめです。

参考させて頂いたサイトはこちらです
https://www.imd-net.com/column/13339/


# firewalldを起動

```
$ systemctl status firewalld
$ systemctl unmask firewalld
$ systemctl enable firewalld
$ systemctl start firewalld
$ systemctl status firewalld
```

unmaskはmaskしてる場合だけでいいです。


# 設定の確認

```
firewall-cmd --list-all
```

# http,httpsアクセスを許可する

これやらないとApache動いててもWebアクセス出来ないやつです。

```
$ firewall-cmd --add-service=http --zone=public --permanent
$ firewall-cmd --add-service=https --zone=public --permanent
$ firewall-cmd --reload
```

reloadの部分は`systemctl restart firewalld`でも出来ました。


#SSH接続を特定IPだけ許可する

すべて不許可→特定IPを許可、です。

IPはグローバルIPとして何が使われているか、[このサイト](https://www.cman.jp/network/support/go_access.cgi)とかで調べておきましょう。

ポートが22なのはデフォルトのままです。
変えてもいいけど、しっかり把握しておかなきゃですね。


#複数IPの指定（追記）

IPを1つずつ追加、とかやってると、ルーター再起動で変わった時に再度コンソールログインして追加して……とめちゃくちゃ大変です。
何度かやってもう嫌になりました。

なので現在使ってるIP調べる→IP検索でそれを割り振ってる会社のIPを範囲指定で追加する、という形にしました。

これだと契約してるインターネット回線の中での揺らぎを吸収しますし、世界中のほとんどのIPを排除出来るので良いと思います。多分

（例）
さくらインターネット株式会社
↓
IP一覧
http://thr3a.hatenablog.com/entry/20190427/1556293982

NTTコミュニケーションズ株式会社
153.128.0.0-153.253.255.255

↓
だいたい
153.128.0.0/9
（2進数で表した時の、左から9桁までを見る、という設定）
（つまり153.128.0.0～153.255.255.255までの指定となる）

IPアドレスをグループとして複数指定するCIDRというものらしいです。
サイダー
https://wa3.i-3-i.info/word11989.html

適当にX.X.0.0/16くらいの指定が良さそう


## すべてのSSH接続を拒否
```
$ firewall-cmd --remove-service=ssh --zone=public --permanent
```

##特定IPのSSH接続を許可
```
$ firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="XXX.XXX.XXX.XXX" port protocol="tcp" port="22" accept"
$ firewall-cmd --reload
```

# ポートを開放

追記：ポートで複数Webサイトを持つ時のために。
http開放してるんだから大丈夫やろ……と思ってたのですが、やらないとダメでした

```
$ firewall-cmd --zone=public --add-port=8000/tcp --permanent
$ firewall-cmd --zone=public --add-port=3001-3999/tcp --permanent

$ firewall-cmd --reload
```

##ポート設定の追記
バージョンが前過ぎると意味ないっぽい？
https://inaba.hatenablog.com/entry/2017/02/26/040218

```
firewall-cmd -V
```


#長ったらしいコマンドが嫌な時

Vimで編集。自己責任で。

```
$ vim /etc/firewalld/zones/public.xml 
$ firewall-cmd --reload
```

ただし何かしらの設定を追加して、reloadで反映させてからじゃないと設定ファイル読み込んでないっぽい

##中身の例

XMLファイルなのでコメント書いて大丈夫でした。やったぜ

```xml:/etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="http"/>
  <service name="https"/>
  <port protocol="tcp" port="3000"/>
  <port protocol="tcp" port="4000-4029"/>
  <port protocol="tcp" port="3001-3999"/>
  <rule family="ipv4">
    <source address="10.0.0.0/8"/>
    <accept/>
  </rule>

  <!-- 2019.4.19 さくらインターネット -->
  <rule family="ipv4">
    <source address="219.94.128.0/17"/>
    <port protocol="tcp" port="22"/>
    <accept/>
  </rule>

  <!-- 2019.4.21 契約してるインターネット会社 -->
  <rule family="ipv4">
    <source address="153.151.234.0/16"/>
    <port protocol="tcp" port="22"/>
    <accept/>
  </rule>

</zone>
```

編集した後は、

```
$ firewall-cmd --reload
```

リロード忘れないようにしましょう。

# やらかした時

IPの指定ミスとか、指定したIPからのインターネットアクセスが出来なくなったりしたら……

さくらVPSの場合、管理画面からのVPSコンソール（？）から入れました。
そこでfirewall-cmdでIP追加したらなんとかなります。

以上です




# 追記 （2024-10-29）

契約してるJCOMが202.X.X.Xくらいから219.X.X.XくらいIPが変動したので、それでアクセス出来なくなってたりしました……🥺

NTTの範囲なのかなこれ？

なので```200.0.0.0/3```での範囲指定しました。

200.0.0.0
255.255.255.255

の範囲ですね。

あまりにも広くなりすぎる気はしましたが、まぁ、仕方なさそうかな……。


# 追追記（2025-02-13）

そもそもパスワード認証だけっていうのが悪くて、秘密鍵と公開鍵を生成して、接続先のサーバに公開鍵を登録して、認証鍵を必須にするべきだったっぽいです……🥺