LoginSignup
1
1

firewalldの設定方法②

Last updated at Posted at 2022-12-04

前回(firewalldの設定方法①)の続きです。

今回は、もっと複雑な要件でfirewalldの設定をしてみたいと思います:raising_hand:

以下に要件を記載します:writing_hand:

【業務LAN(eth0)】
・シスログを受信するNW機器と、ADサーバなど運用上で通信が必要なサーバ(同セグメント)以外の通信は拒否する。
・シスログはUDP141で受信する。
・同セグメント内のサーバはanyで許可する。
(内部セグメントは192.168.0.0/24、NW機器は10.171.1.5とします)

ゾーンの作成

前回の記事で紹介したように、あらかじめ9種類のゾーンが用意されていますが、個別にゾーンを作成してそこへ定義することも可能です。
今回のように、個別に接続元IPアドレスや受信するポートを制限したいといった場合に有効です。

では、上記の要件をもとに追加ゾーンの「gyoumu」を作っていきます。
(ゾーンの名前は任意なので、今回は「業務」で作成します)

・dropゾーンの内容をコピーして、「gyoumu」ゾーンとして使うためのひな型を作成する

# cp /usr/lib/firewalld/zones/drop.xml /etc/firewalld/zones/gyoumu.xml

要件に記載があるように、今回シスログを受信するNW機器と同セグメントのサーバ以外とは通信を行わないので、今回はdropゾーンの定義をコピーします。

・作成したゾーンファイルをコマンドで扱えるようにするために、リロードする

# firewall-cmd --reload

作成しただけでは、ゾーンとして認識されていない状態なので一度リロードします。

これでgyoumuゾーンの作成は完了です。

リッチルールの追加

先ほど作成したゾーンに、要件に合わせてルールを追加していきます。

今回は、送信元ごとに許可をしたいポートが異なるので、さらに詳細な設定ができる「リッチルール」を使います。
コマンドの構文が少し異なりますが、前述した内容とルールはほとんど同じです。

今回も設定前に、今現在の設定内容を確認しておきましょう。

# firewall-cmd --list-all --zone=gyoumu

gyoumu
  target: DROP
  icmp-block-inversion: no
  interfaces:
  sources:
  services: 
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

publicゾーンと比べると、targetDROPになっており、services欄も空欄になっていることが分かります。
では、ここに設定を追加していきたいと思います。

・sshの許可

# firewall-cmd --permanent --zone=gyoumu --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="ssh" accept'

要件には記載されていませんが、sshを許可しないとサーバへのssh接続が出来なくなってしまうので、使用する端末やサーバなど、ssh接続をする可能性があるIPアドレスは全て追加してください。

・NW機器からのUDP141の受信を許可

# firewall-cmd --permanent --zone=gyoumu --add-rich-rule='rule family="ipv4" source address="10.171.1.5" port protocol="udp" port="514" accept'

・内部セグメントとの通信をanyで許可

# firewall-cmd --permanent --zone=gyoumu --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" port protocol="tcp" port="0-65535" accept'
# firewall-cmd --permanent --zone=gyoumu --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" port protocol="udp" port="0-65535" accept'

anyという指定は出来ないので、特に制限したいポートがない場合は全てのポート(0-65535)を範囲指定します。
また、tcpudpも同時には指定できないので、それぞれでコマンドを実行します。

これで、要件通りの許可設定が完了しましたが、まだこのゾーンはどこのセグメントにも適用されていないので、最後に業務LAN(eth0)にgyoumuゾーンを適用していきます。

# nmcli con mod “System eth0” connection.zone gyoumu
  ※インターフェース名の指定方法は各自の環境で確認してください。

ゾーンはfirewall-cmdコマンドでも変更できますが、ゾーンの変更に関してのみ、前回の記事で紹介した--permanentオプションを付与しても恒久的な設定になりません。
そのため、恒久的な設定にするには、nmcliコマンドを用いて変更します。

