LINUX.ORG.RU

iptables в lxc перекрывает iptables хоста

 ,


0

1

всем привет!

есть проблемка, если набрать в lxc:

iptables -A INPUT -p tcp -m tcp --dport 22 -j DROP

то отвалится ssh и на хосте и в lxc

Как сделать, что бы iptables в lxc не перекрывал iptables на хосте?

Хотел создать lxc для проекта и выдать доступы программеру, который будет создавать docker'ы для своей работы в контейнере. Но своими руками он может переломать все связи на моем хосте. Отдавать прогеру отдельный сервер под маленький проект, будет слишком жирно.



Последнее исправление: fraer (всего исправлений: 1)

А как контейнере настроена сеть?

Такое поведение должно быть при

lxc.net.0.type = none

vel ★★★★★
()
# lxc-checkconfig
....
Network namespace: enabled
....
Oleg_Iu
()
Ответ на: комментарий от vel

host:

cat /etc/debian_version
8.6

dpkg -l | grep lxc
ii  lxc 1:1.0.6-6+deb8u6 amd64 Linux Containers userspace tools

в /var/lib/lxc/LXC_NAME/config:

lxc.network.type = none

Пробовал если сеть завернута через bridge, то iptables всеравно перекрывает хостовый bridge

fraer
() автор топика
Ответ на: комментарий от fraer

lxc-1.0.6

это сентябрь 2014 г. Может у тебя еще и ядро 2.6.x ? :)

Пробовал если сеть завернута через bridge, то iptables все равно перекрывает хостовый bridge

Конфиг покажи.

При включеном «Network namespace: enabled» (спасибо Oleg_Iu) и lxc.network.type не none так не должно быть!

Бридж в понятиях старого lxc - это «lxc.network.type=veth»

Старый lxc - это до версии 3.x

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel

это сентябрь 2014 г. Может у тебя еще и ядро 2.6.x ? :)

нет :) чуть повыше, у меня 3.16.0-10-amd64 #1 SMP Debian 3.16.72-1 (2019-08-13) x86_64 GNU/Linux

Namespaces стоит enabled

cat /etc/lxc/default.conf

lxc.network.type = veth
lxc.network.link = lxcbr0
lxc.network.flags = up
lxc.network.hwaddr = 00:16:3e:xx:xx:xx

cat /var/lib/lxc/test/config

# Distribution configuration
lxc.include = /usr/share/lxc/config/debian.common.conf
lxc.arch = linux64

# Container specific configuration
lxc.rootfs = /var/lib/lxc/test/rootfs
lxc.utsname = test

#lxc.network.type = empty
## Network configuration
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.network.hwaddr = 00:16:3e:43:53:40

вообще я даже на jessie могу установить любой дистрибутив lxc ( даже bullseye ) командой:

lxc-create --template download --name test

делал сеть по инстукции: https://ealebed.github.io/posts/2017/настройка-сети-для-lxc-контейнеров-в-deb...

т.к. утилита lxc-net доступна только в stretch

fraer
() автор топика
Последнее исправление: fraer (всего исправлений: 1)
Ответ на: комментарий от fraer

вообщем вы правильно сказали, если делать сеть через bridge то iptables lxc не перекрывает lxc хоста.

Не пойму только как открыть для docker порты из мира. С хоста ip докеров не пингуются. А из lxc конечно есть пинг. Дело наверняка в iptables.

iptables-host ∨∨∨∨∨∨∨∨∨∨∨

iptables-save
# Generated by iptables-save v1.4.21 on Thu Apr 29 18:49:45 2021
*mangle
:PREROUTING ACCEPT [59111:185061933]
:INPUT ACCEPT [4420:343076]
:FORWARD ACCEPT [54691:184718857]
:OUTPUT ACCEPT [3552:549871]
:POSTROUTING ACCEPT [58243:185268728]
-A POSTROUTING -o lxcbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
COMMIT
# Completed on Thu Apr 29 18:49:45 2021
# Generated by iptables-save v1.4.21 on Thu Apr 29 18:49:45 2021
*nat
:PREROUTING ACCEPT [867:50713]
:INPUT ACCEPT [584:34878]
:OUTPUT ACCEPT [166:12470]
:POSTROUTING ACCEPT [388:24645]
-A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE
COMMIT
# Completed on Thu Apr 29 18:49:45 2021
# Generated by iptables-save v1.4.21 on Thu Apr 29 18:49:45 2021
*filter
:INPUT ACCEPT [4279:332456]
:FORWARD ACCEPT [333:18475]
:OUTPUT ACCEPT [3557:550915]
-A INPUT -i lxcbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i lxcbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i lxcbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A INPUT -i lxcbr0 -p udp -m udp --dport 67 -j ACCEPT
-A FORWARD -o lxcbr0 -j ACCEPT
-A FORWARD -i lxcbr0 -j ACCEPT
COMMIT
# Completed on Thu Apr 29 18:49:45 2021

iptables-lxc ∨∨∨∨∨∨∨∨∨∨∨

iptables-save
# Generated by iptables-save v1.8.2 on Thu Apr 29 16:54:03 2021
*mangle
:PREROUTING ACCEPT [8475:51005444]
:INPUT ACCEPT [8474:51005113]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [7104:415867]
:POSTROUTING ACCEPT [7104:415867]
COMMIT
# Completed on Thu Apr 29 16:54:03 2021
# Generated by iptables-save v1.8.2 on Thu Apr 29 16:54:03 2021
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 2222 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 172.17.0.2:2222
COMMIT
# Completed on Thu Apr 29 16:54:03 2021
# Generated by iptables-save v1.8.2 on Thu Apr 29 16:54:03 2021
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j DROP
-A INPUT -p tcp -m tcp --dport 22 -j DROP
-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 DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 2222 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -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 -j RETURN
-A DOCKER-USER -j RETURN
COMMIT
# Completed on Thu Apr 29 16:54:03 2021

Как мне открыть порт 2222, для того что бы я зашел из мира в докер с ипом 172.17.0.2 ?

fraer
() автор топика
Последнее исправление: fraer (всего исправлений: 1)
Ответ на: комментарий от fraer

и вообще, интерфейса docker0 нету на хосте, а в lxc есть:

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:11ff:fe37:9649  prefixlen 64  scopeid 0x20<link>
        ether 02:42:11:37:96:49  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5  bytes 438 (438.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

fraer
() автор топика
Ответ на: комментарий от fraer

А докер тут причем? Или ты про контейнер созданный в lxc?

У тебя lxcbr0 - хостовый интерфейс. Кто из интерфейсов в него включен (brctl show) ?

Типовой вариант, это когда в него включен сетевой интерфейс физической локальной сети (типа eth0) и сам хост работает с локальной сетью через него (на lxcbr0 ip-адрес из локальной сети). В этом случае контейнеры имеют адреса из локальной сети и NAT не нужен.

Если в lxcbr0 нет физического интерфейса, то нужно нужно настраивать NAT для контейнеров. В этом случае на lxcbr0 должен быть ip-адрес не из локальной сети. Для исходящих соединений нужен SNAT/MASQUERADE и DNAT для всех портов контейнеров к которым нужно получить доступ из локальной сети.

vel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.