D'VPN ass un, den internen Dashboard geet am Browser op, an de Python-Skript geet nach ëmmer e Proxy-Fehler. An deem Bild ass näischt falsch mam Tunnel: den Interpreter liest eng Proxy-Adress aus senger eegener Ëmwelt a schéckt d'Ufro dohin. Dëse Guide liest d'Ëmwelt, déi de Prozess tatsächlech gesäit, applizéiert déi engst Ausnam a betruecht eréischt duerno eng explizit Sessiounspolitik. All Schrëtt endegt mat engem Befehl, deem säin Output decidéiert, ob Dir weidergitt.

Liest d'Ëmwelt, déi de Prozess tatsächlech gesäit

D'Proxy-Astellungen vum Desktop, d'Shell-Exporten an d'Environment=-Linnen vun enger systemd-Eenheet sinn dräi verschidde Quellen, an Requests liest just déi lescht, déi et ierft. Féiert d'Diagnostik hei ënnen an der selwechter Shell, am Container oder an der Eenheet aus, déi de feelerhafte Skript ausféiert, net an Ärem interaktiven Terminal. Eng Variabel, déi an Ärer Login-Shell exportéiert gouf, ass fir e Containerprozess onsiichtbar, an dës Lück erkläert vill Berichter iwwer e Proxy, deen aus dem Näischt erschéngt. Déi zwou Befehler drécken déiselwecht Donnéeën op verschidden Detailniveauen.

env | grep -i -E 'proxy|requests_ca_bundle|curl_ca_bundle'
python3 -c "import os;[print(k,'=',v) for k,v in sorted(os.environ.items()) if 'proxy' in k.lower()]"

Béid Schreifweise vun all Variabel ginn gelies, an duebel Entréeë ginn an der Rei applizéiert, an där de Prozess se kritt huet, sou datt en ale HTTP_PROXY de Wäert, deen Dir just exportéiert hutt, iwwerschreiwe kann. D'CA-Bundle-Variabelen zielen hei och, well se änneren, wat verify opgeléist gëtt, ouni iergendwou am Code opzedauchen. Wann den Output eidel ass, ass d'Ëmwelt net Äre Problem a Dir kënnt ophalen dësen Abschnitt ze liesen. Wann et e Proxy oplëscht, deen Dir net erkennt, fannt d'Datei oder d'Eenheet, déi en setzt, ier Dir eppes ännert.

Frot Requests, wat et mat enger bestëmmter URL géif maachen. Dësen Opruff weist déi fusionéiert Proxy-, verify- an cert-Wäerter fir déi Ufro, ouni e Paket ze schécken.

python3 -c "import requests;s=requests.Session();print(s.merge_environment_settings('https://api.corp.example/status',{},None,None,None))"

En net-eidelen proxies-Entrée fir de privaten Host ass Är Äntwert, an den ugedréckte verify-Wäert seet Iech, wéi engem CA-Bundle d'Ufro géif vertrauen. Wann béid richteg ausgesinn, ass de Fehler méi wäit am Stack an Dir sollt zum Validatiounsabschnitt sprangen. Rode net aus dem Code: d'Fusioun geschitt pro Ufro, dofir kann eng Sessioun sech fir zwee Hosten anescht behuelen.

Schléisst de privaten Host aus, ier Dir eppes deaktivéiert

Wann de Proxy wierklech fir aner Destinatiounen néideg ass, ass déi eng Korrektur eng Ausnam fir dësen Host. Füügt bei déi bestehend Lëscht derbäi amplaz se z'ersetzen, well d'Läschen vun NO_PROXY all aner intern Destinatioun brécht, déi sech drop verlooss huet. D'Befehler hei ënnen fügen den Entrée bäi a froen duerno Requests, ob d'Ëmgoe gëllt.

export NO_PROXY="${NO_PROXY:+$NO_PROXY,}api.corp.example,.corp.example"
python3 -c "import requests;print(requests.utils.should_bypass_proxies('https://api.corp.example/status',None))"

D'Zouuerdnung geschitt no Host-Suffix, sou datt .corp.example d'ganz Domain deckt, wärend api.corp.example een Numm deckt. En nackten Asterisk deaktivéiert Proxy fir all Host a bal ni ass et dat, wat eng Produktiounsaufgab wëll. Ob en CIDR-Entrée respektéiert gëtt, hänkt vun den Requests- an urllib3-Versiounen am Image of, also testt den exakten Entrée amplaz unzehuelen, datt en fonctionéiert. Préift d'Resultat vun should_bypass_proxies fir déi richteg URL, net fir en Hostnumm, deen Dir aus dem Gediechtnis getippt hutt.

