導入
「このサーバー、外からどのポートに入れる設定になっている?」を決めているのが、前レッスンの関所=ファイアウォールです。Linux で昔から使われてきたのが iptables。まずは今どんなルールが入っているかを 読む ところから始めます。設定を変える前に、現状を把握するのが鉄則です。
説明
iptables の操作には root 権限 が必要です。一般ユーザーのまま打つと、こう弾かれます(第5章の su/sudo の出番です)。
iptables -L
Permission denied (you must be root) と出たら、root に切り替えてからもう一度打ちます。
su -
iptables -L
今度はルールの一覧が出ます。filter テーブルの3つの チェイン(関所)が並びます。
INPUT… サーバーに 入ってくる 通信への関所OUTPUT… サーバーから 出ていく 通信への関所FORWARD… サーバーを 通り抜ける 通信への関所(ルーター用途)
各チェインの1行目 (policy ACCEPT) は、どのルールにも当てはまらなかったときの 既定の扱いです。INPUT の下には「22番(SSH)は通す・80番(HTTP)は通す・23番(telnet)は落とす」というルールが並んでいます。target の ACCEPT(通す)と DROP(黙って捨てる)に注目してください。
入ってきたパケットは、INPUT チェインのルールを 上から順に 照合され、最初に当たったルールで運命が決まります。どれにも当たらなければ、最後に policy が適用されます。
flowchart TD
P["入ってくるパケット"] --> R1{"22番 (SSH)?"}
R1 -->|一致| A1["ACCEPT<br/>(通す)"]
R1 -->|不一致| R2{"80番 (HTTP)?"}
R2 -->|一致| A2["ACCEPT<br/>(通す)"]
R2 -->|不一致| R3{"23番 (telnet)?"}
R3 -->|一致| D1["DROP<br/>(捨てる)"]
R3 -->|不一致| PL["policy ACCEPT<br/>(既定の扱い)"]
番号付きで見たいときは --line-numbers、名前解決せず数字で見たいときは -n を足します(ping・ss と同じ感覚です)。
iptables -L INPUT --line-numbers
iptables -L -n
iptablesは歴史ある道具ですが、いまのディストリビューションでは後継の nftables(nftコマンド)や、その上位の firewalld・ufw が主流になりつつあります。ただし現場にはまだiptablesの記法があふれているので、読めることがまず大事です(netstatとssの関係に似ています)。
やってみよう
まず iptables -L をそのまま打って、root でないと弾かれることを体感しましょう。su - で root に切り替えてから iptables -L を打ち、INPUT チェインに 22・80・23 のルールが並ぶことを確認してください。iptables -L INPUT --line-numbers で各ルールに番号が振られること、iptables -L -n で anywhere が 0.0.0.0/0 と数字表記になることも見てみましょう。
演習
root に切り替えたうえで、ファイアウォールの全ルールを一覧表示してください。
ヒント1を見る
先に su - で root になります。一覧は list の頭文字 -L です。
ヒント2を見る
su - のあと iptables -L