Skip to content

Instantly share code, notes, and snippets.

@lfyuomr-gylo
Last active February 28, 2020 23:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lfyuomr-gylo/3e4d9a5b2670e72cf878bd59665c94c9 to your computer and use it in GitHub Desktop.
Save lfyuomr-gylo/3e4d9a5b2670e72cf878bd59665c94c9 to your computer and use it in GitHub Desktop.

iptables and network namespaces

Подготовка. Поднимаем виртуалку

  • Поднимаем виртуалку, в которой будем творить все наши непотребства, с помощью Vagrant.
    • Добавляем в Vagrantfile следующее содержимое:
    VAGRANT_API_VERSION = '2'
    Vagrant.configure(VAGRANT_API_VERSION) do |conf|
      conf.vm.box = 'ubuntu/bionic64'
    end
    
    • запускаем vagrant up
  • Подключаемся к виртуалке: vagrant ssh
  • Логинимся под рута в виртуалке: sudo su -

Часть 1. Управление firewall-ом

  • iptables -L --- посмотрим текущие настройки файервола
  • Дропаем output tcp-трафик с 8080-го порта:
    iptables -A OUTPUT -p tcp --sport 8080 -j DROP
    
  • Убеждаемся с помощью netcat, что через 8080-й порт траффик действительно не идет
    • Поднимаем сервер: netcat -lk 0.0.0.0 8080
    • Пытаемся подключиться с таймаутом: netcat -w=1 localhost 800
  • Удаляем это правило: iptables -D OUTPUT 1
  • (если будет хотя бы 3 студента с ноутбуками) Попробовать заблокировать двух из трёх студентов по подсети, чтобы только один смог подключиться ко мне по tcp
    • iptables -A INPUT -s subnet/mask -j DROP
    • если мы после этого хотим добавить одного из забаненных в whitelist, нужно добавлять правило через -I, чтобы оно оказалось раньше BLOCK-а: iptables -I INPUT -s student-ip -j ACCEPT

Часть 2. Network Namespaces

  • Посмотрим список сетевых интерфейсов ip link
  • Создадим два network namespace-а:
    • ip netns add ns-foo ; ip netns add ns-bar
    • ip netns list --- проверим, что они корректно создались
  • Убедимся, что в них никаких интерфейсов кроме loopback-а нету
    • ip netns exec ns-foo ip link --- запустить ip link в неймспейсе ns-foo
    • ip -n ns-foo link --- то же самое
  • Добавим виртуальный сетевой пайп veth () и соединим им неймспейсы:
    • ip link add name veth-foo type veth peer name veth-bar --- создаем veth tunnel
    • ip link set veth-foo netns ns-foo --- убираем veth-foo в неймспейс ns-foo
    • ip link set veth-bar netns ns-bar --- убираем veth-bar в неймспейс ns-bar
    • ip -n ns-foo address --- видим, что интерфейс есть, но он в состоянии DOWN и без IP-адреса
    • ip -n ns-foo address add 192.168.16.14/24 dev veth-foo --- конфигурируем IP-адрес veth-foo
    • ip -n ns-bar address add 192.168.16.88/24 dev veth-bar --- конфигурируем IP-адрес veth-bar
    • ip -n ns-foo link set veth-foo up --- включаем veth-foo
    • ip -n ns-bar link set veth-bar up --- включаем veth-bar
    • ip netns exec ns-foo ping 192.168.16.88 --- убеждаемся, что соединение между неймспейсами есть
    • ip netns exec ns-foo route --- видим, что veth-foo подтянулся в качестве дефолтного роута на сеть 192.168.16.0/24
  • Подключим хост к неймспейсам через виртуальный бридж:
    • ip -n ns-foo link del veth-foo --- удалим наш veth-тунель (второй конец удалится автоматически)
    • ip link add foobar-net-0 type bridge ; ip link set foobar-net-0 up --- создаем виртуальный бридж
    • Подключаем оба неймспейса к бриджу через veth:
    for ns in `echo -e 'foo\nbar'` ; do
        ip link add name veth-$ns type veth peer name veth-$ns-bridge
        ip link set veth-$ns netns ns-$ns
        ip link set veth-$ns-bridge master foobar-net-0
        ip -n ns-$ns link set veth-$ns up
        ip link set veth-$ns-bridge up
    done
    
    • Присваиваем ip-адреса сетевым интерфейсам:
    ip -n ns-foo address add 192.168.16.14/24 dev veth-foo
    ip -n ns-bar address add 192.168.16.88/24 dev veth-bar
    ip address add 192.168.16.1/24 dev foobar-net-0
    
    • Проверяем, что теперь с локалхоста можно достучаться внутрь сети:
    ping 192.168.16.88
    
  • Сделаем доступ изнутри неймспейсов во внешнюю сеть.
    • Настроим в неймспейсе default gateway route через бридж:
    ip -n ns-foo route add default via 192.168.16.1
    
    • Настраиваем NAT на хосте, чтобы транслировать трафик изнутри нейсмспейса в сеть
    # включаем ip forwarding
    sysctl -w net.ipv4.ip_forward=1
    iptables -t nat -A POSTROUTING -s 192.162.16.1/24 -o eth0 -j MASQUERADE
    

Часть 3. Проброс портов

Пробрасываем порт 8080 изнутри неймспейса в хостовый порт 8888

iptables -t nat -I OUTPUT -p tcp --dport 8888 -o lo -j DNAT --to 192.168.16.14:8080
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment