Network namespaces или несколько виртуальных сетевых карт (интерфейсов) с разными IP на одной машине.

С одной физической сетевой картой.

Для чего.

Например мы хотим организовать следующую схему:
1. После запуска сервер устанавливает соединение с VPN-провайдером, и весь трафик идет через VPN.
2. Некоторым программам VPN не нужен, пусть это например будут TOR, I2P (у них и так шифрование, плюс им бы желательно скорость работы повыше, а напрямую соединяться быстрее, чем через VPN). Плюс, например, мы хотим ходить на некоторые сайты в обход VPN, либо иметь возможность запускать в обход VPN какие-либо трафикоемкие программы, например торрент-клиент. Ну пусть еще будет отдельный локальный сервис, например FTP, также висящий на отдельном IP.

Как.

В Linux есть замечательный механизм network namespaces, который на одной машине позволяет создать несколько изолированных друг от друга сетевых подсистем, почти как сеть в виртуальной машине. Не бойтесь, все делается на уровне ядра, потому тормозов, характерных для виртуальных машин не будет. И пусть слово «изолированных» вас тоже не пугает, когда надо — изолированных, а когда надо — мы их свяжем.

Эмулируется полностью сетевой стек: сетевые интерфейсы, таблица маршрутизации, файрволл и т.д. Так, как это работает на уровне ядра и для определенных процессов, то вполне можно получить рабочую конфигурации, когда на одной машине есть несколько сетевых интерфейсов с одинаковыми IP-адресами и ничто не конфликтует.

Подготовка

Поскольку в процессе нам придется поднимать/опускать физические и виртуальные сетевые карты, настоятельно советую отключить Network Manager, а основную сеть настроить вручную. С включенным Network Manager может ничего не получиться, т.к. он в самый ответственный момент влезет и напоганит в конфигурации.

Как на Slackware отключить Network Manager и настроить сеть вручную (копия)

Создание и конфигурация network namespace.

Конфигурация namespace’ов производится с помощью iproute2.

1. Создаем новый неймспейс с именем provns:

ip netns add provns

2. Создаем две связанных между собой виртуальных сетевых карты (интерфейса)

ip link add veth0 type veth peer name veth1

3. Поднимаем интерфейс veth0:

ifconfig veth0 0.0.0.0 up

4. Ассоциируем вторую виртуальную карту с созданным нэймспейсом:

ip link set veth1 netns provns

Получился один дополнительный namespace, связанный с основным виртуальными сетевыми интерфейсами veth0 и veth1.

Теперь надо связать виртуальный интерфейс veth0 с физической сетевой картой (интерфейсом) eth0. Сделать это можно разными способами, например, присвоить интерфейсам разные IP-адреса из разных подсетей и сделать маскарадинг с помощью IPTABLES, а можно воспользоваться мостами.

Мост — специальное сетевое устройство (в данном случае не физическое, а логическое) позволяющее связать два (и более) сетевых интерфейса на канальном уровне, как в маршрутизаторе.

Подробнее про мосты:
Linux Bridge
Виртуальные сетевые устройства в Linux: Linux Bridge
10 примеров команды brctl в Linux для сетевого Ethernet моста
Эти статьи в PDF

Итак:
5. Отключаем физический интерфейс eth0:

ifconfig eth0 down

6. Включаем его, но IP-адрес не присваиваем (IP-адрес будет присвоен мосту):

ifconfig eth0 0.0.0.0 up

7. Создаем мост br0:

brctl addbr br0

8. Соединяем (добавляем интерфейсы к мосту) eth0 и veth0:

brctl addif br0 eth0 veth0

9. Поднимаем (включаем) мост, присваивая ему IP-адрес и маску подсети:

ifconfig br0 192.168.0.15 netmask 255.255.255.0 up

Получилось как на схеме:

10. Устанавливаем маршрут по умолчанию в основном namespace:

ip route add default via 192.168.0.1 dev br0 src 192.168.0.15

Далее конфигурируем namespace:

Выполнение любых команд в указанном namespace производится командой

ip netns exec <имя_namespace> <команда> [параметры_команды]

Например, если мы хотим выполнить ifconfig в namespace с именем provns, то команда будет:

ip netns exec provns ifconfig

11. Поднимаем (включаем) сетевой интерфейс veth1 внутри нэймспейса provns, и присваиваем ему адрес 192.168.0.20:

