firewalldの最も簡単な説明を目指す

2022年10月12日

IT業界の人はどうしてこう平易な説明ができないのかと思う。どこを見ても初心者にはちんぷんかんぷんな説明しか出てこない。ここでは宇宙一簡単な説明を試みてみる。

そもそもファイアーウォールとは

コンピュータの中には様々なプログラムが動作しており、各プログラムのあいだ、あるいは外部とのあいだで通信を行う必要がある。その目的で良く使われるのが、ポートというものだ。

ポート(port)というのは港のことだが、日本国を一つのコンピュータとしてみなすと、各県という各プログラムが他とのやりとりをする出入り口をポートと考えてみる。国内に基本的に悪い人はいないので、各県のあいだでは自由に行き来を可能にする。

つまり、港あるいは関所は国内では素通しである。

なお、ポートには一つの国において一意の番号がつけられており、「この番号は、どういう役割の港にのみ使う」と決められている番号もあれば、何の目的にも自由に使って良い番号もある。

例えば、22番はSSHというプロトコルに使うと決まっており、これは、暗号化された通信で、通常はパスワードや暗号キーが無いと全くやりとりができない。あるいは、80番はウェブサービスに使われ、どこからでも何らかのリクエストをすれば、何らかの返答が返ってくるのが普通だ。

さて、この日本国はネットワークインターフェースが無い限り完全な鎖国状態だ。つまり、このコンピュータはインターネットに接続されていないので、発信も受信もできない。海外とやりとりするには、ネットワーク・インターフェースカード(NIC)が必要だ。

たいていのパソコンには一つのNICがついている。このパソコンは、ここを通って海外の情報を見に行けるのだが、しかし、逆に国内の情報を勝手に見られてはこまる。

最も厳しくする場合には、外からのアクセスを全部禁止する。内側から外へのアクセスだけで、外から何かしらしようとしても一切を受け付けない。これがファイアウォールの役割である。

しかし、このコンピュータがウェブサーバだった場合、少なくとも80番(そして現代では443番)を開けてあげる必要がある。でないと、ウェブサーバの意味がなくなってしまう。外からは何もアクセスできないのだから。

そして、例えば、このコンピュータを外部からメンテナンスするためには、先の22番という通信路を開けてあげ、パスワードか暗号キーを持っている者にだけアクセスを許したりする。

こんな風にファイアウォールは、単純にそのコンピュータを守っているのではなく、「必要なポート(港)を海外に対して開放してあげる」という役割がある。

そして、昔のファイアウォールといえば、NICごとに設定を行っていた。普通のパソコンは、NICが一つだけのケースが多いだろうが、例えば、社内で使っているサーバマシンを外向けのウェブサーバとしても使い、内向けのファイルサーバとして使うとした場合、インターネットにつながっていて外からアクセスできるNICと、社内LANにしかつながっていないNICの二つがあることになる。

このそれぞれのNICのファイアウォールの設定は当然異なる。外はどんな奴がいるかわからないので、極力安全な設定にするが、社員が全員信用できるなら社内向けには完全に開放してしまっても良いだろう。どんなポート番号であっても、素通しの設定にするなどである。

例えていえば、同盟国には易しいファイアウォール、敵国あるいは不審な国には厳しいファイアウォールということだ。

つまり、ファイアウォールには、NICごとに異なる設定にする役割がある。これを以前はiptablesというプログラムが行っていた。このNICはどうする、あのNICはどうすると設定するわけだ。

firewalldの役割

さて、こんな風に複数のNICをつけて、あちこちに接続する(あちこちから接続される)ようになると、NICごとにファイアウォール設定をしなくてはならないことが面倒になってきた。そこで現れたのがゾーンという概念で、例えば、A国との通信専用NIC、B国との通信専用NICを設けた場合、A国とB国は同等なので、それらのNICは同じ設定にしたい。そこで、A国用NICとB国用NICを同じゾーンとして、そのゾーンに設定を行うと両者のNIC共に同じ設定になるようにした。