Halt déi zwou Schichten am Kapp getrennt. D'HTTP-Proxy ëmgoen ëmgeet net d'VPN, well d'Proxy-Entscheedung an der Bibliothéik fällt an d'Tunnel-Entscheedung an der Routingstabelle vum Kernel.

Deaktivéiert trust_env just als bewosst Sessiounspolitik

Wann déi ganz Aufgab d'Ëmweltkonfiguratioun ignoréiere soll, baut d'Sessioun explizit op a schreift d'Entscheedung an de Code. Dat ass eng Politik, keen Workaround, an et gehéiert an en Diff, deen e Reviewer gesäit. D'Beispill hei ënnen behält en Timeout, en explizite CA-Pad an eng Statuspréifung.

import requests

with requests.Session() as session:
    session.trust_env = False
    response = session.get(
        "https://api.corp.example/status",
        timeout=(5, 20),
        verify="/etc/ssl/certs/corp-ca.pem",
    )
    response.raise_for_status()

D'Ofschalten vun trust_env ännert dräi Verhalen op eemol, an nëmmen eng dovun ass iwwer Proxyen. Requests hält op .netrc-Umeldungsinformatiounen ze liesen, an d'Variabelen REQUESTS_CA_BUNDLE an CURL_CA_BUNDLE beaflossen verify net méi, dat dann op de matgeliwwerte Zertifikatsspäicher zréckfält. Wann Är Organisatioun TLS mat hirer eegener CA ofschléisst, gëtt dëse Réckfall eng Validatiounsfeeler, déi näischt mam Ännerung ze dinn ze hunn schéngt, déi Dir just gemaach hutt. D'explizit Iwwergi vun verify ass dat, wat déi zwou Auswierkungen getrennt hält.

Wat Dir net sollt maachen, ass verify=False ze setzen, fir de resultéierende Fehler ze berouegen. Dat tauscht eng falsch Proxy-Konfiguratioun géint eng onverifiéiert Verbindung aus, an et verstoppt de Zertifikatsproblem, deen d'Ausnam sollt opdecken.

Verifizéiert déi feelerhaft Schicht a behält eng Zréckrollméiglechkeet

Dräi Fehler gesi gläich aus an engem Log an hunn näischt gemeinsam: e Proxy, deen den Zil net erreecht, geet ProxyError oder gëtt 502 zréck, e Vertrauensproblem geet SSLError, an eng Applikatiouns-Aweisung gëtt 401 oder 403 zréck. Reproduzéiert d'Ufro baussen Requests, fir ze gesinn, wéi eng Dir hutt. D'Befehler hei ënnen huelen de Proxy ewech, testen d'Zertifikatskette an widderhuelen duerno den Opruff duerch d'Bibliothéik.

curl -sv --noproxy '*' https://api.corp.example/status -o /dev/null
openssl s_client -connect api.corp.example:443 -servername api.corp.example </dev/null
python3 -c "import requests;r=requests.get('https://api.corp.example/status',timeout=10);print(r.status_code)"

Wann den curl-Opruff geléngt an den Python-Opruff feelt, ass d'Ëmwelt nach ëmmer den Ënnerscheed. Wann béid an der TLS-Phase feelen, war de Proxy ni de Problem an d'Zertifikatskette ass et. Wann béid 401 zréckginn, huet d'Ufro d'Applikatioun erreecht an déi reschtlech Aarbecht ass d'Authentifikatioun. Ze notéieren, wéi eng vun den dräi Dir observéiert hutt, spuert der nächster Persoun eng Stonn.

Zréckrollen ass eng Linn an déi eng oder aner Richtung: huelt d'Ausnam ewech oder dréit trust_env zréck. Späichert de virege NO_PROXY-Wäert, ier Dir eppes derbäi fügt, a bevirzugt e Wrapper-Skript oder en Environment=-Entrée op Eenheetsniveau géint en Export, deen nëmmen an der Geschicht vun Ärem Terminal lieft. Béid Ännerungen si spéiderbar an der Prozessëmwelt, also bréngt en Neistart Iech normalerweis zréck op dat aalt Verhalen.

Schléisst of, andeems Dir véier Saache bestätegt: déi fusionéiert Astellunge fir déi privat URL weisen keen Proxy, den Zertifikat validéiert géint déi virgesinn CA, d'Ufro gëtt de Status zréck, deen Dir erwaart, an d'Ännerung ass op enger reproduzéierbarer Plaz commit. E gréngen Skript mat enger onerklärter Ëmwelt ass eng Korrektur, déi op der nächster Maschinn erëm brécht. D'Befehler an dësem Guide sinn déi, déi Dir an den Ticket paste sollt.

Ähnlech Artikelen