# Gehostete Proxys

Ein gehosteter Proxy leitet den Datenverkehr einer App über URnetwork, wenn die App nur eine Proxy-Einstellung annimmt: curl, ein Skript, ein Scraper oder eine Smartphone-App wie Shadowrocket. Diese Anleitung zeigt, wo du die URL eines Proxys auf ur.io findest und wie du sie in gängigen Clients einträgst.

Ein Hinweis zum Geltungsbereich: Ein gehosteter Proxy hat keine versiegelte Sitzung. Dein Client-Gerät läuft beim Operator, der das Protokoll des Proxys in das des Netzwerks übersetzt. Zwischen dem Operator und deinem Datenverkehr steht das protokollfreie Design des Proxys, das im [Bedrohungsmodell](/docs/threat-model) beschrieben ist, keine Versiegelung. Provider erfahren weiterhin nicht, wer du bist. Wo eine App URnetwork selbst ausführen kann, sind die Apps und das [SDK](/docs/getting-started-sdk) der privatere Weg.

## Zwei Arten von Proxys {#types}

ur.io erstellt zwei Arten von Proxys, die Clients von Drittanbietern nutzen können:

| | HTTPS-Proxy | SOCKS5-Proxy |
| --- | --- | --- |
| Tarif | Jeder Tarif | UR Pro |
| URL auf ur.io | `https://<token>.<host>:<port>` | `socks5h://<token>:x@<host>:<port>` |
| Wo das Token steht | Im Hostnamen, ohne Benutzername oder Passwort | Im Benutzernamen; das Passwort wird nie geprüft |
| Der Client muss unterstützen | HTTPS-Proxys, die TLS zum Proxy verwenden | SOCKS5 mit Benutzername und Passwort |
| Überträgt | Webverkehr: HTTP, und HTTPS über CONNECT | TCP-Verbindungen, und UDP über UDP associate |

Der SOCKS5-Proxy unterstützt kein BIND und verwirft UDP-Datagramme über 2 KiB. ur.io erstellt mit UR Pro außerdem WireGuard-Profile. Importiere die heruntergeladene `.conf`-Datei in eine WireGuard-App; der Rest dieser Anleitung behandelt HTTPS und SOCKS5.

## Die URL eines Proxys holen {#create}