こんな風にして、ゾーンという仮想的な概念に対してファイアウォール設定を行い、それとは別に、そのゾーンにどのNICを入れるかという設定をつけたわけだ。

仮想的なNIC

一つのコンピュータにそんなにNICをつけるのか!と突っ込まれるかもしれないが、これは何も物理的なNICだけではないのである。

例えば、Virtual Private Network(VPN)を構成した場合、仮想的なNICが現れるし、Dockerなどを使った場合も仮想的なNICが作られる。

プログラムからはNICとして扱われるのだが、実際にはネットワーク・インターフェース「カード」ではない。単に通信経路として現れるだけだ。

それらもまた、ファイアウォールの設定対象となるのである。

既にあるゾーン

firewalldには既に9のゾーンが定義されているのだが、すべてを使う必要は全くないし、各ゾーンのファイアウォール設定を変更することもできるし、全く新たなゾーンを作ることもできる。

この9つのゾーンは以下である。Linux Firewalld を一から完全に理解するより。

具体的に各ゾーンでどんなポートを開いているかは以下である。【丁寧解説】Linuxのファイアウォール firewalld の使い方から引用する。

  • drop 全てのパケットを破棄する。内部から外部へのパケットは許可されるが、返信されてきたパケットも破棄してしまうので実質的に通信不可となる。
  • block 外部からのパケットは基本的に破棄される。内部からの通信パケットの返信は許可されるようになっている。
  • public デフォルトでは「ssh」と「dhcpv6-client」のみ許可されている。
  • external デフォルトでは「ssh」のみ許可される。ipマスカレードが有効になる。
  • dmz デフォルトでは「ssh」のみ許可されている。
  • work デフォルトでは「dhcpv6-client」と「ipp-client」、「 ssh」が許可される。
  • home デフォルトでは「dhcpv6-client」と「ipp-client」と「mdns」と「samba-client」、「ssh」が許可される。
  • internal デフォルトでは「dhcpv6-client」と「ipp-client」と「mdns」と「samba-client」、「ssh」が許可される。
  • trusted 全てのパケットが許可される。

このうち重要なのは、block, public, trustedかと思われる。

block

もしノートパソコンにfirewalldの機能が備わっていたとすれば(Windowsマシンであれば、Windowsファイアウォールなどなのでfirewalldは無いのだが)、blockを選択することだろう。外からの通信はすべて廃棄するが、内側からの外への通信、およびその返信はすべて通す。

dropを選択してしてしまうと、返信も到達しないので、何の通信もできなくなる。

public

これは、外部に公開しているサーバ等の基本設定となる。誰かいるのかわからないインターネットに接続しているので(つまり、危険な国とのやりとりをするので)、パスワードや暗号キーを持っている「スパイ」だけが通信できることになる。

あるいは、どの国でも見ていい情報のために、80番、443番を開放するkともある。

trusted

これは、信頼できる人たちのネットワークに接続しているNICに適用できる。すべての通信を完全に許す。

公開サーバのユースケース

例えば、ネット上に何らかのサーバマシンを借りて、そこでウェブサーバを運営し、その一方で、VPNを構成して手元のPCから自由な通信をしたいとする。この場合、サーバマシンの外部と接続している物理的なNICと、VPNを構成した場合の仮想的なNICの二つの構成になると思うが、その場合、以下の設定になるだろう。

  • publicゾーンにてウェブサイトの80や443を開放するように変更し、物理的NICはここに属させる。
  • trustedゾーンにVPNの仮想的NICを属させる。このVPNに所属する、例えば手元のPCは、サーバ側に自由にアクセスできる。

実際の操作

上の公開サーバのユースケースを実現するべくコマンドを叩いてみるが、次の記事とする。

firewalldの最も簡単な説明を目指す、その2に続く。

未分類

Posted by ysugimura