curlは通らないがncは通る時の原因

  • URLをコピーしました!

「nc -vz では接続できるのに curl だと失敗する」
「ポート疎通はOKなのにHTTP通信だけNG」
「curlだけ timeout / reset される」

この現象は非常に実務で多く、しかも ネットワーク担当・アプリ担当で認識がズレやすい典型トラブルです。

本記事では、 なぜ nc は通るのに curl は通らないのかを構造的に整理し、 そのまま実行できる切り分け手順と具体的対策を解説します。

目次

まず結論:ncとcurlは「確認しているレイヤ」が違う

ツール確認内容
ncTCP接続できるか(L4)
curlTCP + HTTP/HTTPS通信(L7)

つまり、

  • ncが通る → TCP接続は可能
  • curlが失敗 → HTTP/HTTPSレイヤの問題

「通信できているように見えて、実はアプリ層で拒否されている」 のが正体です。

① HTTP/HTTPSサービス自体が起動していない

ポートはLISTENしているが、 HTTPを処理するアプリが動いていないケースです。

# ポートLISTEN確認
ss -lntp | grep 80
ss -lntp | grep 443

典型例

  • 別プロセスがポートを掴んでいる
  • ミドルウェアが異常状態

対策

  • プロセス名・PIDを確認
  • systemdステータス確認
systemctl status nginx
systemctl status httpd

② HTTPS証明書エラー(curlは厳密、ncは無関係)

HTTPSでは証明書検証が行われます。

curl https://example.com

よくあるエラー

  • 自己署名証明書
  • 期限切れ証明書
  • 中間証明書不足

確認方法

curl -v https://example.com

対策

  • 正しい証明書チェーンを設定
  • 一時確認なら -k(検証無効)
curl -k https://example.com

③ Hostヘッダ不一致(バーチャルホスト問題)

WebサーバはHostヘッダで振り分けします。

curl http://IPアドレス

↑ IP直打ちは想定外のVirtualHostに入ることがあります。

対策

# Hostヘッダを明示
curl -H "Host: example.com" http://IPアドレス

④ HTTPメソッド制限(GET以外拒否)

curlはデフォルトでGETですが、 設定によって拒否される場合があります。

確認

curl -v -X GET http://example.com

対策

  • Webサーバ設定で許可メソッド確認

⑤ LB / WAF によるHTTPレベル遮断

LBやWAFはHTTP内容を見て遮断します。

典型例

  • User-Agent制限
  • 特定ヘッダ未指定で拒否
  • HTTP/1.0拒否

確認

curl -v -A "Mozilla/5.0" http://example.com

対策

  • LB/WAFログ確認
  • User-Agent指定

⑥ HTTPレスポンスサイズ・タイムアウト問題

ncは接続確認だけなので影響を受けません。

典型例

  • バックエンド応答が遅い
  • LB idle timeout切れ

確認

curl -v --max-time 5 http://example.com

対策

  • LB idle timeoutとKeepAlive見直し

⑦ SELinuxがHTTP通信だけ拒否している

SELinuxはポート × プロセスで制御します。

確認

ausearch -m AVC -ts recent

対策

# HTTPポート許可
semanage port -l | grep http

即解決用 切り分けフロー

  1. ncでTCP接続確認
  2. curl -v で詳細確認
  3. 証明書・Hostヘッダ確認
  4. LB/WAFログ確認
  5. アプリログ確認

まとめ

「ncは通るがcurlは通らない」場合、

  • TCPは問題ない
  • HTTP/HTTPS層に原因がある

curl -v を起点に、HTTPレイヤで何が拒否されているかを追えば、 必ず原因に辿り着けます。

目次