Сетевые namespace’ы Linux, отдельные конфигурации для каждого namespace.

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

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

Каждому из нэймспейсов можно подсунуть свою конфигурацию сети, свои конфигурационные файлы (resolv.conf, hosts)

Для этого достаточно положить соответствующие файлы в директорию /etc/netns/имя_namespace, например, для гипотетического namespace с именем riseupvpnns это будет каталог /etc/netns/riseupvpnns, туда можно положить, например, resolv.conf, прописать необходимые DNS, и эта конфигурация будет влиять только на данный namespace, в независимости, что там в основной системе прописано.

C# Получение пути к папке ОС Windows

Оказывается, вплоть до версии .NET 4 в перечислении Environment.SpecialFolder нет пути к папке, куда установлена Windows (обычно C:\Windows). Эту досадную оплошность можно обойти двумя способами:
1. Посмотреть в переменную окружения SystemRoot или windir:
string windir=Environment.GetEnvironmentVariable("SystemRoot");
string windir=Environment.GetEnvironmentVariable("windir");

2. ВНЕЗАПНО, бывают хитрые самосборные или специальные дистрибутивы, где данных переменных окружения нет. Тогда:
— надо взять путь к директории system, (обычно это C:\Windows\System32), который есть в Environment.SpecialFolder во всех версиях .NET: Environment.SpecialFolder.System
— получить директорию выше уровнем:

string windir = System.IO.Directory.GetParent(
        Environment.GetFolderPath(Environment.SpecialFolder.System));

SxGeoSharp. Интерфейс на C# для базы данных SypexGeo. — Содержание

SxGeoSharp. Интерфейс на C# для базы данных SypexGeo. Часть I — инициализация (и введение)
     -Преамбула
     -Общая структура БД
     -Заголовок базы данных
     -Дополнительные перечисления и мелкая корректировка с придирками.
     -Поля, свойства и конструктор класса
     -Функции для чтения БД
     -Функции для чтения заголовка
     -Закрытие базы данных
     -Открытие базы данных, чтение и проверка заголовка, чтение индексов.

SxGeoSharp. Интерфейс на C# для базы данных SypexGeo. — Часть II. Поиск.
     -Трехбайтовые числа
     -Байтовый substr
     -Поиск ID или смещения в «Диапазонах IP»
     -Функция поиска в «Диапазонах» (SearchDB)

SxGeoSharp. Интерфейс на C# для базы данных SypexGeo. — Часть III. Универсальный формат упаковки данных и получение данных из справочников.
     -Приведение типов
     -Анализ (распаковка) записи
     -Обработка полей записи
     -Дополнительные функции

SxGeoSharp. Интерфейс на C# для базы данных SypexGeo. — Часть IV. Получение данных.
     -Чтение информации из справочников
     -Поиск в справочнике по ID
     -Очистка ответа
     -Функция, формирующая финальный ответ.

SxGeoSharp. Интерфейс на C# для базы данных SypexGeo. — Приложение
     -Дополнительно
     -Источники
     -Код на GitHub
     -Создатели

Скачать все в PDF
SxGeoSharp на GitHub