1. Melde dich auf [ur.io](https://ur.io) an und öffne **Proxys** (Proxies) ([ur.io/app/proxies](https://ur.io/app/proxies)).
2. Wähle **Proxy erstellen** (Create proxy).
3. Wähle den Proxy-Typ: **HTTPS**, **SOCKS5** oder **WireGuard**. SOCKS5 und WireGuard tragen ein **Pro**-Abzeichen. Im Gratis-Tarif bietet die Erstellen-Schaltfläche zuerst Pro an.
4. Wähle einen Standort. Suche nach einem Land, einer Region oder einer Stadt, oder behalte **Bestmöglich** (Best available), das jeden Provider im Netzwerk nutzt. Standorte zeigen an, wie viele Provider sie haben.
5. Wähle **Create HTTPS proxy** oder **Create SOCKS5 proxy**. Der neue Proxy erscheint mit seiner URL.

Jeder HTTPS- und SOCKS5-Proxy in der Liste hat **URL kopieren** (Copy URL), das die ganze URL mit ihrem Token kopiert, und **×**, das den Proxy entfernt.

## Die URL lesen {#url}

```text
https://<token>.<host>:<port>
socks5h://<token>:x@<host>:<port>
```

- `<token>` ist das Token des Proxys, eine lange Folge aus Buchstaben und Ziffern. Es ist die einzige Zugangsberechtigung des Proxys, und Groß- und Kleinschreibung spielt keine Rolle.
- In der HTTPS-URL ist das Token das erste Label des Hostnamens. Trage `<token>.<host>` als Proxy-Host ein, genau so, wie ur.io es anzeigt: Das Token im Namen ist das, was dich anmeldet.
- In der SOCKS5-URL steht das Token zwischen `socks5h://` und `:x@`. `<host>` folgt auf das `@`, und `<port>` folgt auf das letzte `:`.
- Das `x` ist ein Platzhalter-Passwort. Der SOCKS5-Proxy prüft das Passwort nie, daher funktioniert jeder Wert. Manche Clients senden den Benutzernamen nur, wenn auch ein Passwort gesetzt ist, darunter Pythons `requests`, und für sie trägt die URL von ur.io das `x`. Fragt ein Client Benutzername und Passwort getrennt ab, gib ihm das Token und ein beliebiges Passwort.
- Behalte das `h` in `socks5h`. Damit löst der Proxy die Hostnamen auf, sodass die Namensauflösung über den Provider erfolgt statt von deinem Rechner aus. Mit einfachem `socks5` löst curl Namen zuerst auf deinem Rechner auf.

> **Behandle die URL wie ein Passwort.** Wer sie hat, kann den Proxy nutzen, und der Datenverkehr des Proxys verbraucht das Datenvolumen deines Kontos. Wenn eine URL nach außen gelangt, entferne diesen Proxy auf ur.io; dann nimmt der Proxy sein Token nicht mehr an. Erstelle anschließend einen neuen.

## Mit curl prüfen, ob es funktioniert {#curl}

```sh
# HTTPS proxy, on every plan
curl -x 'https://<token>.<host>:<port>' https://api.bringyour.com/my-ip-info

# SOCKS5 proxy, on UR Pro
curl -x 'socks5h://<token>:x@<host>:<port>' https://api.bringyour.com/my-ip-info
```

`/my-ip-info` antwortet mit der Adresse, von der deine Anfrage kam, und mit dem Ort dieser Adresse. Über den Proxy ist das die Adresse eines Providers an dem Standort, den du gewählt hast. HTTPS-Proxys brauchen curl 7.52 oder neuer.

## Browser {#browsers}

Der einfachste Weg, einen Browser über einen Proxy zu leiten, ist die URnetwork-Erweiterung, die ihren eigenen gehosteten Proxy erstellt und verwaltet. Siehe [Erste Schritte in deinem Browser](/docs/getting-started-browser).

Willst du stattdessen einen Proxy verwenden, den du auf ur.io erstellt hast, nimm seine HTTPS-URL. Chrome kann überhaupt keinen SOCKS5-Benutzernamen senden. Die Proxy-Einstellungen des Betriebssystems und die manuellen Proxy-Einstellungen von Firefox können einen HTTPS-Proxy in der Regel nicht beschreiben.

**Chrome, Edge und andere Chromium-Browser.** Starte den Browser mit dem Proxy auf der Befehlszeile. Durch das separate Profilverzeichnis wirkt das Flag auch dann, wenn dein gewohntes Browserfenster geöffnet ist:

```sh
# macOS
open -na "Google Chrome" --args --user-data-dir="$HOME/urnetwork-proxy-profile" --proxy-server="https://<token>.<host>:<port>"

# Linux
google-chrome --user-data-dir="$HOME/urnetwork-proxy-profile" --proxy-server="https://<token>.<host>:<port>"

# Windows, in Command Prompt (Edge: msedge instead of chrome)
start chrome --user-data-dir="%USERPROFILE%\urnetwork-proxy-profile" --proxy-server="https://<token>.<host>:<port>"
```

**Firefox.** Die manuellen Einstellungen von Firefox haben kein Benutzernamensfeld für SOCKS und keinen HTTPS-Proxy-Typ, also verwende eine einzeilige Datei zur automatischen Proxy-Konfiguration (PAC). Speichere dies als `urnetwork.pac`:

```js
function FindProxyForURL(url, host) {
  return "HTTPS <token>.<host>:<port>";
}
```

Öffne dann **Einstellungen → Allgemein → Verbindungs-Einstellungen → Einstellungen…** (Settings → General → Network Settings → Settings…), wähle **Automatische Proxy-Konfigurations-Adresse** (Automatic proxy configuration URL), gib die Adresse der Datei ein, etwa `file:///Users/you/urnetwork.pac` oder `file:///C:/Users/you/urnetwork.pac`, und wähle **OK**. Zum Beenden wähle im selben Dialog **Kein Proxy** (No proxy).

## Smartphone-Apps: Shadowrocket und andere {#shadowrocket}

Proxy-Apps für Smartphones, etwa Shadowrocket unter iOS, nehmen einen SOCKS5-Server als einige wenige Felder entgegen. Erstelle auf ur.io einen SOCKS5-Proxy (UR Pro) und kopiere seine URL. Füge in der App einen Server hinzu und fülle ihn anhand der URL aus:

| Feld | Wert |
| --- | --- |
| Typ (Type) | SOCKS5 |
| Adresse, Server oder Host (Address) | `<host>`: der Teil zwischen `@` und dem letzten `:` |
| Port (Port) | `<port>`: die Ziffern nach dem letzten `:` |
| Benutzer oder Benutzername (User) | `<token>`: der Teil zwischen `socks5h://` und `:x@` |
| Passwort (Password) | Ein beliebiger Wert, etwa `x` |

Speichere den Server, wähle ihn aus und schalte die Verbindung ein. Für ein ganzes Smartphone braucht die URnetwork-App für [iOS](/docs/getting-started-ios) oder [Android](/docs/getting-started-android) keinen Proxy und ist der privatere Weg.

## Python {#python}

`requests` nimmt beide Proxys an. SOCKS5 braucht das Extra `socks` (`pip install "requests[socks]"`), und seine URL braucht ein Platzhalter-Passwort:

```python
import requests

proxy = "https://<token>.<host>:<port>"          # HTTPS proxy, every plan
# proxy = "socks5h://<token>:x@<host>:<port>"    # SOCKS5 proxy, UR Pro

r = requests.get(
    "https://api.bringyour.com/my-ip-info",
    proxies={"http": proxy, "https": proxy},
    timeout=30,
)
print(r.json()["info"]["ip"])
```

`httpx` nimmt dieselben URLs an; SOCKS5 braucht `pip install "httpx[socks]"`. `aiohttp` nimmt den HTTPS-Proxy an:

```python
import asyncio

import aiohttp
import httpx

with httpx.Client(proxy="https://<token>.<host>:<port>") as client:
    print(client.get("https://api.bringyour.com/my-ip-info").json())


async def main():
    async with aiohttp.ClientSession() as session:
        async with session.get("https://api.bringyour.com/my-ip-info", proxy="https://<token>.<host>:<port>") as r:
            print(await r.json())

asyncio.run(main())
```

Der Standard-Download-Handler von Scrapy kann `https://`-Seiten nicht über einen HTTPS-Proxy abrufen: Er bricht mit „HTTPS proxies for HTTPS destinations are not supported“ ab. Rufe diese Seiten stattdessen mit einer der Bibliotheken oben ab.

## Node.js {#node}

Für `fetch` gib undicis `ProxyAgent` den HTTPS-Proxy:

```js
import { fetch, ProxyAgent } from "undici";

const dispatcher = new ProxyAgent("https://<token>.<host>:<port>");
const res = await fetch("https://api.bringyour.com/my-ip-info", { dispatcher });
console.log(await res.json());
```

Für `node:https` und Bibliotheken, die einen Agent annehmen, verwende `https-proxy-agent`, oder für SOCKS5 `socks-proxy-agent`:

```js
import https from "node:https";
import { HttpsProxyAgent } from "https-proxy-agent";
// import { SocksProxyAgent } from "socks-proxy-agent";

const agent = new HttpsProxyAgent("https://<token>.<host>:<port>");
// const agent = new SocksProxyAgent("socks5h://<token>:x@<host>:<port>");

https.get("https://api.bringyour.com/my-ip-info", { agent }, (res) => res.pipe(process.stdout));
```

## Andere Programme: proxychains {#proxychains}

Unter Linux leitet proxychains-ng die Verbindungen eines Programms über einen SOCKS5-Proxy (UR Pro), auch wenn das Programm keine Proxy-Einstellung hat. Es funktioniert, indem es eine Bibliothek vorlädt, und erreicht daher keine statisch gelinkten Programme, zu denen die meisten Go-Programme gehören. Sein erster Proxy muss eine IP-Adresse sein, kein Hostname, also ermittle die Adresse zuerst:

```sh
dig +short <host>
```

Speichere eine Konfigurationsdatei, `urnetwork.conf`, mit dieser Adresse:

```text
strict_chain
proxy_dns
[ProxyList]
socks5 <ip> <port> <token> x
```

Starte dann Programme darüber:

```sh
proxychains4 -f urnetwork.conf curl https://api.bringyour.com/my-ip-info
```

`proxy_dns` lässt proxychains Namen über den Proxy auflösen. Wenn Verbindungen später nicht mehr funktionieren, ermittle die Adresse erneut.

## Grenzen {#limits}

| | Gratis-Tarif | UR Pro |
| --- | --- | --- |
| Aktive Proxys | 5 | 1.000 |
| Neue Proxys pro Minute | 5 | 20 |

Proxys, die die Browser-Erweiterung erstellt, zählen ebenfalls. Eine Grenze stoppt nur neue Proxys: Proxys, die du hast, funktionieren weiter, und wenn du einen entfernst, wird Platz für einen anderen. Ein Proxy bleibt, bis du ihn entfernst; einer, der etwa 30 Tage lang nicht benutzt wurde, wird für dich entfernt.

## Eindeutige Ausgangs-IPs {#unique-exit}

Ein gehosteter Proxy verteilt seine Verbindungen meist auf mehrere Provider, daher können zwei deiner Proxys über dieselbe Adresse austreten. Mit einer eindeutigen Ausgangs-IP, mit UR Pro, tritt jeder Proxy über einen einzigen Provider aus, dessen Adresse keiner deiner anderen Proxys verwendet. Ein Proxy behält seinen Exit, solange dieser Provider gesund bleibt.

- **Einschalten:** Setze auf der Seite „Proxys“ beim Erstellen eines Proxys ein Häkchen bei **Eindeutige Ausgangs-IP** (Unique exit IP). Stelle **Anzahl der Proxys** (Number of proxies) ein, um bis zu 20 auf einmal zu erstellen. In der API fügst du `"unique_exit": true` zur `proxy_config` hinzu.
- **Grenzen:** Proxys mit eindeutigem Exit zählen zu denselben Grenzen wie jeder andere Proxy, 1.000 aktive und 20 neue pro Minute.
- **Was du siehst:** Jeder Proxy zeigt, wo sein Exit ist (Stadt, Region und Land) und seit wann. Die IP-Adresse des Exits wird nicht angezeigt. Um sie zu sehen, rufe über den Proxy eine IP-Prüfung ab, etwa mit den curl-Befehlen oben.
- **Wenn der Provider ausfällt:** Der Proxy bekommt automatisch einen neuen eindeutigen Exit und zeigt währenddessen **Ausgang wird ersetzt…** (Replacing exit…) an. Ersetzungen sind pro Stunde begrenzt; über der Grenze wartet ein Proxy und versucht es später erneut. In der API lässt `"unique_exit_replace": "manual"` einen Proxy stattdessen auf dich warten: Er zeigt **Ausgang verloren** (Exit lost) an, bis du ihn wechselst.
- **Ausgang wechseln** (Rotate exit): gibt dem Proxy einen neuen eindeutigen Exit. Der Exit eines Proxys kann einmal pro Minute und bis zu 60-mal pro Tag gewechselt werden. Ist am Standort kein anderer eindeutiger Exit frei, behält der Proxy den, den er hat.
- **Kein eindeutiger Exit verfügbar:** Wenn jeder gesunde Exit am Standort bereits von deinen anderen Proxys genutzt wird, sagt ur.io das und erstellt nichts; der Versuch zählt nicht zu deinen Grenzen. Wähle einen anderen Standort oder **Bestmöglich**.

## Fehlerbehebung {#troubleshooting}

**ur.io weigert sich, einen Proxy zu erstellen.** Es zeigt den Grund an (die Meldungen sind auf Englisch). Im Gratis-Tarif:

- „Your plan's limit of 5 active proxies is reached. Remove a proxy to create another, or upgrade to UR Pro for more.“ (Die Grenze deines Tarifs von 5 aktiven Proxys ist erreicht.) Entferne Proxys, die du nicht mehr nutzt, oder steige auf.
- „Your plan allows 5 new proxies a minute. Try again in a minute, or upgrade to UR Pro for more.“ (Dein Tarif erlaubt 5 neue Proxys pro Minute.) Warte eine Minute und versuche es dann erneut.

Mit UR Pro nennen dieselben Meldungen die Grenzen von Pro und lassen das Upgrade weg.

**Der SOCKS5-Proxy lehnt die Anmeldung ab.** curl meldet eine dieser Nachrichten, und andere Clients formulieren sie auf ihre Weise:

- `User was rejected by the SOCKS5 server (1 1).` Das Token ist falsch oder abgeschnitten, oder der Proxy wurde entfernt. Kopiere die URL erneut von ur.io.
- `No authentication method was acceptable.` Der Client hat keinen Benutzernamen gesendet. Setze den Benutzernamen auf das Token, mit einem Platzhalter-Passwort wie `x`.

**Der HTTPS-Proxy lehnt die Verbindung ab.** curl meldet `CONNECT tunnel failed, response N`, wobei N Folgendes ist:

- 407: Der Proxy hat kein gültiges Token gefunden. Kopiere die URL erneut von ur.io und trage das ganze `<token>.<host>` als Proxy-Host ein.
- 502: Den Proxy gibt es nicht mehr, zum Beispiel weil du ihn entfernt hast, oder das Ziel war nicht erreichbar.
- 403: Die Adresse des Aufrufers liegt außerhalb der IP-Sperre des Proxys. Nur Proxys, die über die API mit einer IP-Sperre erstellt wurden, haben eine.

Ein Client, der eine leere Antwort bekommt oder dessen Verbindung sofort geschlossen wird, spricht vermutlich einfaches HTTP mit dem Proxy. Verwende die `https://`-URL in einem Client, der HTTPS-Proxys unterstützt.

**Seiten laden langsam oder laufen in ein Timeout.** Probiere **Bestmöglich** oder einen Standort mit mehr Providern. Der Datenverkehr des Proxys verbraucht das Datenvolumen deines Kontos, daher kann ein Konto ohne verbleibende Daten keine neuen Verbindungen öffnen.

**Die Ausgangs-IP ändert sich.** Wie in den Apps verteilt ein gehosteter Proxy seine Verbindungen auf mehrere Provider an seinem Standort. Die Adresse, die eine Website sieht, kann sich von einer Verbindung zur nächsten ändern. Um pro Proxy eine Ausgangs-IP zu halten, erstelle ihn mit einer [eindeutigen Ausgangs-IP](#unique-exit) mit UR Pro.

**Der Proxy ist am falschen Ort.** Bestmöglich kann in jedem Land austreten. Wähle beim Erstellen des Proxys ein Land, eine Region oder eine Stadt. ur.io kann einen vorhandenen Proxy nicht verschieben: Erstelle einen neuen am gewünschten Ort und entferne dann den alten.

## Mit der API automatisieren {#api}

Die Seite „Proxys“ ruft die [Operator-API](/docs/api) auf: `POST /network/auth-client` mit einer `proxy_config`, in der `initial_device_state.location` den Standort wählt. Die `proxy_config_result` der Antwort enthält `https_proxy_url`, `socks_proxy_url` und `auth_token`. Die `socks_proxy_url` der API hat keinen Benutzernamen: Füge `auth_token` als Benutzernamen hinzu, wie es ur.io tut. Eine `lock_ip_list` aus IP-Adressen oder Subnetzen begrenzt, wer den Proxy nutzen darf. Die Grenzen oben gelten auch für die API.

Für eine [eindeutige Ausgangs-IP](#unique-exit) füge `unique_exit` zur `proxy_config` hinzu:

```json
{
  "proxy_config": {
    "unique_exit": true,
    "initial_device_state": {
      "location": { "connect_location_id": { "best_available": true } }
    }
  }
}
```

Füge `"unique_exit_replace": "manual"` hinzu, damit ein Proxy bei einem Ausfall seines Providers auf seinem Exit bleibt, bis du ihn wechselst; der Standard ist `"auto"`.

Die `proxy_config_result.exit` der Antwort nennt `exit_id`, `country_code`, `region`, `city`, `exit_since`, `state` (`assigned`, `replacing` oder `no_supply`) des Exits, `state_reason`, wenn es einen gibt, und `replace_mode`. `GET /network/proxies` meldet dasselbe als `exit` jedes Proxys, neben seinem `proxy_client`. Eine Ablehnung mit `no_unique_supply` bedeutet, dass der Standort keinen Exit mehr hat, den deine Proxys nicht schon nutzen. `POST /network/proxy/rotate-exit` mit der `client_id` des Proxys verschiebt ihn auf einen neuen eindeutigen Exit und antwortet mit dem neuen `exit`; über der Wechselgrenze lehnt es mit `rate_limited` ab, oder mit `no_unique_supply`, wenn kein anderer Exit frei ist. Es nimmt die Anmeldung deines Netzwerks oder einen API-Schlüssel an.
