iptables 및 openvpn을 사용하여 도커가 스스로 노출되는 것을 방지하는 방법

iptables 및 openvpn을 사용하여 도커가 스스로 노출되는 것을 방지하는 방법

목표는 다음과 같습니다.

  1. VPN 클라이언트가 인터넷에 액세스하도록 허용
  2. Docker 서브넷(예: 178.18.0.0/24)에 액세스할 수 있습니다.
  3. iptables를 수정하여 docker가 자동으로 노출되는 것을 방지합니다.
  4. Docker 포트가 인터넷에 노출되도록 수동으로 허용

나는 예제 구성으로 1을 해결했습니다.여기, 2 서브넷을 푸시하여server.conf

질문:eth0 및 tun0에서 인터넷 연결을 끊지 않고 도커가 INPUT DROP iptable 체인을 자동으로 우회하여 포트를 노출하는 것을 방지하려면 어떻게 해야 합니까?

시도:

  • 나는 문서화된 도커 방식을 시도했습니다.https://docs.docker.com/network/iptables/하지만적용하자마자 VPN 클라이언트의 모든 인터넷 연결이 끊어집니다.- Docker의 서브넷에는 정상적으로 액세스할 수 있지만 인터넷에는 액세스할 수 없습니다. DROP을 ACCEPT로 되돌리면 그 반대가 됩니다. 즉, 인터넷은 작동하지만 docker 서브넷은 작동하지 않고 노출됩니다.
  • 또한 여기에 설명된 대로 추가하려고 했습니다 iptables -I DOCKER-USER -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT.https://riptutorial.com/docker/topic/9201/iptables-with-docker- 슬프게도 아무것도 바뀌지 않았어

내 docker 관련 iptables 항목은 현재 다음과 같습니다.

iptables -I DOCKER-USER -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I DOCKER-USER -i eth0 ! -s 10.0.0.0/24 -j DROP

내 네트워크는 다음과 같습니다.

eth0 - publicly facing
tun0 - vpn on 10.0.0.0/24
docker - 172.18.0.0/24

현재 전체 구성은 다음과 같습니다.

#!/bin/bash

# A Sample OpenVPN-aware firewall.

# eth0 is connected to the internet.
# eth1 is connected to a private subnet.

# Change this subnet to correspond to your private
# ethernet subnet.  Home will use 10.0.1.0/24 and
# Office will use 10.0.0.0/24.
PRIVATE=10.0.0.0/24

# Loopback address
LOOP=127.0.0.1

# Delete old iptables rules
# and temporarily block all traffic.
iptables -P OUTPUT DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -F

# Set default policies
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP

# Prevent external packets from using loopback addr
iptables -A INPUT -i eth0 -s $LOOP -j DROP
iptables -A FORWARD -i eth0 -s $LOOP -j DROP
iptables -A INPUT -i eth0 -d $LOOP -j DROP
iptables -A FORWARD -i eth0 -d $LOOP -j DROP

# Anything coming from the Internet should have a real Internet address
iptables -A FORWARD -i eth0 -s 192.168.0.0/16 -j DROP
iptables -A FORWARD -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A FORWARD -i eth0 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP

# Block outgoing NetBios (if you have windows machines running
# on the private subnet).  This will not affect any NetBios
# traffic that flows over the VPN tunnel, but it will stop
# local windows machines from broadcasting themselves to
# the internet.
iptables -A FORWARD -p tcp --sport 137:139 -o eth0 -j DROP
iptables -A FORWARD -p udp --sport 137:139 -o eth0 -j DROP
iptables -A OUTPUT -p tcp --sport 137:139 -o eth0 -j DROP
iptables -A OUTPUT -p udp --sport 137:139 -o eth0 -j DROP

# Check source address validity on packets going out to internet
iptables -A FORWARD -s ! $PRIVATE -i eth1 -j DROP

# Allow local loopback
iptables -A INPUT -s $LOOP -j ACCEPT
iptables -A INPUT -d $LOOP -j ACCEPT

# Allow incoming pings (can be disabled)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# Allow services such as www and ssh (can be disabled)
iptables -A INPUT -p tcp --dport http -j ACCEPT
iptables -A INPUT -p tcp --dport ssh -j ACCEPT

# Allow incoming OpenVPN packets
# Duplicate the line below for each
# OpenVPN tunnel, changing --dport n
# to match the OpenVPN UDP port.
#
# In OpenVPN, the port number is
# controlled by the --port n option.
# If you put this option in the config
# file, you can remove the leading '--'
#
# If you taking the stateful firewall
# approach (see the OpenVPN HOWTO),
# then comment out the line below.

iptables -A INPUT -p udp --dport 1194 -j ACCEPT

# Allow packets from TUN/TAP devices.
# When OpenVPN is run in a secure mode,
# it will authenticate packets prior
# to their arriving on a tun or tap
# interface.  Therefore, it is not
# necessary to add any filters here,
# unless you want to restrict the
# type of packets which can flow over
# the tunnel.

iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A INPUT -i tap+ -j ACCEPT
iptables -A FORWARD -i tap+ -j ACCEPT

# Allow packets from private subnets
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -j ACCEPT

# Keep state of connections from local machine and private subnets
iptables -A OUTPUT -m state --state NEW -o eth0 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state NEW -o eth0 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Docker allow only VPN by default
    iptables -I DOCKER-USER -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -I DOCKER-USER -i eth0 ! -s 10.0.0.0/24 -j DROP

# Masquerade local subnet
iptables -t nat -A POSTROUTING -s $PRIVATE -o eth0 -j MASQUERADE

감사해요!

답변1

해결책은 대신 ufw 뒤에 도커를 적절하게 배치하는 것이었고, 스택 오버플로에 대한 훌륭한 글이 게시되었습니다.https://stackoverflow.com/a/58098930/11821602다음에서 유래되었습니다:https://github.com/moby/moby/issues/4737#issuecomment-419705925

/etc/ufw/after.rules 끝에 다음을 추가합니다(eth0을 외부 인터페이스로 교체).

# Put Docker behind UFW
*filter
:DOCKER-USER - [0:0]
:ufw-user-input - [0:0]

-A DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-USER -m conntrack --ctstate INVALID -j DROP
-A DOCKER-USER -i eth0 -j ufw-user-input
-A DOCKER-USER -i eth0 -j DROP
COMMIT

그리고 다음 중 일부 또는 전부를 실행 취소합니다.

  • /etc/docker/daemon.json에서 "iptables": "false" 제거
  • /etc/default/ufw에서 DEFAULT_FORWARD_POLICY="DROP"으로 되돌리기
  • /etc/ufw/before.rules에 대한 docker 관련 변경 사항을 제거합니다.

재부팅 후 모든 것이 제대로 작동하는지 테스트하십시오.

관련 정보