Разрешить трафик с локального хоста на док-контейнер - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь разместить свои бэкэнд-сервисы на сервере Ubuntu 16.04 с докером. Существует nginx, который обрабатывает все HTTP-запросы и передает их через прокси-серверы.

С iptables INPUT и OUTPUT ACCEPT - все работает отлично, однако, если я пытаюсь ограничить любой доступ, кроме HTTP / HTTPS, к nginx - связь между localhost и разрывы контейнеров Docker.

Это мой iptables :

-P INPUT DROP
-P FORWARD DROP
-P OUTPUT DROP
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER

# Drop empty flag packets and sync-flood packets
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP

# Allow HTTP/HTTPS
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8080 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A OUTPUT -p tcp -m tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 8080 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT


# Allow DNS
-A INPUT -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 53 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT

# Block ping
-A INPUT -p icmp -m state --state NEW -m icmp --icmp-type 8 -j DROP

# Allow any loopback
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

# Allow forwarding from/to localhost to/from docker
-A FORWARD -i docker0 -o lo -j ACCEPT
-A FORWARD -i lo -o docker0 -j ACCEPT

# Docker-generated rules    
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o br-30c18a0778b5 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-30c18a0778b5 -j DOCKER
-A FORWARD -i br-30c18a0778b5 ! -o br-30c18a0778b5 -j ACCEPT
-A FORWARD -i br-30c18a0778b5 -o br-30c18a0778b5 -j ACCEPT
-A DOCKER -d 172.18.0.2/32 ! -i br-30c18a0778b5 -o br-30c18a0778b5 -p tcp -m tcp --dport 27017 -j ACCEPT
-A DOCKER -d 172.18.0.3/32 ! -i br-30c18a0778b5 -o br-30c18a0778b5 -p tcp -m tcp --dport 4000 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-30c18a0778b5 ! -o br-30c18a0778b5 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-30c18a0778b5 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN

Контейнер, которому я передаю прокси-сервер, работает на порте 4000, сопоставленном с 3003 в docker-compose.yml:

 webapi:
    build: .
    depends_on:
      - mongo
    deploy:
      replicas: 1
      resources:
        limits:
          cpus: "0.1"
          memory: 256M
      restart_policy:
        condition: on-failure
    ports:
      - "3003:4000"
    networks:
      - webnet

Но если я запускаю curl http://localhost:3003/api/healthcheck - я получаю curl: (56) Recv failure: Connection reset by peer, что меня смущает, поскольку у меня нет никаких ограничений для loopback или переадресации на docker0.

Единственная идея, которая у меня есть: пересылка с порта 4000 контейнера на локальный хост 3003 заблокирована, но я не могу придумать, как это разрешить.

1 Ответ

0 голосов
/ 06 января 2019

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

  port:
    - "127.0.0.1:3003:4000"

Для отладки правил брандмауэра, я бы поставил туда вход в систему, прежде чем отбрасывать пакеты. Docker использует гораздо больше, чем просто мост docker-0, и существуют различные правила nat / mangle и прокси-процессы, участвующие в публикации портов.

...