本文へ移動
購読
GUIDE#security更新 2026.09.24

nmapで自社サーバーの開いているポートを棚卸しする:許可された範囲での使い方

nmapで自社サーバーの公開ポートを棚卸しする手順。スキャン許可の決め方、open・closed・filteredの読み方、ssとの突き合わせ、ndiffによる週1回の差分監査まで実行例付き。

level
中級
time
約30分
stack
nmap 7.94 / Ubuntu 24.04
author
@ryoma_t
// 前提条件
スキャン対象の管理権限、または書面の許可 / Linuxの基本操作 / sudoが使えること
nmapで自分のサーバーの全ポートを走査し、開いているSSHとHTTPのバージョンを-sVで確認したターミナル
画像:nagoya.dev(実際の画面・実行結果をもとに作成)

nmapとは、指定したホストのどのポートが通信を受け付けているかを外側から調べる、オープンソースのポートスキャナーです。サーバー上で ss -tlnp を実行すれば「待ち受けているポート」はわかりますが、ファイアウォールやクラウドのセキュリティグループを通過した先で「実際に届くポート」はわかりません。このずれを見つけることが、nmapを棚卸しに使う目的です。

対象にしてよいのは、自社が管理するサーバーと、書面で許可を得た範囲だけです。前半でスキャン範囲の決め方と結果の読み方を、後半で内側と外側の突き合わせ、ndiffを使った週1回の差分監査を扱います。実行例はUbuntu 24.04のnmap 7.94SVNで、手元の検証用コンテナに対して取得したものです。

この記事でわかること

  • スキャンしてよい範囲の決め方と、許可書に書いておく項目(CDN・共用サーバーの落とし穴を含む)
  • open・closed・filteredの違いと、SYNスキャンとconnectスキャンの使い分け
  • サーバー内側の ss と外側のnmapを突き合わせて、公開すべきでないポートを見つける手順
  • UDPとIPv6で見落としが起きる理由と、その確かめ方
  • ndiffで前回との差分を取り、週1回の定期監査にするスクリプト

ポートスキャンの前に、許可と範囲を決める

日本の法律に「ポートスキャン禁止」と書いた条文はありません。不正アクセス禁止法が主に処罰するのは、他人のID・パスワードを無断で使う行為や、脆弱性を突いてアクセス制御をすり抜ける行為で、ポートの開閉を調べるだけでは通常これに当たりません。ただし、許可のない相手へのスキャンは監視システムから攻撃の予兆として扱われ、プロバイダーやクラウド事業者に通報されて回線やアカウントを止められることがあります。古い機器を止めてしまえば、電子計算機損壊等業務妨害罪(刑法234条の2)が問題になる余地もあります。結論は単純で、管理権限を持つ機器と、書面で許可を得た範囲以外にはスキャンしません。

自社のサービスでも、IPアドレスの持ち主が自社とは限りません。次の4つは、事前に確認しないと第三者の設備をスキャンすることになります。

  • CDN・リバースプロキシ型のサービス:Cloudflareなどを通しているドメイン名を指定すると、スキャンされるのは事業者のエッジサーバーです。自社のオリジンサーバーのIPアドレスを直接指定します。
  • 共用レンタルサーバー:1つのIPアドレスを他の契約者と共有しているため、自社ドメインでも事業者の許可が要ります。
  • 保守契約のある機器:ベンダーが運用するUTMやVPN装置は、契約で検査の事前申請を求めていることがあります。
  • クラウド:主要なクラウドは契約者自身のリソースへの検査を認めつつ、負荷試験に当たる行為などを禁止しています。実施前に利用規約の該当箇所を読みます。

監視を外部のSOCやMDRに委託している場合は、実施日時と送信元IPアドレスを事前に伝えます。伝えずに実施すると、正規の棚卸しがインシデントとして報告され、夜間に担当者が呼び出されます。対象サーバーでfail2banやCrowdSecを動かしているなら、スキャン元のIPアドレスを実施期間だけ許可リストに入れておかないと、途中で遮断されて結果が「全部filtered」になります。

許可書(社内なら申請票で十分です)には、少なくとも次の項目を書いておくと、後から「どこまでやってよかったのか」で揉めません。以下は記入の例です。

