Accéder à mon infra docker locale avec mon téléphone

J'ai essayé de faire un proxy en go

Le problème exposé dans ce sujet a été résolu.

Hello!

J’ai une infrastructure docker pour mon développement. Oui mais voilà j’ai besoin de tester sur des devices mobiles. L’infra est un peu complexe (y’a du websocket, plusieurs services…) du coup j’ai mis un traefik pour gérer tout ça. Et on utilise un host tout simple: gangbowl.local.

Pour accéder aux dockers depuis mon PC je me suis dit que j’allais faire un proxy. Parce que je n’ai pas vraiment d’autres idées (vu que je ne peux pas modifier les hosts de mon tel). Si vous avez d’autres idées je suis prenneur.

Quoi qu’il en soit j’ai tenté le code suivant, qui ne fonctionne pas du toouuuuut.

func main() {
    proxy := goproxy.NewProxyHttpServer()
    proxy.Verbose = true

    proxy.OnRequest(goproxy.UrlIs("gangbowl.paris")).DoFunc(func(r *http.Request,ctx *goproxy.ProxyCtx) (*http.Request, *http.Response){
        u, _ := url.Parse("https://62.210.157.90")
        r.URL = u
        r.Header.Set("Host","gangbowl.paris")

        return r, nil
    })

    log.Fatal(http.ListenAndServe(":9999", proxy))
}

Il faut le dire, mes connaissances en golang sont proche du néant. Je loupe forcément quelque chose. Quelqu’un peut-il m’aiguiller ? Merci :)

NB: je test avec http_proxy=http://localhost:9999 curl https://gangbowl.paris

[edit] La bonne commande pour tester c’est celle-ci:

ALL_PROXY=localhost:9999 curl https://gangbowl.local
+0 -0

Hello,

As tu regardé du coté de https://ngrok.com ? C’est ce que j’utilise quand j’ai besoin de tester des truc que dev sur smartphone, ou pour faire tester à d’autres personnes.

Heziode

Le problème principal c’est pas l’accès par ip mais le nom de domaine en fait. (typiquement j’accède à service1.gangbowl.local et gangbowl.local et gangbowl.local/service3 sur le même port, mais c’est l’host qui dissocie)

Bonjour, tu aurais plutôt besoin d’un serveur DNS ; ce sera plus propre au niveau des requêtes.

Tu peux suivre ce mini-tuto : https://medium.com/nagoya-foundation/running-a-dns-server-in-docker-61cc2003e899.

Je viens de le tester, ça fonctionne. C’est super simple ! :)

Edit : par contre pour l’avoir testé en local, y’a une petite astuce pour que ça bind sur 0.0.0.0:53. Il faut arrêter le service systemd-resolved en exécutant la commande sudo systemctl stop systemd-resolved (puis le redémarrer une fois le container supprimé). Penser également à vérifier que le fichier /etc/resolv.conf contient bien nameserver 127.0.0.1 et pas nameserver 127.0.0.53 (pour les tests en local).

+0 -0

Salut !

Alors, déjà, ce serait bien de citer l’erreur que te retourne de la commande curl. Ça aiderait pour savoir où chercher ce qui ne fonctionne pas.

Dans le doute, je suppose que tu utilises ce module pour faire ton proxy. Je pense que la condition n’est probablement pas celle que tu veux, et je te propose d’essayer de remplacer goproxy.UrlIs par goproxy.ReqHostIs :

package main

import (
    "log"
    "net/http"
    "net/url"

    "github.com/elazarl/goproxy"
)

func main() {
    proxy := goproxy.NewProxyHttpServer()
    proxy.Verbose = true

    proxy.OnRequest(goproxy.ReqHostIs("gangbowl.paris")).DoFunc(
        func(r *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, *http.Response) {
            log.Println("Redirecting call to gangbowl.paris")
            u, _ := url.Parse("https://62.210.157.90")
            r.URL = u
            r.Header.Set("Host","gangbowl.paris")
            return r, nil
        },
    )
    log.Fatal(http.ListenAndServe(":9999", proxy))
}

J’ai testé ça (avec des urls à moi) sur ma machine et ça fonctionne sans problème.

