barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

среда, 9 сентября 2026 г.

Claude Code network sandboxing и доступ на localhost

Проблема

У меня на localhost:2746 поднят http сервер. Есть Claude Code, запускаемый со включенной песочницей, включая network-песочницу. В настройках указан localhost и 127.0.0.1 как разрешенные хосты:

            "network": {
                "allowedDomains": ["127.0.0.1", "localhost"],
                "allowManagedDomainsOnly": True,
                "strictAllowlist": True,
            },

Однако, клод не может сделать curl на http://localhost:2746, падает "Could not connect to server".

Причина

См. баг https://github.com/anthropics/claude-code/issues/28018. Сетевая изоляция песочницы заключается в том, что весь HTTP(S) траффик должен идти через проксю, поднимаемую на порту 3128. Это прокся автоматически подставляется в переменные HTTP_PROXY/HTTPS_PROXY внутри песочницы. Однако, localhost и 127.0.0.1 также автоматически подставляются в NO_PROXY, что предписывает на localhost ходить напрямую, в обход прокси. И такое прямое подключение не работает.

Решение

Проинструктировать Claude Code сбрасывать NO_PROXY перед выполнением сетевого вызова на localhost, т.к. вот такой вызов из песочницы проходит:

NO_PROXY="" no_proxy="" curl -s http://127.0.0.1:2746/health

Либо для локальных сервисов, которые должны быть видны из песочницы, использовать альтернативный loopback адрес, скажем, 127.0.0.2.

пятница, 9 января 2026 г.

Настройка mitmweb для учета HTTPS_PROXY и NO_PROXY

Задача

Нужно настроить mitmweb так, чтобы он перенаправлял исходящие запросы на другой прокси (корпоративный), учитывая HTTPS_PROXY и NO_PROXY переменные окружения.

Решение

Создаем py-скрипт для обработки NO_PROXY, называем его exclude_proxy.py:

import os

from mitmproxy import http


# Read the exclusions from the NO_PROXY environment variable

# Split the environment variable by commas to handle multiple hostnames

NO_PROXY = os.getenv("NO_PROXY", "").split(",")


def request(flow: http.HTTPFlow):

    # Check if the hostname matches any entry in NO_PROXY

    for hostname in NO_PROXY:

        # Ensure no leading/trailing whitespace in the hostname

        hostname = hostname.strip()

        # If the flow's request host matches an entry in NO_PROXY, bypass the proxy

        if hostname and hostname in flow.request.host:

            flow.server_conn.via = None

Запускаем mitmweb:

mitmweb --mode upstream:$HTTPS_PROXY -s exclude_proxy.py