項目記入例
対象203.0.113.10、203.0.113.11、2001:db8:10::10(本番Web 2台)
除外203.0.113.20(ベンダー保守のVPN装置)
期間と時間帯毎週月曜 3:15〜4:00
送信元198.51.100.7(監査用VPS)
手法TCP全ポート(毎秒300パケット以下)、開いていたポートのみ -sV、UDPは指定ポートのみ
中止条件応答遅延の通報、監視アラートの発生、対象機器の異常
連絡先実施者と、対象システムの管理者の携帯番号

対象の一覧はファイルにしておき、実行前に -sL(リストスキャン)で展開結果を確かめます。-sL は対象のアドレスを列挙するだけで、対象へはパケットを送りません。-n を付ければDNSの逆引きもしないので、完全に手元だけで範囲の誤記を見つけられます。CIDRの書き間違い(/24のつもりが/16)は、ここで件数を見れば気づきます。

terminal
$ printf '192.0.2.10\n192.0.2.0/30\n' > targets.txt
$ nmap -sL -n -iL targets.txt
Nmap scan report for 192.0.2.10
Nmap scan report for 192.0.2.0
Nmap scan report for 192.0.2.1
Nmap scan report for 192.0.2.2
Nmap scan report for 192.0.2.3
Nmap done: 5 IP addresses (0 hosts up) scanned in 0.00 seconds

インストールと、root権限で変わるスキャン方式

LinuxとmacOSはパッケージマネージャーで入ります。Windowsは公式サイトのインストーラーにパケット取得用のNpcapが同梱されており、GUI版のZenmapも一緒に入ります(執筆時点)。Ubuntu 24.04の標準リポジトリでは7.94SVNでした。

terminal
sudo apt install nmap        # Debian / Ubuntu
sudo dnf install nmap        # RHEL / Rocky / AlmaLinux
brew install nmap            # macOS(Homebrew)

nmap --version | head -1
# Nmap version 7.94SVN ( https://nmap.org )

同じコマンドでも、rootで実行するかどうかで送るパケットが変わります。rootならSYNスキャン(-sS)になり、SYNを送ってSYN/ACKが返ったらRSTで打ち切るので、TCPの接続は最後まで確立しません。一般ユーザーではOSの connect() を使うconnectスキャン(-sT)になり、3ウェイハンドシェイクを完了させるため、sshdなどアプリケーション側のログに接続記録が残ります。一般ユーザーで -sS を指定すると You requested a scan type which requires root privileges. と表示されて止まります。

方式オプション必要な権限相手側に残るもの使いどころ
SYNスキャン-sSroot(生ソケット)ファイアウォールやIDSのログ棚卸しの既定。速く、アプリのログを汚さない
connectスキャン-sT一般ユーザー上記に加え、アプリケーションの接続ログsudoが使えない環境、アプリ側で記録を残したいとき
UDPスキャン-sUrootファイアウォールのログDNS・NTP・SNMP・VPNなど、使っているUDPポートの確認

nmapの使い方:最初に試す3つのスキャン

本番に向ける前に、自分のPCや検証用のコンテナで 127.0.0.1 を相手に練習しておくと、出力の読み方を安全に覚えられます。次の例は、sshd(22番)とPythonの簡易Webサーバー(8080番)を動かした検証用コンテナで実行した結果です。-p- で1〜65535番のTCPポートをすべて調べ、--open で開いているものだけを表示しています。