Cela dit, je ne suis pas certain de ce qui est censé se produire si l’URL cible est en https

+0 -0

En effet désolé j’ai omis les imports mais oui c’est bien ça.

Par contre je présume que ça ne fonctionnera jamais tant que la résolution DNS n’est pas bonne, Yarflam a raison. Je vais tenter sa solution. Dans l’état j’ai testé avec ton code, ça donne ça:

$ http_proxy=http://localhost:9999 curl https://gangbowl.paris
curl: (6) Could not resolve host: gangbowl.paris

Edit: mais la solution de @Yarflam ne fonctionne que dans docker lui même si j’ai bien compris. >_<

+0 -0

Edit: mais la solution de @Yarflam ne fonctionne que dans docker lui même si j’ai bien compris. >_<

Nek

Si le DNS écoute sur 0.0.0.0:53, il marchera depuis l’extérieur. Il te suffit ensuite de saisir dans la configuration Wifi, l’IP de ton ordinateur. Y’a quand même deux bémols à cette solution : ça ne fonctionne pas sur une connexion 3g/4g et tu dois obligatoirement ouvrir les ports 80 et 53 publiquement.

Sinon j’utilise pour le boulot l’application Hosts Go disponible sur Android. Alors c’est plein de pubs mais ça modifie le host en créant un faux VPN … à la limite, tu peux peut-être te pencher sur une solution en VPN ?

Edit : à dire vrai je n’ai pas non plus la solution idéal. J’avais en tête depuis un moment de créer un DNS avec un éditeur de profils mais je me rends compte maintenant que ça ne résoudrait pas tout. Le VPN semble plus prometteur, puis-ce qu’il est directement accessible depuis les paramètres réseaux (quelque soit le type de connexion Wifi, 3g/4g).

+0 -0

Ok en effet au final la solution qui a de l’avenir c’est host go… J’ai testé ça a l’air de bien fonctionner.

Le coup du serveur DNS j’ai tenté aussi mais en fait je ne vois vraiment pas comment faire au final.

En plus j’ai un autre soucis, celui-ci: https://github.com/microsoft/WSL/issues/4150 (TL;DR: impossible d’accéder à docker inside WSL depuis le réseau local hors host)

Il va peut être falloir coupler host go avec ce fameux proxy je crois x)…

+0 -0

En plus j’ai un autre soucis, celui-ci: https://github.com/microsoft/WSL/issues/4150 (TL;DR: impossible d’accéder à docker inside WSL depuis le réseau local hors host)

Nek

Y’a plusieurs raisons pour lesquels tu ne peux y accéder :

  • La virtualisation WSL n’expose par les ports sur ton localhost, c’est un autre réseau local -> modifier la configuration réseau depuis le manager d’Hyper-V.
  • La VM virtualisé filtre certaines IP entrantes -> modifier les règles iptables.
  • Le container n’expose pas les ports -> recréer le container en indiquant bien --publish=80:80.
  • Le démon Apache/Nginx écoute uniquement sur certaines IP -> modifier la configuration serveur listen 0.0.0.0:80.

Une fois qu’une autre machine de ton réseau local accède bien à ta page en utilisant ton adresse IP locale, tu peux ajouter des redirections sur ton routeur.

Bon j’ai fait tout un tas de tests… Et j’ai un truc qui fonctionne assez pour que j’arrête.

Concrètement j’ai utilisé le proxy en go, il fonctionne pas mal. Et même en https !

Mais justement, que en https avec WSL. Le port 80 semble inaccessible… Bizarre. J’investiguerai peut être le problème plus tard.

En tous les cas voici le code du proxy:

    proxy.OnRequest(goproxy.ReqHostIs("gangbowl.local")).DoFunc(
        func(r *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, *http.Response) {
            log.Println("Redirecting call to gangbowl.local to ::1")
            r.URL.Host = "::1"
            r.Header.Set("Host","gangbowl.local")
            return r, nil
        },
    )

Merci à vous !

Oh et pour tester, @nohar m’a fait remarqué qu’il valait mieux faire cela, en effet ça fonctionne:

ALL_PROXY=localhost:9999 curl https://gangbowl.local
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte