Skip to content

Instantly share code, notes, and snippets.

@diyfr
Last active May 28, 2021 13:12
Show Gist options
  • Save diyfr/7e4daa4a3bd59cde459e5774ac975775 to your computer and use it in GitHub Desktop.
Save diyfr/7e4daa4a3bd59cde459e5774ac975775 to your computer and use it in GitHub Desktop.
Home Assistant via tunnel ssh

Accéder à son Home Assistant hébérgé derrière sa box Internet

Prerequis :

1- Home assistant installé et fonctionnel depuis votre réseau interne
2- Serveur distant avec docker , docker-compose et traefik

Serveur distant

Construire une image dédiée

builder une image docker à partir de ce Dockerfile

from linuxserver/openssh-server:latest
expose 2222 8080

Builder l'image

docker build . -t hatunnel:latest

Lancer votre backend derrière traefik

Ajouter dans votre docker-compose.yml (adaptez le chemin /path/data/hatunnel )

version: '3.7'
services:
# ..... Traefik et autres applications

  hatunnel:
    image: hatunnel:latest
    container_name: hatunnel
    networks:
      - traefik
    ports:
      - 6222:2222
    restart: always
    volumes:
      - "/path/data/hatunnel:/config"
    environment:
      - PUID=1000  # se référer à la doc de l'image de base 
      - PGID=1000 # se référer à la doc de l'image de base
      - TZ=Europe/Paris # se référer à la doc de l'image de base
      - USER_PASSWORD=achanger  # se référer à la doc de l'image de base 
      - USER_NAME=myUser  # se référer à la doc de l'image de base
      - PASSWORD_ACCESS=true # se référer à la doc de l'image de base
    labels:
      - "traefik.http.routers.hatunnel.rule=Host(`home-assistant.domain.tld`)"
      - "traefik.http.routers.hatunnel.tls=true"
      - "traefik.http.routers.hatunnel.tls.certresolver=letsencrypt"
      - "traefik.http.routers.hatunnel.entrypoints=websecure"
      - "traefik.http.routers.hatunnel.middlewares=security@file" #, compression@file"
      - "traefik.http.services.hatunnel.loadbalancer.server.port=8080"
      - "traefik.http.routers.hatunnel.service=hatunnel"
      - "traefik.docker.network=traefik"
      - "traefik.http.routers.hatunnel-http.rule=Host(`home-assistant.domain.tld`)"
      - "traefik.http.routers.hatunnel-http.middlewares=https-redirect@file"

Modifier la config d'openssh-server

sed -i 's/#AllowAgentForwarding yes/AllowAgentForwarding yes/g' /path/data/hatunnel/ssh_host_keys/sshd_config
sed -i 's/AllowTcpForwarding no/AllowTcpForwarding yes/g' /path/data/hatunnel/ssh_host_keys/sshd_config
sed -i 's/GatewayPorts no/GatewayPorts yes/g' /path/data/hatunnel/ssh_host_keys/sshd_config
sed -i 's/X11Forwarding no/X11Forwarding yes/g' /path/data/hatunnel/ssh_host_keys/sshd_config

relancer le service

docker restart hatunnel

Depuis votre serveur interne

!IMPORTANT! conf rapide

se placer en root sur votre serveur interne, c'est le compte utilisé pour le service systemd

Création de clés et installation sur votre serveur distant

ssh-keygen -b 4096

tout valider par défaut (pas de passphrase)
Installer votre clé sur le serveur distant

ssh-copy-id -p 6222 myUser@home-assistant.domain.tld

Saisir le mot de passe injecté en variable d'environnement dans le docker-compose (ici achanger)
Test de la connexion

ssh -p 6222 myUser@home-assistant.domain.tld

La connexion doit se faire sans le mot de passe

Lancer le tunnel SSH

ssh -N -T -R 8080:localhost:8123 -p 6222 myUser@home-assistant.domain.tld

puis tester la connexion http depuis votre serveur distant ici https://home-assistant.domain.tld

On peut ensuite créer un service /etc/systemd/system/run-tunnel-ha.service

[Unit]
Description=Start HA tunnel
After=network.target

[Service]
ExecStart=/usr/bin/ssh -N -T -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -R 8080:localhost:8123 -p 6222 myUser@home-assistant.domain.tld

# Restart every >2 seconds to avoid StartLimitInterval failure
RestartSec=5
Restart=always

[Install]
WantedBy=multi-user.target

activer la prise en compte de ce nouveau service et le redémarrer

systemctl daemon-reload 
systemctl enable run-tunnel-ha.service

Nota: Un redémarrage du service côté serveur interne me signale que le port 8080 est utilisé sur le serveur distant. J'ai du redémarrer le traefik....

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment