Watching HTTP Traffic from n8n with mitmproxy

Console logging and error messages in n8n sometimes include very little useful information for troubleshooting http requests that a workflow sends to one of the integrated services. Fortunately, most (if not all) of the http requests n8n sends, use Axios, and Axios can be configured with environment variables to use a proxy for http and/or https. Then, mitmproxy can be run in a docker container to forward those requests and capture/display the details in an easy-to-use web UI. Prerequisites n8n running in Docker, preferably started using docker-compose Goal Set up mitmproxy to run in Docker, and configure n8n to use mitmproxy for http/http requests. Steps (overview) Set up mitmproxy to run in docker (using docker compose) Adjust the runtime configuration (docker-compose.yml) of n8n to include environment variables that instruct Axios to use mitmproxy. mitmproxy docker-compose.yml This docker-compose.yml file was adapted from this example, but... The DNS parts were removed The networks were adjusted to actual RFC 1918 private networks. 172.201.. and 172.202.. overlap public, "real" address ranges and are blocked by default in mitmproxy. Some other adjustments (e.g. tty: true) were made so that the current Python-based mitmproxy code will start correctly in the docker container. A default password is specified for the mitmproxy web UI so it won't be necessary to watch the console for a generated password. docker-compose.yaml services: mitmproxy: image: mitmproxy/mitmproxy hostname: mitmproxy restart: always tty: true volumes: - ./mitmproxy_data:/home/mitmproxy/.mitmproxy # - './cert:/root/.mitmproxy' entrypoint: mitmweb command: '--web-host 0.0.0.0 -m regular@80 -m regular@443 --set web_password=changeme123' networks: mitm_internal: ipv4_address: 192.168.115.80 mitm_external: ipv4_address: 192.168.116.80 ports: - '38080:80/tcp' - '38443:443/tcp' - '38081:8081/tcp' networks: mitm_internal: name: mitm_internal internal: true ipam: driver: default config: - subnet: 192.168.115.0/24 gateway: 192.168.115.1 mitm_external: name: mitm_external ipam: driver: default config: - subnet: 192.168.116.0/24 gateway: 192.168.116.1 Adjustments to the n8n docker-compose.yml Add the docker network to the n8n service/container services: n8n: ... networks: - mitm_external ... networks: mitm_external: external: true Add environment variables to tell Axios to use mitmproxy Note: These are not n8n environment variables, but are used directly by the [Axios] npm library/module. Note: https requests could also be routed through the https listener on mitmproxy, but that potentially introduces certificate related issues. services: n8n: ... environment: ... - "HTTPS_PROXY=http://mitmproxy:80" - "HTTP_PROXY=http://mitmproxy:80" Using mitmproxy with n8n After starting the mitmproxy container and restarting the n8n container to pick up changes to networks and environment variables... Open the n8n editor to a workflow which sends out http/s requests. Open the mitmproxy web UI in another browser or browser-tab. Log in with the web_password specified in the mitmproxy docker-compose.yml ("changeme123" if you didn't modify it). Execute the workflow (or http based workflow step), and the mitmproxy web UI should begin showing the requests as they are sent. Click on one of the request items to see details about the request, response, connection, etc. Links https://mitmproxy.org https://hub.docker.com/r/mitmproxy/mitmproxy/

Apr 22, 2025 - 17:24
 0
Watching HTTP Traffic from n8n with mitmproxy

Console logging and error messages in n8n sometimes include very little useful information for troubleshooting http requests that a workflow sends to one of the integrated services. Fortunately, most (if not all) of the http requests n8n sends, use Axios, and Axios can be configured with environment variables to use a proxy for http and/or https. Then, mitmproxy can be run in a docker container to forward those requests and capture/display the details in an easy-to-use web UI.

Prerequisites

  • n8n running in Docker, preferably started using docker-compose

Goal

Set up mitmproxy to run in Docker, and configure n8n to use mitmproxy for http/http requests.

Steps (overview)

  • Set up mitmproxy to run in docker (using docker compose)
  • Adjust the runtime configuration (docker-compose.yml) of n8n to include environment variables that instruct Axios to use mitmproxy.

mitmproxy docker-compose.yml

This docker-compose.yml file was adapted from this example, but...

  • The DNS parts were removed
  • The networks were adjusted to actual RFC 1918 private networks.
    • 172.201.. and 172.202.. overlap public, "real" address ranges and are blocked by default in mitmproxy.
  • Some other adjustments (e.g. tty: true) were made so that the current Python-based mitmproxy code will start correctly in the docker container.
  • A default password is specified for the mitmproxy web UI so it won't be necessary to watch the console for a generated password.

docker-compose.yaml

services:
  mitmproxy:
    image: mitmproxy/mitmproxy
    hostname: mitmproxy
    restart: always
    tty: true
    volumes:
      - ./mitmproxy_data:/home/mitmproxy/.mitmproxy
      # - './cert:/root/.mitmproxy'
    entrypoint: mitmweb
    command: '--web-host 0.0.0.0 -m regular@80 -m regular@443 --set web_password=changeme123'
    networks:
      mitm_internal:
        ipv4_address: 192.168.115.80
      mitm_external:
        ipv4_address: 192.168.116.80
    ports:
      - '38080:80/tcp'
      - '38443:443/tcp'
      - '38081:8081/tcp'

networks:
  mitm_internal:
    name: mitm_internal
    internal: true
    ipam:
      driver: default
      config:
        - subnet: 192.168.115.0/24
          gateway: 192.168.115.1
  mitm_external:
    name: mitm_external
    ipam:
      driver: default
      config:
        - subnet: 192.168.116.0/24
          gateway: 192.168.116.1

Adjustments to the n8n docker-compose.yml

  • Add the docker network to the n8n service/container
services:
  n8n:
    ...
    networks:
      - mitm_external
...
networks:
  mitm_external:
    external: true
  • Add environment variables to tell Axios to use mitmproxy
    • Note: These are not n8n environment variables, but are used directly by the [Axios] npm library/module.
    • Note: https requests could also be routed through the https listener on mitmproxy, but that potentially introduces certificate related issues.
services:
  n8n:
    ...
    environment:
      ...
      - "HTTPS_PROXY=http://mitmproxy:80"
      - "HTTP_PROXY=http://mitmproxy:80"

Using mitmproxy with n8n

After starting the mitmproxy container and restarting the n8n container to pick up changes to networks and environment variables...

  • Open the n8n editor to a workflow which sends out http/s requests.
  • Open the mitmproxy web UI in another browser or browser-tab.
    • Log in with the web_password specified in the mitmproxy docker-compose.yml ("changeme123" if you didn't modify it).
  • Execute the workflow (or http based workflow step), and the mitmproxy web UI should begin showing the requests as they are sent.
  • Click on one of the request items to see details about the request, response, connection, etc.

Links