1 min read

Routing TCP (SSH) Traffic Menggunakan Traefik Di Docker

Halo semuanya,
Pada kali ini saya mau sharing bagaimana cara melakukan routing TCP Traffic di docker.

Biasanya kita di sebuah organisasi atau perusahaan mempunyai web server, host, dan aplikasi yang hanya bisa di akses melalui Private Network (VPN) agar aman dan tidak terexpose ke public.

pada contoh dibawah ini, saya akan memberikan contoh merouting port 22 dari gitlab, karena gitlab tersebut hanya bisa di akses menggunakan VPN dan gitlab nya harus di akses melalui custom domain gitlab.luqmanul.com (domain local yang hanya berlaku di dalam vpn tersebut) , jadi gitlab.luqmanul.com itu menggunakan ip webserver yang kita gunakan sebagai proxy, lalu dari webserver tersebut yang akan berkomunikasi dengan container/host gitlab.

Berikut ini contoh nya, pertama-tama kita atur dahulu traefik.yml seperti dibawah ini

# Docker configuration backend
providers:
  docker:
    network: privatenet
    constraints: Label(`privatenet`,`true`)

# API and dashboard configuration
api:
  dashboard: false
  insecure: false

# Nah kalian pertama harus definisikan dulu entrypoint nya
# misal saya mau routing traffic ssh, berarti saya harus menambahkan
# ssh.address = :22

entryPoints:
  http:
    address: ":80"
  https:
    address: ":443"
  ssh:
    address: ":22"

certificatesResolvers:
  letsencrypt:
    acme:
      email: admin@luqmanul.com
      storage: acme.json
      tlsChallenge: {}
  cloudflare:
    acme:
      email: admin@luqmanul.com
      storage: acme.json
      dnsChallenge:
        provider: cloudflare
        resolvers:
          - "1.1.1.1:53"
          - "1.0.0.1:53"
traefik.yml

Nah lalu tinggal menambahkan label di container / docker-compose.yml nya ya seperti dibawah ini

version: '3.6'

networks:
  privatenet:
    external: true

services:
  gitlab:
    logging:
      driver: "fluentd"
      options:
        fluentd-address: localhost:24224
        tag: gitlab
    container_name: gitlab
    image: 'gitlab/gitlab-ee:latest'
    restart: always
    hostname: 'gitlab.luqmanul.com'
    networks:
      - privatenet
    volumes:
      - ./_DATA/config:/etc/gitlab
      - ./_DATA/logs:/var/log/gitlab
      - ./_DATA/data:/var/opt/gitlab
    shm_size: '3G'
    labels:
      - traefik.docker.network=privatenet
      - traefik.http.services.gitlab.loadbalancer.server.port=80
      - traefik.http.routers.gitlab.rule=Host(`gitlab.luqmanul.com`)
      - traefik.http.routers.gitlab.entrypoints=https
      - traefik.http.routers.gitlab.tls=true
      - traefik.http.routers.gitlab.tls.certresolver=cloudflare
      - privatenet=true
      # label dibawah ini untuk memberitahu traefik untuk merouting 
      # port 22 yang masuk lewat domain gitlab.luqmanul.com
      # ke container gitlab ini, jadi kita tidak perlu
      # expose port 22 dari container ini ke host docker nya
      - traefik.tcp.routers.gitlab-ssh.rule=HostSNI(`*`)
      - traefik.tcp.routers.gitlab-ssh.entrypoints=ssh
      - traefik.tcp.routers.gitlab-ssh.service=gitlab-ssh-svc
      - traefik.tcp.services.gitlab-ssh-svc.loadbalancer.server.port=22

lalu teman-teman bisa langsung mencoba mengakses gitlab.luqmanul.com dengan port 22.