terminal(検証用コンテナ)
$ nmap -p- --open 127.0.0.1
Starting Nmap 7.94SVN ( https://nmap.org ) at 2026-09-23 22:46 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000070s latency).
Not shown: 65533 closed tcp ports (reset)
PORT     STATE SERVICE
22/tcp   open  ssh
8080/tcp open  http-proxy

Nmap done: 1 IP address (1 host up) scanned in 1.18 seconds

$ nmap -sV -p 22,8080 127.0.0.1
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.19 (Ubuntu Linux; protocol 2.0)
8080/tcp open  http    SimpleHTTPServer 0.6 (Python 3.12.3)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

1回目の SERVICE 列の http-proxy は「8080番でよく使われるサービス名」を表示しているだけで、実際に何が動いているかは見ていません。2回目の -sV は実際にプロトコルのやり取りをして、OpenSSHのパッケージ版数やPythonのバージョンまで推定しています。Not shown: 65533 closed tcp ports (reset) は、残りのポートがRSTを返した(=ホストには届いたが何も待ち受けていない)という意味です。

許可を得た本番サーバーに対しては、次の順で進めます。引数なしの既定は「よく使われるTCPポートの上位1,000個」だけなので、上位に入らない番号で待ち受ける管理画面や監視エージェントは、-p- を付けないと見落とします。ポートの指定は -p 22,80,443(列挙)、-p 1-1024(範囲)、-p U:53,T:22(UDPとTCPの混在)の形で書けます。

terminal(監査用ホスト)
# 1. 既定:よく使われるTCP上位1,000ポート
sudo nmap 203.0.113.10

# 2. TCP全ポートを調べ、開いているものだけ表示
sudo nmap -p- --open 203.0.113.10

# 3. 2で開いていたポートのサービスとバージョンを推定
sudo nmap -sV -p 22,80,443 203.0.113.10

open・closed・filteredの読み方

状態の違いは「nmapが何を受け取ったか」で決まります。検証用のネットワークに対象コンテナを1台置き、22番と80番を待ち受け、3306番はnftablesで破棄、8443番は何も動かさない状態にしてスキャンすると、4つの状態がきれいに分かれました。--reason を付けると判断の根拠も表示されます。

terminal(検証用ネットワーク)
$ nmap -p 22,80,3306,8443 172.30.99.20
PORT     STATE    SERVICE
22/tcp   open     ssh
80/tcp   open     http
3306/tcp filtered mysql
8443/tcp closed   https-alt

$ nmap -p 3306 --reason 172.30.99.20
PORT     STATE    SERVICE REASON
3306/tcp filtered mysql   no-response
状態受け取った応答意味棚卸しでの扱い
openSYN/ACK(syn-ack)何かが待ち受けていて、外から届く台帳にある公開ポートか確認。なければ最優先で調査
closedRST(reset)ホストには届くが、待ち受けがないファイアウォールが既定で通している証拠。既定拒否に直す候補
filtered応答なし(no-response)またはICMPの到達不能途中で破棄されている意図した遮断なら問題なし。サーバー側で待ち受けているなら、ルール1行で露出する状態
open|filtered応答なし(主にUDP)開いているのか破棄されたのか区別できない-sV で再確認するか、サーバー内側の ss で判断

棚卸しで見落としやすいのはclosedです。「開いていないから安全」と読みがちですが、closedが大量に返るホストはファイアウォールが受信を既定で許可しているということで、誰かが新しいサービスを起動した瞬間にそのまま公開されます。公開サーバーの理想は、公開ポートがopen、それ以外がすべてfilteredになる状態です。

サーバー内側のssと、外側の結果を突き合わせる

サーバーにログインして sudo ss -tlnp(UDPも見るなら -tulnp)を実行し、待ち受けているポートとプロセスを一覧にします。次は、sshd、127.0.0.1だけで待ち受ける8080番、全アドレスで待ち受ける9000番を動かした検証環境での出力です。

terminal(対象サーバー)
$ sudo ss -tlnp
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      5          127.0.0.1:8080      0.0.0.0:*    users:(("python3",pid=3972,fd=3))
LISTEN 0      128          0.0.0.0:22        0.0.0.0:*    users:(("sshd",pid=3969,fd=3))
LISTEN 0      5            0.0.0.0:9000      0.0.0.0:*    users:(("python3",pid=3976,fd=3))
LISTEN 0      128             [::]:22           [::]:*    users:(("sshd",pid=3969,fd=4))

Local Address が 127.0.0.1 のものは外から届きません。0.0.0.0 と [::] は全インターフェースで待ち受けているので、外から届くかどうかはファイアウォール次第です。この一覧と外側からのnmapの結果を並べ、次の表で判定します。

ss(内側)nmap(外側)判定と対応
127.0.0.1で待ち受け見えない問題なし。DBや管理用APIはこの形が基本
0.0.0.0で待ち受けfilteredファイアウォールが守っている。外に出す必要がないなら、バインド先を127.0.0.1に変えて二重に守る
0.0.0.0で待ち受けopen公開の意図があるか台帳で確認。意図がなければ当日中に閉じる
一覧にないopenルーターやロードバランサーのポート転送、別ホストへのNATを疑う。Dockerで userland-proxy を無効にしている場合も、公開ポートが ss に現れない

「外側」をどこにするかで結果が変わります。社内LANから自社サーバーをスキャンすると、境界のファイアウォールを通らないのでホスト自身の設定しか見えません。インターネットからの見え方を知りたいなら、別のVPSやスマートフォンのテザリング回線など、社外の回線から実行します。Dockerで -p 8080:80 のように公開したポートは、ホストのufwの拒否設定を通らずに外から届くことがあり、この「社外からの確認」で初めて気づくことが多い項目です。

サービスのバージョンとTLS・SSHの設定を確かめる

-sV で得たバージョンは、パッチの当たり具合を確かめる手掛かりになります。たとえば OpenSSH 9.6p1 Ubuntu 3ubuntu13.19 と出れば、Ubuntuのパッケージ版数まで読めるので、配布元のセキュリティ情報と照らし合わせられます。ただしバナーは設定で隠したり書き換えたりできるため、あくまで推定です。確定はサーバー上の dpkg -l や rpm -q で行います。

NSE(Nmap Scripting Engine)のスクリプトを使うと、ポートの開閉より一歩踏み込んだ設定を確認できます。棚卸しで役に立つのは、TLSのバージョンと暗号スイートを等級付きで並べる ssl-enum-ciphers、SSHの鍵交換・暗号方式を列挙する ssh2-enum-algos、Webページのタイトルを取って「このポートで何が動いているか」を判別する http-title です。

terminal
sudo nmap --script ssl-enum-ciphers -p 443 203.0.113.10
sudo nmap --script ssh2-enum-algos -p 22 203.0.113.10
sudo nmap --script http-title -p 80,443,8080 203.0.113.10

# 検証環境でのssl-enum-ciphersの出力(抜粋)
|   TLSv1.3:
|     ciphers:
|       TLS_AKE_WITH_AES_128_GCM_SHA256 (ecdh_x25519) - A
|       TLS_AKE_WITH_AES_256_GCM_SHA384 (ecdh_x25519) - A
|     cipher preference: client
|_  least strength: A

least strength が A 以外なら、弱い暗号スイートを受け付けている証拠です。TLSv1.0 や TLSv1.1 の節が出てきたら、Webサーバーの設定で無効にします。スクリプトはカテゴリで絞れるので、許可書で明示していない限り --script "default and safe" の範囲にとどめ、brute・dos・exploit・intrusive のカテゴリは使いません。-A もOS推定とスクリプトをまとめて走らせる重い指定なので、本番の定期監査には向きません。

複合機、UPSの管理カード、工場の制御機器など組込み系の機器は、ポートスキャンだけで応答が止まることがあります。-sV は既定でTCP 9100〜9107番(プリンターの生データ受付)への問い合わせを避けますが、ポートを叩くこと自体は止めません。こうした機器は --exclude で対象から外すか、止まっても困らない時間帯に機器の管理者立ち会いで実施します。

UDPとIPv6を見落とさない

UDPは応答がないことが普通のプロトコルなので、「開いていて黙っている」のか「途中で捨てられた」のかを区別できません。閉じているポートはICMPのポート到達不能で知らせてきますが、OS側がこの送信回数を絞っているため、スキャンが遅くなります。検証環境で同じホスト上のコンテナに -sU --top-ports 100 を実行したところ、100ポートで57秒かかり、40ポートが open|filtered のまま判定できませんでした。

UDPは「上位何個」で流すより、実際に使っているポートだけを指定し、-sV でプロトコル固有の問い合わせを送って確定させるほうが速く正確です。DNS(53)、NTP(123)、SNMP(161)、IPsec(500・4500)、WireGuard(例:51820)あたりが典型です。

terminal
sudo nmap -sU -sV -p 53,123,161,500,4500,51820 203.0.113.10

# IPv6アドレスにも同じことをする
sudo nmap -6 -p- --open 2001:db8:10::10

IPv6は、サーバーにグローバルアドレスが自動で付いているのに、ファイアウォールのルールがIPv4にしか書かれていない、という形で穴になります。nftablesの入門ガイドで実測した例では、SSHを管理元に絞る否定形のルールがIPv4にしか効かず、IPv4ではfiltered、IPv6ではopenという結果になりました。ip -6 addr show scope global でアドレスがあるサーバーは、-6 でのスキャンを棚卸しの手順に必ず入れます。

ndiffで週1回の差分監査にする

1回きりのスキャンは、翌週に誰かがサービスを追加すれば古くなります。結果をXMLで残し、付属のndiffで前回との差分を取れば、「増えたポート」「消えたポート」だけを確認すれば済むようになります。Ubuntuではndiffは別パッケージなので、sudo apt install ndiff で入れます。

/usr/local/bin/port-audit.sh
#!/bin/sh
# /usr/local/bin/port-audit.sh — 許可済みの対象だけをスキャンし、前回との差分を残す
set -eu
DIR=/var/lib/port-audit
TARGETS=/etc/port-audit/targets.txt
TS=$(date +%Y%m%d-%H%M)
mkdir -p "$DIR"
nmap -Pn -sS -p- --max-rate 300 -iL "$TARGETS" -oA "$DIR/$TS" >/dev/null
if [ -f "$DIR/latest.xml" ]; then
  # ndiff は差分があると終了コード1を返すので、set -e で止まらないようにする
  ndiff "$DIR/latest.xml" "$DIR/$TS.xml" > "$DIR/$TS.diff" || true
  if grep -q '^[+-][0-9]' "$DIR/$TS.diff"; then
    logger -t port-audit "ポート構成に変化あり: $DIR/$TS.diff"
  fi
fi
ln -sf "$DIR/$TS.xml" "$DIR/latest.xml"

オプションの意図は次のとおりです。-Pn はpingに応答しないサーバーも対象として扱うため、--max-rate 300 は本番への負荷を抑えるための上限です。65,535ポートを毎秒300パケットで送ると1台あたり最短でも約220秒かかり、検証でも3分半ほどでした。台数が多いなら時間帯を分けます。-oA は通常形式(.nmap)、grep向け形式(.gnmap)、XML(.xml)の3つを同時に保存し、ndiffはXMLを比較します。grep -q '^[+-][0-9]' は、差分のうちポート番号で始まる行(増減したポート)だけを拾うための条件で、実行日時が違うだけのヘッダー行には反応しません。

/etc/cron.d/port-audit
# 毎週月曜 3:15 に実行(許可書の時間帯と合わせる)
15 3 * * 1 root /usr/local/bin/port-audit.sh

検証環境で、1回目のスキャンの後に9090番で新しいサービスを起動してから2回目を実行すると、差分ファイルには次のように記録されました。先頭が + の行が増えたもの、- の行が消えたものです。ndiffの終了コードは差分なしで0、差分ありで1なので、監視ツールに組み込むときはこの値でも判定できます。

/var/lib/port-audit/20260923-2337.diff
-Nmap 7.94SVN scan initiated Wed Sep 23 23:36:57 2026 as: nmap -Pn -sS -p 22,8080,9000,9090 --max-rate 300 -iL /etc/port-audit/targets.txt -oA /var/lib/port-audit/20260923-2336
+Nmap 7.94SVN scan initiated Wed Sep 23 23:37:59 2026 as: nmap -Pn -sS -p 22,8080,9000,9090 --max-rate 300 -iL /etc/port-audit/targets.txt -oA /var/lib/port-audit/20260923-2337

 localhost (127.0.0.1):
 PORT     STATE  SERVICE    VERSION
-9090/tcp closed zeus-admin
+9090/tcp open   zeus-admin

検証では時間短縮のためにポートを4つに絞っています。本番ではスクリプトのとおり -p- で実行してください。通知先は、logger で書いたsyslogを既存の監視やSIEMで拾うのが手軽です。差分が出たら、その週のうちに台帳と照合し、意図した変更なら台帳を更新、意図しない変更なら閉じる、のどちらかで必ず閉じます。

動作確認

定期監査を仕掛けたら、次の順で確認します。最初の2つはパケットを送らないので、いつ実行しても構いません。

terminal(監査用ホスト)
# バージョンと、対象ファイルの展開結果(パケットは送らない)
nmap --version | head -1
nmap -sL -n -iL /etc/port-audit/targets.txt | tail -1
# 例: Nmap done: 2 IP addresses (0 hosts up) scanned in 0.00 seconds

# 1ポートだけ、理由付きで確認(許可された時間帯に)
sudo nmap -p 22 --reason 203.0.113.10
# REASON 列に syn-ack と出れば、SYNが届いて応答が返っている

# スクリプトを手で1回実行し、成果物ができるか
sudo /usr/local/bin/port-audit.sh && ls /var/lib/port-audit
# 日時の付いた .nmap / .gnmap / .xml と latest.xml ができていればよい

# 2回目以降は差分と syslog を確認
sudo journalctl -t port-audit --since "7 days ago"

開いているポートの一覧だけを素早く見たいときは、grep向け形式を使います。grep -h -oE '[0-9]+/open/tcp//[^/]*' /var/lib/port-audit/*.gnmap | sort | uniq -c で「どのポートが何回の監査で開いていたか」が数えられ、一時的に開いたポートの洗い出しにも使えます。

つまずきポイント

「You requested a scan type which requires root privileges.」で止まる

-sS・-sU・-O は生ソケットを使うため、一般ユーザーでは実行できません。sudo を付けるか、TCPだけでよければ -sT に切り替えます。コンテナ内で実行している場合は、CAP_NET_RAW を外した設定になっていないかも確認します。

「Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn」

nmapはポートを調べる前に、ICMPや特定ポートへの問い合わせで「生きているか」を確かめます。サーバーやクラウドのファイアウォールがこれを捨てていると、動いているのに「down」と判定されてポートを1つも調べません。対象が稼働していることがわかっているなら -Pn を付けて生存確認を省きます。定期監査のスクリプトで最初から -Pn を付けているのはこのためです。

途中から全ポートがfilteredになる、実行するたびに結果が違う

対象側のfail2ban、CrowdSec、IPS、クラウドのDDoS対策がスキャン元を遮断した可能性が高い症状です。対象サーバーで sudo cscli decisions list や sudo fail2ban-client status を見て、スキャン元のIPアドレスが載っていれば解除し、実施期間だけ許可リストに入れます。遮断されていないのに揺れる場合は、--max-rate を100程度まで下げて、途中の機器のレート制限に引っかかっていないかを確かめます。

UDPスキャンがいつまでも終わらない

-sU -p- は、閉じたポートのICMP応答が絞られるため、1台で何時間もかかることがあります。実行中に任意のキーを押すと進捗率と終了見込み時刻が表示されるので、見込みが許可時間を超えるなら止めて、使っているUDPポートの指定に切り替えます。

よくある質問

ポートスキャンは違法ですか?

日本にはポートスキャンそのものを禁じる条文はありません。ただし許可のない相手へのスキャンは攻撃の予兆として通報され、プロバイダーやクラウドの規約違反で利用停止になることがあります。相手の機器を止めれば刑事責任を問われる余地もあるため、管理権限を持つ機器と、書面で許可を得た範囲以外は対象にしないでください。

Nmapでポート番号を指定するには?

-p で指定します。カンマ区切りで列挙、ハイフンで範囲、-p- で全65,535ポートです。UDPとTCPを同時に調べるときは、スキャン方式を両方指定したうえでポートの前に U: と T: を付けます。よく使われるポートだけなら --top-ports 100 のように個数で指定する方法もあります。

ポートスキャンでわかることは何ですか?

各ポートが接続を受け付けているか(open)、届くが待ち受けがないか(closed)、途中で破棄されているか(filtered)です。-sV を付ければ、待ち受けているソフトウェアの種類とバージョンも推定できます。脆弱性があるかどうかまではわからないので、バージョンを脆弱性管理の台帳と照合して判断します。

Nmapは何ができますか?

ホストの生存確認、TCP・UDPポートの状態確認、サービスとバージョンの推定、OSの推定、スクリプトによるTLS設定やSSHの暗号方式の確認などです。社内の棚卸しでは、ポートの状態とバージョンを定期的に記録し、付属のndiffで前回との差分を見る使い方が中心になります。

まとめ

nmapでの棚卸しは、スキャンの技術より先に「どこまでやってよいか」を文書にするところから始まります。そのうえでTCPは全ポート、UDPは使っているポートだけ、IPv6も忘れずに調べ、サーバー内側の ss と突き合わせて「待ち受けているのに外から届く」ものを潰します。closedが多いホストはファイアウォールが既定で許可している状態なので、ここも見逃さないでください。最後にndiffで週1回の差分監査にしておけば、公開ポートの台帳が実態から離れていくのを止められます。

次に読む

$ subscribe --weekly
毎週月曜、企業ITとホームラボの要点を5分で。