Настройка lxc-контейнеров в разных vlan

Задача: настроить два контейнера lxc в разных вланах, чтобы на них был интеренет, их было видно с хостовой машины, они не должны видеть друг друга.
Для этого каждый для каждого контейнера выделим отдельную подсеть и настроим отдельный влан.
Для теста настроим два контейнера

Что используем:
с1 - имя первого контейнера
с2 - имя второго контейнера

enp0s3 - имя интерфейса хостевой машины

192.168.10.3 - IP хостевой машины, который смотрит наружу (WAN)


Настройка интерфейса хостовой машины enp0s3:

DEVICETYPE="OVSIntPort"
OVS_BRIDGE=ovs-br0_c1
OVS_BRIDGE=ovs-br0_c2

Где: 
ovs-br0_c1 - шлюз для с1
ovs-br0_c2 - шлюз для с2

Настройка интерфейсов:
  • nano ifcfg-ovs-br0_c1
DEVICE="ovs-br0_c1"
DEVICETYPE=ovs
NM_CONTROLLED="no"
PEERDNS=yes
ONBOOT="yes"
TYPE="OVSBridge"
BOOTPROTO="static"
IPADDR=10.101.0.1
NETMASK=255.255.255.0
HOTPLUG="no"

  • nano ifcfg-ovs-br0_c2
DEVICE="ovs-br0_c2"
DEVICETYPE=ovs
NM_CONTROLLED="no"
PEERDNS=yes
ONBOOT="yes"
TYPE="OVSBridge"
BOOTPROTO="static"
IPADDR=10.102.0.1
NETMASK=255.255.255.0
HOTPLUG="no"

Где:

10.101.0.1 - шлюз для c1

10.102.0.1 - шлюз для c2

Настройка config-файла контейнеров:

lxc.network.link - закомментировать

для с1:

lxc.network.name = eth1

lxc.network.ipv4=10.101.0.2/24

lxc.network.ipv4.gateway=10.101.0.1

lxc.network.script.up=/etc/lxc/ovsup_c1

для с2:

lxc.network.name = eth1

lxc.network.ipv4 = 10.102.0.2/24

lxc.network.ipv4.gateway = 10.102.0.1

lxc.network.script.up=/etc/lxc/ovsup_c2


Настройка скриптов в /etc/lxc

  • nano ovsup_c1

#!/bin/bash

BRIDGE="ovs-br0_c1"

ovs-vsctl --may-exist add-br $BRIDGE

ovs-vsctl --if-exists del-port $BRIDGE $5

ovs-vsctl --may-exist add-port $BRIDGE $5 tag=1

  • nano ovsup_c2

#!/bin/bash

BRIDGE="ovs-br0_c2"

ovs-vsctl --may-exist add-br $BRIDGE

ovs-vsctl --if-exists del-port $BRIDGE $5

ovs-vsctl --may-exist add-port $BRIDGE $5 tag=2

Где:

tag=1 - тег для c1

tag=2  - тег для c2

 

Добавляем теги на шлюзы контейнеров:

ovs-vsctl set port ovs-br0_c1 tag=1

ovs-vsctl set port ovs-br0_c2 tag=2

 

Пробрасываем интернет в контейнеры:

  • nano /etc/iptables.sh

#!/bin/bash

#

# Объявление переменных

export IPT="iptables"


# Интерфейс который смотрит в интернет

export WAN=enp0s3

export WAN_IP=192.168.10.3


# lxc сеть

export LAN1=ovs-br0_c1

export LAN2=ovs-br0_c2

export LAN1_IP_RANGE=10.0.0.0/8


# Очистка всех цепочек iptables

$IPT -F

$IPT -F -t nat

$IPT -F -t mangle

$IPT -X

$IPT -t nat -X

$IPT -t mangle -X


# Установим политики по умолчанию для трафика, не соответствующего ни одному из правил

$IPT -P INPUT DROP

$IPT -P OUTPUT DROP

$IPT -P FORWARD DROP


# разрешаем локальный траффик для loopback

$IPT -A INPUT -i lo -j ACCEPT

$IPT -A OUTPUT -o lo -j ACCEPT


# Разрешаем исходящие соединения самого сервера

$IPT -A OUTPUT -o $WAN -j ACCEPT


# Разрешаем доступ из lxc наружу и обратно

$IPT -A FORWARD -i $LAN1 -o $WAN -j ACCEPT

$IPT -A FORWARD -i $WAN -o $LAN1 -j ACCEPT

$IPT -A INPUT -i $LAN1 -j ACCEPT

$IPT -A OUTPUT -o $LAN1 -j ACCEPT


$IPT -A FORWARD -i $LAN2 -o $WAN -j ACCEPT

$IPT -A FORWARD -i $WAN -o $LAN2 -j ACCEPT

$IPT -A INPUT -i $LAN2 -j ACCEPT

$IPT -A OUTPUT -o $LAN2 -j ACCEPT


# Включаем NAT

$IPT -t nat -A POSTROUTING -o $WAN -s $LAN1_IP_RANGE -j MASQUERADE


# Пробрасываем порты в контейнер lxc_centos

#$IPT -t nat -A PREROUTING -p tcp --dport 23543 -i ${WAN} -j DNAT --to 10.1.1.2:22

#$IPT -t nat -A PREROUTING -p tcp --dport 80 -i ${WAN} -j DNAT --to 10.1.1.2:80

#$IPT -t nat -A PREROUTING -p tcp --dport 443 -i ${WAN} -j DNAT --to 10.1.1.2:443


# Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении.

# Пропускать все уже инициированные соединения, а также дочерние от них

$IPT -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT

# Пропускать новые, а так же уже инициированные и их дочерние соединения

$IPT -A OUTPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT

# Разрешить форвардинг для уже инициированных и их дочерних соединений

$IPT -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT

# Включаем фрагментацию пакетов. Необходимо из за разных значений MTU

$IPT -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu


# Отбрасывать все пакеты, которые не могут быть идентифицированы

# и поэтому не могут иметь определенного статуса.

$IPT -A INPUT -m state --state INVALID -j DROP

$IPT -A FORWARD -m state --state INVALID -j DROP


# Приводит к связыванию системных ресурсов, так что реальный

# обмен данными становится не возможным, обрубаем

$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

$IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP


# Рзрешаем пинги

$IPT -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

$IPT -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT

$IPT -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT


# Открываем порт для ssh

$IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT


# Записываем правила

/sbin/iptables-save  > /etc/sysconfig/iptables


Смотрим настройки интерфейсов в ovs

  • ovs-vsctl show

    Bridge "ovs-br0_c1"

        Port "ovs-br0_c1"

            tag: 1

            Interface "ovs-br0_c1"

                type: internal

        Port "veth5TMR0K"

            tag: 1

            Interface "veth5TMR0K"

    Bridge "ovs-br0_c2"

        Port "ovs-br0_c2"

            tag: 2

            Interface "ovs-br0_c2"

                type: internal

        Port "vethE8DCUU"

            tag: 2

            Interface "vethE8DCUU"




Комментарии

Популярные сообщения из этого блога

Accel-ppp команды

mikbill расшифровка завершений сессий

Zabbix agent установка и настройка