Skip to main content
CID222 Docs

Inline proxy and ICAP problems

Callers the inspection endpoint refuses, source addresses that are not what they look like, and a proxy CA that will not download.

  • Version: 0.4
  • Role: admin_user
  • Type: troubleshooting

Inspection fails in two places: admission (may this caller talk to the listener?) and content (can this request be inspected at all?). Both produce refusals that read like faults.

Note

The ICAP listener cannot authenticate its peer. No SWG product CID integrates with offers a credential or custom-header field, so admission is by address alone, and an admitted peer is believed down to the user it claims. Treat the source-IP allowlist as the only control there — and read the next section before trusting it.

Find your symptom

What you seeRunbook
The SWG gets 401 or 403 from the inspection endpointThe inspection endpoint refuses the caller
Every caller arrives as the same docker bridge addressSource addresses are not what they look like
An allowlist admits every caller, or noneSource addresses are not what they look like
The CA download fails, or clients warn on every intercepted siteThe proxy CA is not available
A large or chunked upload is refused as not inspectedChunked uploads are refused, not inspected

Admission

The inspection endpoint refuses the caller

Admission is evaluated in a fixed order: an mTLS requirement first, then a bearer API key, then network position. A key that resolves to no tenant is refused outright rather than treated as no key — otherwise a key holder could attribute records to any tenant they named.

Note

allowed_source_ips and mtls_subject_dn were written, displayed and read by nothing until 2026-08-29. Because a value set before then was never applied, the upgrade clears both and records the previous values in the event log — a first unattended application could otherwise have 403'd every caller. Re-enter them deliberately.

Runbookinline-proxy

The inspection endpoint refuses the proxy or gateway calling it

You might see: Client certificate required · API key required · Invalid API key · Internal API only

Before you start

Checks

  1. 1

    Read whether this deployment mandates a client certificate

    expected · Either no DN is required, or the caller presents a certificate matching it.

  2. 2

    Read whether the caller presents a gateway API key

    expected · The caller sends `Bearer cid_key_…` and the key resolves.

  3. 3

    Check whether the call arrives through a reverse proxy

    expected · Either the caller presents a key, or it reaches the listener directly from an internal address.

  4. 4

    Before trusting any source-IP control, check what address the caller actually arrives as

    expected · Callers arrive with their own addresses.

Source addresses are not what they look like

Lab-measured: two SWG virtual machines beside CID222 both arrived at the listener as the same docker bridge address. The cause is the source network's own NAT, not CID and not Docker's userland proxy. On a physical LAN the address survives and the allowlist works — this is a property of same-host VM labs.

The listener detects the condition and logs it once. Read that log before trusting any source-IP control.

Runbookinline-proxy

Every ICAP caller arrives as the same docker bridge address

You might see: every SWG appears as 172.19.0.1 · the ICAP source-IP allowlist does not distinguish our proxies · allowed_source_ips has no effect · the allowlist blocked every caller after we set it

Before you start

Checks

  1. 1

    Read how the ICAP listener admits callers

    diagnostics · posture.inspectionSourceIpMode = "unrestricted"

  2. 2

    Check whether callers arrive with their own addresses or with the container bridge address

    expected · The recorded source address is the gateway's own address.

  3. 3

    When an explicit allowlist is set, verify it lists every caller that must be admitted

    expected · Every caller is listed.

The proxy itself

The proxy CA is not available

The forward proxy is opt-in and its CA lives in its own state. Recreating the container with a fresh volume generates a new CA, and every client that trusted the old one must be given the new one — old trust does not transfer.

Runbookinline-proxy

The inline proxy's CA or helper download is not available

You might see: CA not available. Is cid-inline-proxy running? · Unsupported format · dc-agent.ps1 not bundled in this build · the CA download button returns an error

Before you start

Checks

  1. 1

    Read the container state for the inline proxy

    expected · state is running.

  2. 2

    Check whether the proxy has generated its CA yet

    expected · The proxy has completed a first start and holds a CA.

  3. 3

    For an "Unsupported format" refusal, read which format was asked for

    expected · The format is one of the offered ones.

  4. 4

    For the domain-controller helper script, check whether this build ships it

    expected · The build carries the helper.

Content

Chunked uploads are refused, not inspected

No path buffers across requests, so a chunked or resumable upload cannot be inspected. Since 2026-08-29 all three paths refuse them by default (CID_RESUMABLE_UPLOAD_POLICY on ICAP and the forward proxy; the extension honours its fail-closed setting and records a visible "not inspected" event) rather than passing them through.

Reassembly — buffer by upload id, inspect at finalize, re-fragment — is not implemented, so a user sending a large file gets a refusal rather than a redaction. That is the fail-closed choice working, not a fault.

Runbookperformance

A file is refused, or its analysis fails

You might see: No file uploaded (expected multipart field "file") · Image size exceeds maximum allowed size of 10MB · Unsupported file type. Upload a PDF, DOCX or TXT. · legacy and macro-enabled spreadsheet formats cannot be safely redacted

Before you start

Checks

  1. 1

    Read whether the format is one the product accepts at all

    expected · The format is accepted on that surface.

  2. 2

    Read the size limit for that surface

    expected · The file is under the limit named in the message.

  3. 3

    Check whether the client was doing a chunked or resumable upload

    diagnostics · posture.resumableUploadPolicy = "block"

  4. 4

    Read whether document analysis is switched on for this deployment

    expected · The service is enabled.

  5. 5

    Read the document parser's own health

    diagnostics · services[document-parser].healthy = true

Last updated on

On this page

Download PDF