Ответы пользователя по тегу Linux
  • Правильно ли я все сделал в iptables?

    EvilMan
    @EvilMan
    Если ставите политику DROP и на OUTPUT, то нужно в неё добавить симметричные разрешающие правила. Например, если у вас есть правило iptables -A INPUT -p tcp --dport 22 -j ACCEPT, то нужно будет и правило iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT. Но обычной практикой является то, что OUTPUT оставляют пустым с политикой ACCEPT.

    Так же обычно добавляют правило типа iptables -A INPUT -i lo -j ACCEPT для того, чтобы разрешить коммуникации между процессами на самом хосте, и правило
    iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    для того, чтобы разрешить ответные пакеты.

    iptables-save не сохраняет изменения, а только выводит текущий набор правил на стандартный вывод. То, где хранятся настройки iptables зависит от дистрибутива Linux. Например, в Debian-подобных дистрибутивах лучше поставить пакеты netfilter-persistent и iptables-persistent, чтобы можно было загружать настройки файерволла при загрузке.

    В общем, iptables и настройка файерволла требуют хороших знаний по сетям и протоколам, и с наскока их не получится освоить, а только прочитав документацию (благо, есть неплохой перевод iptables tutorial на opennet.ru).
    Ответ написан
    Комментировать
  • Как настроить переадресацию портов в linux?

    EvilMan
    @EvilMan
    iptables -t nat -A OUTPUT --dst $vm-ip-addr -p tcp --dport 8080 -j DNAT --to-destination $vm-ip-addr:80
    Ответ написан
    2 комментария
  • Объединение интернет каналов до определенных сетей в Debian Wheezy?

    EvilMan
    @EvilMan
    Тут единственный вариант - делать round-robin маркировку пакетов до этих подсетей. Просто продублировать правила не прокатит - будет срабатывать только первое, а до остальных дело не дойдёт. Чистыми средствами iproute это так же не разрулить - multipath routing работает с потоками, а не с отдельными пакетами.
    Схема более-менее стандартная: три таблицы, в каждой по дефолтному маршруту. А так же три правила маршрутизации по метке. В iptables прописываете что-то вроде этого:
    iptables -t mangle -A PREROUTING --dst <subnet/prefix> -m statistic --mode nth --every 3 -j MARK --set-mark 0x1
    iptables -t mangle -A PREROUTING --dst <subnet/prefix> -m mark ! --mark 0x1 -m statistic --mode nth --every 2 -j MARK --set-mark 0x2
    iptables -t mangle -A PREROUTING --dst <subnet/prefix> -m mark ! --mark 0x1 -m mark ! --mark 0x2 -j MARK --set-mark 0x3

    Этим вы обеспечиваете равномерную маркировку на три метки на уровне пакетов до подсети.
    Но если у вас на этом маршрутизаторе ещё и выполняется NAT в разные адреса, то не получится, так как трассировщик соединений (conntrack) так же работает с потоками, а не отдельными пакетами. В этом случае задача становится нетривиальной. В случае, если NAT выполняется в один адрес, то должно прокатить.
    Ответ написан
  • Iptables. Доступ в интернет

    EvilMan
    @EvilMan
    Разрешите ICMP и UDP для DNS. Так же не совсем понятно, как вы разрулили маршрутизацию по этим каналам. Желательно показать ip -4 a ls, ip -4 r ls table all и ip -4 ru ls, если не поможет разрешение дополнительных протоколов.
    Ответ написан
    Комментировать
  • Как редиректить исходящий траффик с помощью iptables?

    EvilMan
    @EvilMan
    В общем, с указанием ---dst 127.0.0.1 не работает. Возможно, надо что-то шаманить в sysctl. Чтобы работало, надо указывать адрес, который у Вас висит на каком-нибудь другом интерфейсе. Источник такого поведения сходу определить трудно, нужно глубже копать, но что-то настроения нет. Может потом как-нибудь.

    Небольшой тест, который я у себя провёл.
    ~$ ip -4 a ls dev lo
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
        inet 127.0.0.1/8 scope host lo
    ~$ ip -4 a ls dev eth0.200
    4: eth0.200@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
        inet 172.27.65.228/16 brd 172.27.255.255 scope global eth0.200
    ~$ sudo iptables -t nat -L OUTPUT -n -v
    Chain OUTPUT (policy ACCEPT 295 packets, 17876 bytes)
     pkts bytes target     prot opt in     out     source               destination
       28  1660 DNAT       tcp  --  *      *       0.0.0.0/0            127.0.0.1            tcp dpt:65001 to:1.1.1.1:8001
        2   120 DNAT       tcp  --  *      *       0.0.0.0/0            172.27.65.228        tcp dpt:65001 to:1.1.1.1:8002

    Проверяем первый случай (где в правиле dst 127.0.0.1). При этом в тисипидампе глухо, а в таблице трассировщика не появляется записи о потоке.
    ~$ telnet 127.0.0.1 65001
    ~$ sudo conntrack -L --orig-dst 127.0.0.1
    conntrack v1.2.1 (conntrack-tools): 0 flow entries have been shown.

    Теперь другой вариант, когда dst 172.27.65.228. В тисипидампе видим уходящие пакеты, а в таблице трассировщика соединений - запись о потоке.
    ~$ telnet 172.27.65.228 65001
    ~$ sudo tcpdump -ni eth0.200 'ip host 1.1.1.1'
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0.200, link-type EN10MB (Ethernet), capture size 65535 bytes
    19:21:59.848777 IP 172.27.65.228.48735 > 1.1.1.1.8002: Flags [S], seq 3790799685, win 43690, options [mss 65495,sackOK,TS val 1388718972 ecr 0,nop,wscale 7], length 0
    19:22:00.850050 IP 172.27.65.228.48735 > 1.1.1.1.8002: Flags [S], seq 3790799685, win 43690, options [mss 65495,sackOK,TS val 1388719974 ecr 0,nop,wscale 7], length 0
    19:22:02.852057 IP 172.27.65.228.48735 > 1.1.1.1.8002: Flags [S], seq 3790799685, win 43690, options [mss 65495,sackOK,TS val 1388721976 ecr 0,nop,wscale 7], length 0
    19:22:06.860066 IP 172.27.65.228.48735 > 1.1.1.1.8002: Flags [S], seq 3790799685, win 43690, options [mss 65495,sackOK,TS val 1388725984 ecr 0,nop,wscale 7], length 0
    ....
    ~$ sudo conntrack -L --orig-src 172.27.65.228 --orig-dst 172.27.65.228
    tcp      6 117 SYN_SENT src=172.27.65.228 dst=172.27.65.228 sport=48924 dport=65001 [UNREPLIED] src=1.1.1.1 dst=172.27.65.228 sport=8002 dport=48924 mark=0 use=1
    conntrack v1.2.1 (conntrack-tools): 1 flow entries have been shown.
    Ответ написан
    Комментировать
  • Можно ли сделать роутер из такого покоцанного Линукса?

    EvilMan
    @EvilMan
    Можно делать NAT и без iptables. Но это будет stateless nat: один в один. Правда ядро 2.4, не уверен, что в нём поддержка это включена.
    Ответ написан
    Комментировать
  • Где маркировать пакеты в iptables, если надо макировать ответ после SNAT и фильтровать по исходному IP (до SNAT)?

    EvilMan
    @EvilMan
    Если нужно отбирать пакеты по оригинальным адресам (до трансляции), то можно использовать модуль сопоставления (match) conntrack.
    Краткая справка опций данного сопоставления (можно посмотреть по iptables -m conntrack --help как и для всех других типов сопоставлений):
    [!] --ctstate {INVALID|ESTABLISHED|NEW|RELATED|UNTRACKED|SNAT|DNAT}[,...]
                                   State(s) to match
    [!] --ctproto proto            Protocol to match; by number or name, e.g. "tcp"
    [!] --ctorigsrc address[/mask]
    [!] --ctorigdst address[/mask]
    [!] --ctreplsrc address[/mask]
    [!] --ctrepldst address[/mask]
                                   Original/Reply source/destination address
    [!] --ctorigsrcport port
    [!] --ctorigdstport port
    [!] --ctreplsrcport port
    [!] --ctrepldstport port
                                   TCP/UDP/SCTP orig./reply source/destination port
    [!] --ctstatus {NONE|EXPECTED|SEEN_REPLY|ASSURED|CONFIRMED}[,...]
                                   Status(es) to match
    [!] --ctexpire time[:time]     Match remaining lifetime in seconds against
                                   value or range of values (inclusive)
        --ctdir {ORIGINAL|REPLY}   Flow direction of packet


    Но маркировать после SNAT не получится, так как nat выполняется в nat/POSTROUTING уже ПОСЛЕ mangle/POSTROUTING (диаграмма прохождения пакетов через Netfilter). При этом решение о маршрутизации принимается до SNAT, уже пытаться маршрутизировать пакеты в другую таблицу после SNAT неправильно. Может расскажете подробнее схему?
    Ответ написан
    Комментировать
  • Linux shaping VLAN?

    EvilMan
    @EvilMan
    У Вас mark=«3». Так же в фильтре у Вас указано «handle $mark fw flowid 1:$mark», да только что-то этого класса у Вас нет. Отсюда и проблемы. К тому же, раз вы режете весь трафик, то можно обойтись и без использования iptables.

    Например, так (адаптация Вашего скрипта):
    tc qdisc del dev $dev root
    tc qdisc add dev $dev root handle 1: htb default 10
    tc class add dev $dev parent 1:0 classid 1:10 htb rate $rate ceil $rate prio 0
    
    Ответ написан
  • Как настроить one-to-one на subinterface в Shorewall'е?

    EvilMan
    @EvilMan
    Если Вам необходимо использовать nat 1:1, то используйте stateless nat с помощью утилиты ip. Например так:
    ip route add nat <IP_B> via 1.1.1.1
    ip rule add nat <IP_B> from 1.1.1.1
    
    Ответ написан
    Комментировать
  • Есть ли смысл вручную указывать broadcast для интерфейсов?

    EvilMan
    @EvilMan
    Особой разницы нет, главное, чтобы широковещательные маршруты присутствовали в таблице local. Но тут надо смотреть по ситуации: видел примеры скриптов автоконфигурирования dhcp-сервера, которые без широковещательного адреса на интерфейсе роняли его (dhcp-сервер).

    Так же можно использовать конструкцию по типу этой:
    ip addr add 192.168.2.1/24 brd + dev eth0
    

    В этом случае широковещательный адрес будет высчитан автоматически.
    Ответ написан
  • Фильтрация пакетов в bridge (iptables,ebtables)

    EvilMan
    @EvilMan
    И так, подробный отчёт о тесте.
    Из железа под рукой оказалось пара голосовых шлюзов, которые будут использоваться в роли конечных устройств (адреса 192.168.253.1 и 192.168.253.2), и управляемый свитч. Запихиваем каждый из аддпаков в отдельный влан, настраиваем привязку портов к вланам на коммутаторе и начинаем эксперимент.

    1. На машинке создаём бридж-интерфейс и два влана, запихиваем вланы в бридж, поднимаем всё, прописываем адрес на бридж-интерфейсе:
    brctl addbr br0
    ip l add l eth2 name eth2.10 type vlan id 10
    ip l add l eth2 name eth2.11 type vlan id 11
    ip l s up dev br0
    ip l s up dev eth2.10
    ip l s up dev eth2.11
    ip a add 192.168.253.3/29 dev br0
    


    2. Устанавливаем переменные sysctl, при этом не будет никакой фильтрации:
    sysctl -w net.bridge.bridge-nf-call-iptables=0
    sysctl -w net.bridge.bridge-nf-filter-vlan-tagged=0
    


    3. Проверяем связность между устройствами в разных портах моста и хостовой машиной (пингуем остальные адреса с аддпака 192.168.253.1/29):
    test-addpac-1# ping 192.168.253.2
    PING 192.168.253.2 (192.168.253.2): 56 data bytes
    64 bytes from 192.168.253.2: icmp_seq=0 ttl=64 time=10 ms
    64 bytes from 192.168.253.2: icmp_seq=1 ttl=64 time=10 ms
    64 bytes from 192.168.253.2: icmp_seq=2 ttl=64 time=10 ms
    64 bytes from 192.168.253.2: icmp_seq=3 ttl=64 time=10 ms
    
    --- 192.168.253.2 ping statistics ---
    4 packets transmitted, 4 packets received, 0% packet loss'
    round-trip min/avg/max = 10/10/10 ms
    test-addpac-1# ping 192.168.253.3
    PING 192.168.253.3 (192.168.253.3): 56 data bytes
    64 bytes from 192.168.253.3: icmp_seq=0 ttl=64 time=15 ms
    64 bytes from 192.168.253.3: icmp_seq=1 ttl=64 time=5 ms
    64 bytes from 192.168.253.3: icmp_seq=2 ttl=64 time=5 ms
    64 bytes from 192.168.253.3: icmp_seq=3 ttl=64 time=5 ms
    64 bytes from 192.168.253.3: icmp_seq=4 ttl=64 time=5 ms
    64 bytes from 192.168.253.3: icmp_seq=5 ttl=64 time=5 ms
    
    --- 192.168.253.3 ping statistics ---
    6 packets transmitted, 6 packets received, 0% packet loss'
    round-trip min/avg/max = 5/6/15 ms
    

    Как видно, всё работает.

    4. Устанавливаем переменную для того, чтобы трафик между портами попадал в iptables, и добавляем правило в файерволл для блокировки трафика между двумя устройствами с заданными адресами:
    sysctl -w net.bridge.bridge-nf-call-iptables=1
    iptables -A FORWARD \
      --src 192.168.253.1 --dst 192.168.253.2 \
      -j DROP
    

    И проверяем так же с помощью пинга:
    test-addpac-1# ping 192.168.253.2 
    PING 192.168.253.2 (192.168.253.2): 56 data bytes
    
    --- 192.168.253.2 ping statistics ---
    5 packets transmitted, 0 packets received, 100% packet loss'
    test-addpac-1# ping 192.168.253.3
    PING 192.168.253.3 (192.168.253.3): 56 data bytes
    64 bytes from 192.168.253.3: icmp_seq=0 ttl=64 time=5 ms
    64 bytes from 192.168.253.3: icmp_seq=1 ttl=64 time=5 ms
    64 bytes from 192.168.253.3: icmp_seq=2 ttl=64 time=5 ms
    64 bytes from 192.168.253.3: icmp_seq=3 ttl=64 time=5 ms
    64 bytes from 192.168.253.3: icmp_seq=4 ttl=64 time=5 ms
    
    --- 192.168.253.3 ping statistics ---
    5 packets transmitted, 5 packets received, 0% packet loss'
    round-trip min/avg/max = 5/5/5 ms
    

    И проверяем счётчики в iptables (в динамике вы увидите, как они инкрементируются):
    anton@insider:~$ sudo iptables -L FORWARD 8 -n -v
      455 38220 DROP  all  --  *  *   192.168.253.1  192.168.253.2 
    


    Итого: вот примерно так можно фильтровать трафик между портами моста, обходясь совершенно без ebtables. Чтобы фильтровать трафик между портами с учётом интерфейса, то необходимо использовать расширение physdev примерно так:
    iptables -A FORWARD -m physdev \
      --physdev-in eth2.10 --physdev-out eth2.11 \
      --src 192.168.253.1 --dst 192.168.253.2 \
      -j DROP
    


    Так же следует учесть, что ebtables так же умеет фильтрацию по полям заголовков L3, если соответствующие модули загружены.

    Можно сделать тоже самое с помощью ebtables:
    ebtables -A FORWARD -p ip \
    --ip-source 192.168.253.1 --ip-destination 192.168.253.2 \
    -j DROP
    


    Как видите, для фильтрации вовсе не нужно указывать мак-адреса. Подробные сведения о модулях ebtables вы сможете найти в мане. Так же будет полезно поиграться с tcpdump на бриджах и бридж-портах при фильтрации — вы увидите, что на один порт моста приходит трафик, но не пересылается в другой порт.
    Ответ написан
    3 комментария
  • Фильтрация пакетов в bridge (iptables,ebtables)

    EvilMan
    @EvilMan
    1. Для того, чтобы можно было с помощью iptables фильтровать трафик, проходящий транзитом через мост необходимо выставить следующие системные переменные sysctl:
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    

    2. После того как установите переменные sysctl, можно использовать для этого iptables, используя сопоставление (match) -m physdev --physdev-in / --physdev-out
    3. См. предыдущий ответ.
    Как-то так.
    Ответ написан
    6 комментариев
  • Как провести анализ нагрузки на дисковые подсистемы?

    EvilMan
    @EvilMan
    В Linux в статистике использования процессора смотрите значение iowait. Так же окажутся полезными утилиты vmstat, iostat и iotop.
    Ответ написан
  • Какую книгу по Linux Kernel почитать?

    EvilMan
    @EvilMan
    Для теории сначала Таненбаума «Современные операционные системы». Потом как раз-таки Бовет и Чезати «Understanding the Linux kernel» (она же «Ядро Linux» в русском переводе). И под конец можно зачитать Роберта Лава «Linux kernel development» (Разработка ядра Linux, сейчас ожидается выпуск третьего издания на русском, если с английским плохо), которая более приземлённо раскрывает подробности реализации.
    Ответ написан
    3 комментария
  • Debian wheezy, процесс kworker сильно грузит ядро. Как лечить?

    EvilMan
    @EvilMan
    Попробуйте пересобрать ядро, используя исходники с kernel.org. Это самый быстрый вариант решения проблемы, если не хотите заморачиваться с использованием профайлера ядра и другими мозговыносящими ядерными штуками.
    Ответ написан
    Комментировать
  • Как правильно настроить OpenVPN для последовательной маршрутизации трафика через два сервера?

    EvilMan
    @EvilMan
    Достаточно клиентам отдать маршрут через первый сервер (сервер 1), а на серверах 1 и 2 настроить маршрутизацию. Нат нужно настраивать только на сервере 2, через который трафик уже в интернет уходит.
    На первом сервере:
    ip route add default via <server2-ip> dev tunX table 10
    ip rule add from <clients-net> lookup 10 pref 10
    

    На втором сервере надо будет уже настроить НАТ и прописать маршрут до клиентских сетей через сервер 1
    ip route add <clients-net> via <server1-ip> dev tunY
    iptables -t nat -A POSTROUTING --src <clients-net> -o <extiface> \
      -j SNAT --to-source <extip>
    

    Вот как-то так.
    Ответ написан
    Комментировать
  • Ограничение исходящей скорости у виртуального интерфейса

    EvilMan
    @EvilMan
    1. eth0:1 — это не виртуальный интерфейс, а всего лишь алиас, он не может иметь отдельную дисциплину очереди.
    2. tc подойдёт. На весь интерфейс (eth0) вешается дисциплина и создаётся два дочерних класса — один с ограничением скорости, второй — на всю ширину. В класс с ограничением скорости направлять все пакеты с заданным адресом отправителя (это как раз и будет ip-адрес на eth0:1). За подробностями рекомендую обратиться к lartc.
    Ответ написан
    1 комментарий