Проксирование всего трафика с 443 и 80 порта

Привет, форумчане

Пишу вам с просьбой помочь настроить проксирование всего трафика с 80 и 443 портов VPS на домашний сервер по туннелю.

Хочу организовать нормальный и удобный доступ по доменам к сервисам. Для этого выбрал вариант с VPS и туннелем до домашнего сервера. Автор форума в одном из видео озвучивал такой же вариант, но с обратным прокси на VPS. Но в таком случае трафик будет расшифровываться на VPS. Любой дамп памяти позволит хостеру еувидить данные. Поэтому хочу проксировать весь трафик, который приходит на 80 и 443 порт VPS на 80 и 443 порт много домашнего сервера по тунелю. Это позволит мне:

  1. Решить вопрос со своей лёгкой паранойей. Расшифровка трафика будет на обратном прокси, который находится у меня локально

  2. По идее я смогу запрашивать сертификаты Let’s encrypt с локального обратного прокси даже с учётом того, что он за NAT. То есть я смогу обращаться к своим локальным сервисам по нормальными сертификатам, а не самоподписанным

Я пробовал настроить 2 обратных прокси. Один на VPS, другой в локальной сети. Но обламался, так как в локальной сети самоподписанные SSL. Не получилось связать обратные прокси

В общем, какие прокси могут вслепую (если так можно выразиться), не расшифровывая трафик мне в этом помочь? Я нашел простую прогу gost. Как считаете, может ли это сработать?

services:
  forward-80:
    image: ginuerzh/gost
    command: -L=tcp://:80/10.0.0.2:80  # 10.0.0.2 — IP дома в тунеле
    network_mode: host
    restart: always

  forward-443:
    image: ginuerzh/gost
    command: -L=tcp://:443/10.0.0.2:443
    network_mode: host
    restart: always
1 лайк

Ну с ходу можно придумать несколько вариантов

От самого медленного, до самого быстрого

1. Traefik

# traefik.yml
---
entryPoints:
  https:
    address: ":443"

# dynamic.yml
---
tcp:
  routers:
    truenas:
      rule: "HostSNI(`example.com`)"
      entryPoints:
        - https
      service: backend1
      tls:
        passthrough: true

    proxmox:
      rule: "HostSNI(`api.example.com`)"
      entryPoints:
        - https
      service: backend2
      tls:
        passthrough: true

  services:
    backend1:
      loadBalancer:
        servers:
          - address: "10.0.0.10:443"

    backend2:
      loadBalancer:
        servers:
          - address: "10.0.0.20:8006"

2. Nginx

stream {
    map $ssl_preread_server_name $backend {
         ~^(.+)\.example\.com$ backend_wildcard;
        example.com backend1;
        api.example.com backend2;
        default backend_default;
    }

    upstream backend1 {
        server 10.0.0.10:443;
    }

    upstream backend2 {
        server 10.0.0.20:443;
    }

    upstream backend_default {
        server 10.0.0.30:443;
    }

    upstream backend_wildcard {
        server 10.0.0.50:443;
    }

    server {
        listen 443;
        proxy_pass $backend;

        ssl_preread on;
    }
}

3. HaProxy

frontend https_in
    bind *:443
    mode tcp

    # ждём ClientHello, чтобы прочитать SNI
    tcp-request inspect-delay 5s
    tcp-request content accept if { req.ssl_hello_type 1 }

    use_backend backend1 if { req.ssl_sni -i example.com }
    use_backend backend2 if { req.ssl_sni -i api.example.com }

    default_backend default_tls

backend backend1
    mode tcp
    server truenas 10.0.0.10:443

backend backend2
    mode tcp
    server proxmox 10.0.0.20:8006

backend default_tls
    mode tcp
    server default 10.0.0.30:443

4. iptables

sysctl -w net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 \
  -j DNAT --to-destination 10.0.0.10:443

iptables -A FORWARD -i eth0 -o wg0 -p tcp --dport 443 -d 10.0.0.10 -j ACCEPT
iptables -A FORWARD -i wg0 -o eth0 -p tcp --sport 443 -s 10.0.0.10 -j ACCEPT

iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE

Я бы рассмотрел 3 вариант если нужна гибкость и скорость и 4 вариант если нужна максимальная скорость без гибкости

Ну и с 80 портом аналогично с некоторыми упрощениями

Тут с ходу 2 варианта

  1. Получать LE сертификаты через DNS challenge
  2. Разрешить самоподписные сервтификаты - небезопасно
  3. Добавить корневой сертификат, которым подписали локальные, на хостинг (например, при помощи mkcert)

Но надо понимать, что трафик то будет ходить зашифрованный, но мы все равно имеет MITM в виде данного проксика и злоумышленник, в случае проникновения на сервер, сможет получить доступ к незашифрованному трафику

Не знаю, что это, может и сработает, а зачем, если есть 4 варианта выше

1 лайк

Хочу попробовать вариант с Iptables. У меня маленький VPS, поэтому выберу самый производительный вариант. Я не сильно знаком с Iptables. Хочу добавить эти цепочки сразу в конфиг WG. Подскажите, они не будут конфликтовать с текущей настройкой?

Это сервер

[Interface]
PrivateKey = secretkey
Address = 10.0.0.1/24
ListenPort = 51800

#Стандартные цепочки, которые использую. Если честно - у кого-то подсмотрел
PostUp = iptables -A FORWARD -i %i -j ACCEPT;\
iptables -t nat -A POSTROUTING -o enp3s0 -j MASQUERADE;\

#Добавляю Ваши для 443, 80 и 21000 порта (Syncthing)
iptables -t nat -A PREROUTING -i enp3s0 -p tcp --dport 443 \
  -j DNAT --to-destination 10.0.0.3:443;\
iptables -A FORWARD -i enp3s0 -o wg0 -p tcp --dport 443 -d 10.0.0.3 -j ACCEPT;\
iptables -A FORWARD -i wg0 -o enp3s0 -p tcp --sport 443 -s 10.0.0.3 -j ACCEPT;\

iptables -t nat -A PREROUTING -i enp3s0 -p tcp --dport 80 \
  -j DNAT --to-destination 10.0.0.3:80;\
iptables -A FORWARD -i enp3s0 -o wg0 -p tcp --dport 80 -d 10.0.0.3 -j ACCEPT;\
iptables -A FORWARD -i wg0 -o enp3s0 -p tcp --sport 80 -s 10.0.0.3 -j ACCEPT;\

iptables -t nat -A PREROUTING -i enp3s0 -p tcp --dport 21000 \
  -j DNAT --to-destination 10.0.0.3:22000;\
iptables -A FORWARD -i enp3s0 -o wg0 -p tcp --dport 22000 -d 10.0.0.3 -j \ ACCEPT;\
iptables -A FORWARD -i wg0 -o enp3s0 -p tcp --sport 22000 -s 10.0.0.3 -j \ ACCEPT;\

iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE;

#Удаляю цепочки после того, как гасится интерфейс. 
#Копирую все то же самое, только ключ -А меняю на -D. Ниже только 2 цепочки, чтобы не спамить)
PostDown = iptables -D FORWARD -i %i -j ACCEPT; \
iptables -t nat -D POSTROUTING -o enp3s0 -j MASQUERADE


[Peer]
PublicKey = peer_publickey
AllowedIPs = 10.0.0.3/32, 192.168.31.202/32

Роман, спасибо Вам огромное. Все получилось через Iptables

Не успел добраться до предыдущего сообщения

Я бы вынес этот скрипт еще в файл, а в самом wg указал бы просто вызов файла

И финальный вариант выглядит правильным.

Но получается, что из wg сети тоже проброс внутрь работает, так и задумано?

1 лайк

Да. Я ранее использовал только WG. Из сети WG давал доступ к 192.168.31.202 для доступа по локальным доменам. Весь DNS тунелировал на этот IP. Также на этом IP обратный прокси и Adguardhome.