docker - перенаправление составных портов не работает, если не на localhost proxy-> vpn - PullRequest
1 голос
/ 10 января 2020

Я действительно не могу понять, почему все работает нормально на одном хосте, но порты фильтруются вне хоста (даже на виртуальной машине на том же хосте, но в режиме моста)


services:
  vpn:
    build: ./openvpn
    # cap_add, security_opt, and volume required for the image to function
    cap_add:
      - net_admin
    environment:
      OPENVPN_USERNAME: 'XXXXXX'
      OPENVPN_PASSWORD: 'XXXXXXXX'
      OPENVPN_PROVIDER: 'XXXXXXXXXXX'
      OPENVPN_CONFIG: 'Amsterdam'
      SQUID_EXT_PORT: "3001"
    networks:
      - dockerproxy

    sysctls:
      - net.ipv6.conf.all.disable_ipv6=0
    read_only: true
    tmpfs:
      - /run
      - /tmp
    restart: unless-stopped
    security_opt:
      - label:disable
    stdin_open: true
    tty: true
    ports:
      - "0.0.0.0:${SQUID_EXT_PORT:-3001}:3128"
    volumes:
      - /dev/net:/dev/net:z
      - /config
  squid:
    build: ./squid
    environment:
      SQUID_VERSION: '3.5.27'
      SQUID_CACHE_DIR: '/squid/var/cache/squid'
      SQUID_LOG_DIR: '/var/log/squid'
      SQUID_USER: 'proxy'
    tty: true
    network_mode: service:vpn
    volumes:
      - /srv/docker/squid/cache:/squid/var/cache/squid
    restart: unless-stopped

networks:
  dockerproxy:
    external:
      name: dockerproxy 

I проверил, что порты открыты

netstat -tulpn | grep 3001
tcp6       0      0 :::3001                 :::*                    LISTEN      -   
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS                    NAMES
cba39f7e94dc        amsterdam_squid     "/sbin/entrypoint.sh"    9 minutes ago       Up 9 minutes                                      amsterdam_squid_1
2856f2bb2b7c        amsterdam_vpn       "/usr/local/bin/open…"   9 minutes ago       Up 9 minutes (healthy)   0.0.0.0:3001->3128/tcp   amsterdam_vpn_1

Я подозреваю, что это может быть конфигурация docker iptables демона, которую я не изменил, так как я не очень уверен в них.

sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain /* managed by anbox-bridge */
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain /* managed by anbox-bridge */
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:bootps /* managed by anbox-bridge */
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps /* managed by anbox-bridge */

Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-USER  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             /* managed by anbox-bridge */
ACCEPT     all  --  anywhere             anywhere             /* managed by anbox-bridge */
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (3 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             172.28.0.2           tcp dpt:3128

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination         
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-ISOLATION-STAGE-2 (3 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-USER (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere  

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

nmap localhost -p 3001

Starting Nmap 7.60 ( https://nmap.org ) at 2020-01-10 17:06 CET
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00023s latency).

PORT     STATE SERVICE
3001/tcp open  nessus

Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds

, но не могу с другого хоста

map 192.168.1.14 -p 3001
Starting Nmap 7.80 ( https://nmap.org ) at 2020-01-10 10:54 EST
Nmap scan report for 192.168.1.14
Host is up (0.00076s latency).

PORT     STATE    SERVICE
3001/tcp filtered nessus

Nmap done: 1 IP address (1 host up) scanned in 0.26 seconds

I Я не замечал такого поведения раньше, и у меня всегда была возможность доступа ко всем моим docker сервисам на одной машине, кроме этой прокси-vpn.

1 Ответ

0 голосов
/ 16 января 2020

Проблема заключается в том, что контейнер VPN на самом деле не знает о сети, в которой он находится.

Другими словами, чтобы это работало, необходимо добавить маршрут в контейнер VPN (так как только он будет использоваться для работы в сети благодаря директиве network_mode: service:vpn, куда отправлять ответные пакеты (обычно хост-шлюз Docker). В противном случае ваши пакеты будут просто отброшены, из чего обычно приходит состояние nmap filtered. Как ни странно, пакеты даже не дойдут до вашего сервера squid, поэтому от этой части не будет логов. Это вывело меня из строя на долгое время, но тот факт, что пакеты не доходят до сервера squid, на самом деле происходит, поэтому я единственный, кто виноват в том, что был введен в заблуждение, я полагаю.

Эффективный способ добавить маршрут, который позволит вашему пакету вернуться:

/sbin/ip r a "${localNet}" via "${GW}" dev "${INT}"

, который я взял из замечательного Docker приложения https://github.com/haugene/docker-transmission-openvpn, где вы можете найти значение переменных в строке сценария выше.

...