no_proxy vergleicht Namen, keine Adressen - NPM_API_HOST

Der Kern des Problems, und die Stelle, an der man am laengsten sucht:
"no_proxy=localhost" deckt eine Anfrage an 127.0.0.1 NICHT ab, und
umgekehrt genauso wenig. An curl 7.88 nachgemessen:

  no_proxy      an 127.0.0.1      an localhost
  localhost     ueber den Proxy   direkt
  127.0.0.1     direkt            ueber den Proxy

In Firmennetzen steht oft nur "localhost" in der Ausnahmeliste - dann
laeuft ausgerechnet der Zugriff auf die Schnittstelle des Proxy
Managers ueber den Proxy, obwohl no_proxy dem Anschein nach gesetzt
ist.

Deshalb NPM_API_HOST: damit laesst sich die Schnittstelle als
"localhost" ansprechen, ohne die Ausnahmeliste zu aendern - was im
Kundennetz oft nicht in der eigenen Hand liegt. Vorgabe bleibt
127.0.0.1, denn das kommt ohne Namensaufloesung aus und zeigt immer auf
IPv4.

"noproxy" prueft jetzt beide Schreibweisen einzeln und sagt, welche
fehlt, statt nur "geht nicht" zu melden:

  http://127.0.0.1:81/         geht an den Proxy
  http://localhost:81/         direkt
  [ WARN ] Nur 'localhost' ist ausgenommen, 127.0.0.1 nicht.
           Bis das geaendert ist, hilft sofort:
             cmk-manage.sh config set NPM_API_HOST localhost

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-20 23:44:07 +02:00
co-authored by Claude Opus 5
parent 20eceda183
commit eb29db0130
4 changed files with 112 additions and 7 deletions
+43 -7
View File
@@ -3271,6 +3271,7 @@ npm|NPM_ENABLED|choice|Proxy Manager betreiben|on:off|
npm|NPM_ADMIN_EMAIL|text|Konto des Proxy Managers (E-Mail)||1
npm|NPM_ADMIN_PASSWORD|password|Kennwort des Proxy-Manager-Kontos||1
npm|NPM_ADMIN_PORT|port|Port der Adminoberflaeche||
npm|NPM_API_HOST|text|Name fuer die Schnittstelle (127.0.0.1 oder localhost)||1
npm|PROXY_DOMAIN|text|Vorgabe-Domain fuer Proxy-Hosts||1
npm|PROXY_FORWARD_HOST|text|Weiterleitungsziel (Host)||
npm|PROXY_FORWARD_PORT|port|Weiterleitungsziel (Port)||
@@ -3704,7 +3705,15 @@ EOF
# "letsencrypt_email" im Aufruf gibt es in 2.15 nicht mehr.
# =====================================================================
npm_api_base() { printf 'http://127.0.0.1:%s\n' "${NPM_ADMIN_PORT:-81}"; }
# Unter welchem Namen wird die Schnittstelle angesprochen?
#
# no_proxy vergleicht NAMEN, nicht Adressen: steht dort nur "localhost",
# laeuft eine Anfrage an 127.0.0.1 trotzdem ueber den Proxy - und
# umgekehrt. In Firmennetzen ist meist "localhost" eingetragen. Die
# eigenen Aufrufe gehen zwar ohnehin mit --noproxy daran vorbei; wer
# aber von Hand prueft oder andere Werkzeuge nutzt, stellt hier um:
# cmk-manage.sh config set NPM_API_HOST localhost
npm_api_base() { printf 'http://%s:%s\n' "${NPM_API_HOST:-127.0.0.1}" "${NPM_ADMIN_PORT:-81}"; }
# Hat der Proxy Manager schon eine Datenbank? Davon haengt ab, wie das
# Konto entsteht: der Container legt es NUR beim ersten Start mit leerer
@@ -8257,14 +8266,41 @@ EOF
return 0
fi
printf '\n%sGeht %s daran vorbei?%s\n' "$C_BLD" "$url" "$C_RST"
if noproxy_would_use_proxy "$url"; then
test_result fail "Nein - curl schickt auch diese Anfrage an den Proxy."
# no_proxy vergleicht Namen, nicht Adressen. Deshalb beide pruefen -
# oft steht nur einer von beiden in der Ausnahmeliste.
printf '\n%sGehen lokale Anfragen daran vorbei?%s\n' "$C_BLD" "$C_RST"
local n ok_ip="" ok_name=""
for n in 127.0.0.1 localhost; do
printf ' %-28s ' "http://$n:${NPM_ADMIN_PORT:-81}/"
if noproxy_would_use_proxy "http://$n:${NPM_ADMIN_PORT:-81}/"; then
printf '%bgeht an den Proxy%b\n' "$C_RED" "$C_RST"
else
printf '%bdirekt%b\n' "$C_GRN" "$C_RST"
if [ "$n" = 127.0.0.1 ]; then ok_ip=1; else ok_name=1; fi
fi
done
echo
if [ -z "$ok_ip" ] && [ -n "$ok_name" ]; then
test_result warn "Nur 'localhost' ist ausgenommen, 127.0.0.1 nicht."
printf ' no_proxy vergleicht Namen, keine Adressen - beides muss
einzeln drinstehen. Bis das geaendert ist, hilft sofort:
%s config set NPM_API_HOST localhost\n' "$SELF"
printf '\n Angesprochen wird die Schnittstelle derzeit als: %s\n' \
"${NPM_API_HOST:-127.0.0.1}"
elif [ -n "$ok_ip" ] && [ -z "$ok_name" ]; then
test_result warn "Nur 127.0.0.1 ist ausgenommen, 'localhost' nicht."
printf ' Fuer dieses Werkzeug genuegt das (NPM_API_HOST=%s).\n' \
"${NPM_API_HOST:-127.0.0.1}"
fi
if [ -z "$ok_ip" ] && [ -z "$ok_name" ]; then
test_result fail "Nein - curl schickt auch lokale Anfragen an den Proxy."
printf ' Daher kommen Meldungen wie "API-Fehler" beim Anmelden am
Proxy Manager: nicht der Proxy Manager antwortet nicht, sondern
der HTTP-Proxy weiss mit 127.0.0.1 nichts anzufangen.\n'
else
test_result ok "Ja - lokale Anfragen gehen direkt."
der HTTP-Proxy weiss mit der Adresse nichts anzufangen.\n'
elif [ -n "$ok_ip" ] && [ -n "$ok_name" ]; then
test_result ok "Ja - beide Schreibweisen gehen direkt."
if [ -z "$fix" ]; then
printf '\n Die eigenen Aufrufe dieses Werkzeugs gehen ohnehin daran vorbei
(curl --noproxy). Fuer eigene Tests und andere Programme ist es