また、上記のコマンドは、正常終了した場合でも特に何も表示されません。
このため、設定が正しく反映されたかは下記のコマンドで確認します。

# firewall-cmd --get-zone-of-interface=eth0
gyoumu

業務LAN(eth0)にgyoumuゾーンが適用されていることが分かりました。

・設定を反映させる

# firewall-cmd --reload

以上で設定は完了です。

変更後の設定内容を確認します。

# firewall-cmd --list-all --zone=gyoumu

gyoumu
  target: DROP
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: 
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
        rule family="ipv4" source address="192.168.0.0/24" servie name="ssh" accept
        rule family="ipv4" source address="10.171.1.5" port protocol="udp" port="514" accept
        rule family="ipv4" source address="192.168.0.0/24" port protocol="tcp" port="0-65535" accept
        rule family="ipv4" source address="192.168.0.0/24" port protocol="udp" port="0-65535" accept

interfaceseth0が追加され、リッチルールの欄にも設定が追加されたことが分かります。
以上で設定は完了!!…と思いましたが、ここで1つ問題が発生します。

それは、この状態だとpingが通らないという事です!!
ポートをanyで許可しているので関係ないと思っていましたが、pingにはICMPという全く別のプロトコルが使用されており、追加でICMPも許可しないとpingは通らないことが判明しました。(知らなかった)(これって一般常識ですか?笑)

そこで、使用するのが以下のコマンドになります!

・リッチルールを使用し、ICMPを許可したいIPアドレスを指定する場合

# firewall-cmd --permanent --zone=gyoumu --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" protocol value="icmp" accept'

再度リロードし、設定内容を確認すると、リッチルールの欄に以下が追加されていることが分かります。(※一部抜粋)

rule family="ipv4" source address="192.168.0.0/24" protocol value="icmp" accept

また、許可するIPアドレスなどは制限せず、ICMPは全て許可する場合は以下のコマンドになります。

# firewall-cmd --permanent --zone=gyoumu --add-protocol=icmp

この場合、設定を反映させると以下のようにプロトコル欄にicmpが追加されます。

protocols: icmp

これで無事にpingも通るようになりました!
セキュリティ的には許可しない方が良い場合もあるようですが、死活監視などでpingが必要な場合には場面に応じて許可しましょう。

===番外編==========================================
ちなみに、pingの許可には以下の方法もあります。
設定内容を確認したとき、icmp-block-inversionicmp-blocksという項目がありましたが、これはicmp-block-inversionyesの時にicmp-blocksに記載されたICMP Typeを受け入れ、
noの時はicmp-blocksに記載されたICMP Typeを拒否する、というものです。

デフォルトではnoに設定されており、icmp-blocksには何も記載されていませんが、この状態ではpingは許可されていません。(難しい…)
なので、pingに使用するICMP Typeだけを追加し、pingを許可してみたいと思います。

・まずは、icmp-block-inversionをyesに変更する

# firewall-cmd --add-icmp-block-inversion --zone=gyoumu

・pingで使用するICMP Typeを許可する
(使用できるICMP Typeの一覧はfirewall-cmd --get-icmptypesで取得できます)

# firewall-cmd --add-icmp-block=echo-reply --zone=gyoumu
# firewall-cmd --add-icmp-block=echo-request --zone=gyoumu

この方法でもpingを許可できる(はず)です!
ただ推奨はされていないかもしれないので、恒久的な設定はせず、一時的に設定を入れて試してみてください。
==================================================

ちなみに、設定を間違えたりして、追加した設定を削除したいなどの場合は、前述したコマンドの--addの部分を--removeに変更して実行し、追加した時と同様にまたリロードするだけです。

(例)

# firewall-cmd --zone=public --remove-service=http --permanent

これで皆さんも一通りfirewalldの設定ができるようになりましたね!!!
もし間違っている箇所があったらこっそり優しく教えてください…

それでは、皆さんも素敵なfirewalldライフを!!!!:relieved:

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1