ip netns exec provns ifconfig veth1 192.168.0.20 netmask 255.255.255.0

12. Прописываем внутри нэймспейса маршрут по умолчанию:

ip netns exec provns ip route add default via 192.168.0.1 dev veth1 src 192.168.0.20

13. Поднимаем внутри namespace’а loopback-интерфейс:

ip netns exec provns ifconfig lo 127.0.0.1

Скрипт для автоматизации настройки network namespace.

Под катом

Скрипт целиком на GitHub

Справочники по ассемблеру (assembler) для DOS

Набор интерактивных справочников (запускаются они тоже под DOS)

ASM-HELP — интерактивный справочник по Assembler (DOS)

TECHHELP — интерактивный справочник по прерываниям и структурам данных DOS/BIOS

NG — интерактивный резидентный справочник (вылезает по Shift-F1)
Базы данных:
ASSEMBLER (ENG) — ассемблер
BIOS (ENG) — прерывания BIOS
TC (RUS) — краткая справка по Turbo C
PASCAL (RUS) — справка по Turbo Pascal

Скачать

Питер Абель. Ассемблер и программирование для IBM PC

Скачать (TXT DOS, ZIP)

Настройка сети в Slackware Linux вручную.

Краткая заметка, как настроить сеть на Slackware вручную. Все делаем под root’ом или через sudo.

1. Отключаем Network Manager, если случайно включили его при установке системы.

Для этого идем в /etc/rc.d и снимаем права на выполнение у файла rc.networkmanager

chmod -x rc.networkmanager

2. Проверяем, что у скрипта rc.inet1 установлены права на исполнение.

3. Правим rc.inet1.conf:

— Раскомментируем строчки для нужного сетевого (ых) интерфейса (ов) и прописываем нужные данные. У меня только один интерфейс (сетевая карта) eth0, поэтому я раскомментировал строчки в начале конфигурационного файла и прописал нужные данные:

# Config information for eth0:
IPADDR[0]="192.168.0.15"
NETMASK[0]="255.255.255.0"
USE_DHCP[0]=""
DHCP_HOSTNAME[0]=""

IPADDR — адрес компьютера в локальной сети.
NETMASK — маска подсети

DHCP использовать не будем, настроим DNS вручную далее, поэтому USE_DHCP и DHCP_HOSTNAME оставляем, как было.

— Настраиваем основной шлюз. Ищем в rc.inet1.conf строчку GATEWAY и прописываем основной шлюз (обычно адрес роутера, в некоторых деревенско-колхозных случаях адрес шлюза надо спрашивать у провайдера):

GATEWAY="192.168.0.1"

4. Указываем адреса DNS-серверов.
В файл /etc/resolv.conf добавляем адреса DNS-серверов. Тут я указал публичные гуглевские DNS:

nameserver 8.8.8.8
nameserver 8.8.4.4

5. Перезагружаем систему.

Проверить можно в той же консоли, сделав ping до того же гуглевского DNS:

ping 8.8.8.8

И попробовать посетить какой-нибудь сайт:
lynx tolik-punkoff.com

C#, передача форме фокуса, если она открыта, и открытие, если ее нет.

Практически идентичное решение уже обсуждалось в заметке «C#, проверить, открыта ли форма» (копия).

Делается все примерно также. Для удобства вынесем проверку, открыта ли форма в отдельную функцию:

private bool IsFormOpen(string FormName)
{
    foreach (Form f in Application.OpenForms)
    {
        if (f.Name == FormName)
        {
            f.Focus();
            return true;
        }
    }
    return false;
}

Если форма открыта, устанавливаем ей фокус (f.Focus()) и возвращаем true. Если формы нет — возвращаем false.

В обработчике события, в котором будем вызывать форму, вызываем эту функцию, и если она вернула false, создаем и показываем форму, иначе выходим из обработчика:

private void btnChild1_Click(object sender, EventArgs e)
{
    if (IsFormOpen("frmChild1")) return;
    
    frmChild1 fChild1 = new frmChild1();
    fChild1.Show();
}

private void btnChild2_Click(object sender, EventArgs e)
{
    if (IsFormOpen("frmChild2")) return;

    frmChild2 fChild2 = new frmChild2();
    fChild2.Show();
}

Пример на GitHub