プロキシ環境下でのNmapの挙動について
クラウドプロキシを利用している場合、PCの全通信はクラウドプロキシを経由する。
しかし、クラウドプロキシでもL7以上の通信しか見てないものがある。そういった場合にNmapを対象マシンへ実行すると結果はFillteredとなる。
これを仮想環境で検証した。
検証
検証するために、Squidを構築。
sudo apt update
sudo apt install squid
squid.conf の最低限設定を先頭に追加
以下のような設定にしたが、なんでもよさそう。
http_port 0.0.0.0:3128
# 送信元ネットワーク定義
acl localnet src 192.168.1.0/24
# 許可ポート定義
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
# 不正ポート拒否
http_access deny !Safe_ports
# CONNECTは443のみ許可
http_access allow CONNECT SSL_ports
# ローカルネット許可
http_access allow localnet
# それ以外拒否
http_access deny all
or
http_port 3128
acl localnet src 192.168.1.0/24
http_access allow localnet
http_access deny all
再起動
sudo systemctl restart squid
メインのLinuxとは別にサーバが8000portで起動している。通常ここへポートスキャンするとopenとなる。
以降はLinuxの設定である。
linuxから発生する通信をすべてSquidが起動している3128portへ転送
sudo iptables -t nat -A OUTPUT -p tcp ! --dport 3128 -j REDIRECT --to-ports 3128
sudo iptables -t nat -L -n -v
3128に来たパケットを監視
sudo tcpdump -i lo tcp port 3128
Nmap -p8000 -sTを実行した場合
01:18:02.700688 IP 192.168.56.104.50110 > localhost.3128: Flags [S], seq 1563469929, win 64240, options [mss 1460,sackOK,TS val 3581473456 ecr 0,nop,wscale 7], length 0
01:18:02.700717 IP 192.168.56.104.50110 > localhost.3128: Flags [.], ack 1250065234, win 502, options [nop,nop,TS val 3581473456 ecr 3611903104], length 0
01:18:02.700818 IP 192.168.56.104.50110 > localhost.3128: Flags [R.], seq 0, ack 1, win 502, options [nop,nop,TS val 3581473456 ecr 3611903104], length 0
応答がある。
Nmap -p8000 -sSの場合
01:20:25.387159 IP 192.168.56.104.39984 > localhost.3128: Flags [S], seq 3335946457, win 1024, options [mss 1460], length 0
01:20:25.387220 IP 192.168.56.104.39984 > localhost.3128: Flags [R], seq 3335946458, win 0, length 0
01:20:25.487405 IP 192.168.56.104.39986 > localhost.3128: Flags [S], seq 3335815387, win 1024, options [mss 1460], length 0
01:20:25.487437 IP 192.168.56.104.39986 > localhost.3128: Flags [R], seq 3335815388, win 0, length 0
となり、応答がない。
それぞれのNmapの結果は以下である。
TCPConnctの場合はOpenとなるが、SYNスキャンではFillteredとなっている。
おまけ
FW設定コマンド
nftables を完全リセット
sudo nft flush ruleset
確認
sudo nft list ruleset
サーバ側のFWで通信をドロップさせても同様の現象(Nmap=filltered)が起きる。以下は80,443以外の通信をドロップさせるものである。ネットワーク層の話ではなくポートレベルの話になりそうなので、若干プロキシの話とはずれている。
# 既存通信
sudo iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 80/443のみ許可
sudo iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
# 最後にDROP
sudo iptables -A OUTPUT -j DROP
■ FORWARD も同様
sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
sudo iptables -A FORWARD -p tcp --dport 443 -j ACCEPT
sudo iptables -A FORWARD -j DROP
次に以下を実行。
sudo iptables -P INPUT DROP
sudo iptables -F INPUT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
-sS, -sT両方ともFillteredになった。
└─$ sudo nmap -sS -p80,443,4444,8000 192.168.56.104
Starting Nmap 7.94SVN ( https://nmap.org ) at 2026-02-21 01:48 EST
Nmap scan report for 192.168.56.104
Host is up (0.00082s latency).
PORT STATE SERVICE
80/tcp open http
443/tcp open https
4444/tcp filtered krb524
8000/tcp filtered http-alt

