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

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

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

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

chmod 644 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

Пример конфига GRUB для загрузки сервера

# GRUB configuration file '/boot/grub/menu.lst'.
# generated by 'grubconfig'.

# Start GRUB global section
timeout 10
color light-gray/blue black/light-gray
# End GRUB global section

# Linux bootable partition
  title Slackware 14.2
  root (hd0,1)
  kernel /abs/vmlinuz root=/dev/mapper/sda1 ro video=VGA-1:640x480@75
  initrd /abs/initrx.gz
# Linux bootable partition ends

# Linux bootable partition test initrd
  title Slackware Test/Rescue initrd
  root (hd0,1)
  kernel /abs/vmlinuz root=/dev/sda1 ro video=VGA-1:640x480@75
  initrd /abs/initrd.gz
# Linux bootable partition nocryprt ends

# Puppy Slacko bootable partition config begins
  title Slacko Puppy Linux
  root (hd0,1)
  kernel /slacko/vmlinuz ro vga=normal
  initrd /slacko/initrd.gz
# Puppy Slacko bootable partition config ends

На Pasebin

Внимание! Названия устройств и путей могут не совпадать с описанными в мануале! Будьте внимательны и поправьте под свою конфигурацию!

Установка Linux и шифрование ее и всего содержимого жесткого диска. Часть IV

Этап #19
Восстановление системы на зашифрованный диск. Форматирование разделов

Сначала, как и на этапе 18, необходимо получить доступ к зашифрованному жесткому диску
tcplay --map=cryp_sdb --device=/dev/sdb --keyfile=/path/to/key/file

Далее, с помощью утилиты kpartx, доступ к разделам на жестком диске
kpartx -av /dev/mapper/cryp_sdb

где:
Опция a – подключить разделы, содержащиеся на зашифрованном устройстве
Опция v – отобразить, какие разделы были подключены.
/dev/mapper/cryp_sdb – подключенный с помощью tcplay зашифрованный диск.

Далее форматируем разделы. Главный:
mkfs –t ext2 /dev/mapper/cryp_sdb1
Дополнительный:
mkfs –t ext2 /dev/mapper/cryp_sdb5
И раздел подкачки:
mkswap /dev/mapper/cryp_sdb6

Отключаем подключенные разделы:
kpartx –dv /dev/mapper/cryp_sdb

Отключаем зашифрованный жесткий диск:
tcplay --unmap=cryp_sdb
Перезагружаемся обратно в консоль тестового initrd

Этап #20
Восстановление системы на зашифрованный диск. Восстановление файлов из ранее созданных бэкапов.

Как и в предыдущем этапе, сначала получаем доступ к зашифрованному жесткому диску:
tcplay --map=cryp_sdb --device=/dev/sdb --keyfile=/path/to/key/file

И его разделам:
kpartx -av /dev/mapper/cryp_sdb

Предположим, что бэкапы системы были сохранены на первый FAT32 раздел флешки sda1 и находятся по следующим путям:
/mnt/sdb1/bak/system.tar.gz и /mnt/sdb1/bak/home.tar.gz

Создаем точку монтирования для флешки (если не создана):
mkdir /mnt/sdb1
И монтируем ее (если не примонтирована)
mount –t vfat /dev/sdb1 /mnt/sdb1

Создаем точки монтирования для разделов жесткого диска:
mkdir /mnt/sda1
mkdir /mnt/sda5

Внимание! Точки монтирования для жестких дисков должны называться также, как назывались при создании бэкапов!

Монтируем разделы:
mount –t ext2 /dev/mapper/cryp_sdb1 /mnt/sda1
mount –t ext2 /dev/mapper/cryp_sdb5 /mnt/sda5

Распаковываем архивы:

tar –xvf /mnt/sda1/bak/home.tar.gz –C /
tar –xvf /mnt/sda1/bak/system.tar.gz –C /

где:
Опция x – распаковать архив
Опция v – отображать имена распаковываемых файлов
Опция f – архив находится в файле (а не направлен со STDIN)
/mnt/sda1/bak/home.tar.gz – путь к файлу архива
–C – указывает, в какой каталог распаковать архив (сам каталог указывается через пробел, и в данном случае это корень, т.е. / ).

Скопируем заранее исправленные fstab и mtab, предположим, они были сохранены в первый раздел загрузочной флешки, в каталог tabs и данный раздел смонтирован:

cp /mnt/sdb1/tabs/fstab /mnt/sda1/etc/fstab
cp /mnt/sdb1/tabs/fstab /mnt/sda1/etc/mtab

После копирования файлов отмонтируем разделы:
umount /mnt/sda1
umount /mnt/sda5

Отключаем подключенные разделы:
kpartx –dv /dev/mapper/cryp_sdb

Отключаем зашифрованный жесткий диск:
tcplay --unmap=cryp_sdb
Перезагружаемся уже с рабочим initrd.

Поздравляю! Если система успешно загрузилась с рабочим initrd, значит, задача выполнена!
После успешной загрузки можно подправить конфиг GRUB, так, чтоб сразу загружалась система с рабочим initrd.

Скачать мануал целиком в PDF

Установка Linux и шифрование ее и всего содержимого жесткого диска. Часть III

Этап #16
Подготовка конфигурационных файлов и рабочего initrd

На этом этапе первым делом определимся, под каким именем мы будем обращаться к нашему зашифрованному жесткому диску. Это имя будет использоваться в команде map утилиты tcplay. Для примера здесь и далее я буду использовать имя cryp_sdb.
Далее необходимо скопировать в отдельный каталог на загрузочной флешке (для примера пусть будет cfg) файлы /etc/fstab и /etc/mtab из основной ОС и отредактировать их, заменив /dev/sdaX на /dev/mapper/cryp_sdbX. Где X – номер конкретного раздела на жестком диске.
Далее под катом

Установка Linux и шифрование ее и всего содержимого жесткого диска. Часть II

Этап #11.
Добавление tcplay в образ initrd.

Для этого создаем какой-нибудь временный каталог и распаковываем туда из пакета (tc-play-2.0-i486-1.tgz в моем случае) полученного на этапе 8 файлы (дальнейшие пути внутри пакета)
usr/lib/libtcplay.so.2.0
usr/sbin/tcplay
Я просто воспользовался mc, зашел им в архив и нужное скопировал клавишей F5 в /tmp/tc-play, mc сам вызвал архиватор и распаковал все за меня.
Далее, выходим из архива и копируем во временный каталог (ну чтоб все нужные файлы были в одном месте и мы не запутались) файл
/lib/libdevmapper.so.1.02 (если при создании initrd, вы пользовались опцией –L, то эта библиотека уже на месте)
Теперь из временного каталога (да, можно было и сразу) скопируем файлы
libtcplay.so.2.0
libdevmapper.so.1.02
в /boot/initrd-tree/lib
(каталог библиотек файловой системы initrd)
а файл
tcplay
в /boot/initrd-tree/bin

Также tcplay во время своей работы, а конкретно подключения зашифрованных разделов вызывает из каталога /usr/sbin программу dmsetup. Соответственно, необходимо положить dmsetup в /boot/initrd-tree/usr/sbin

Чтобы dmsetup работал правильно, ему необходим каталог /dev/mapper, его тоже надо создать
mkdir /boot/initrd-tree/dev/mapper

Далее выходим из каталога initrd-tree, удаляем из директории /boot ранее созданный initrd.gz и запускаем mkinitrd без параметров, далее примонтируем нашу загрузочную флешку, заменяем файл /mnt/sda2/absolute/initrd.gz на пересозданный initrd.gz, перезагружаем компьютер и выбираем созданный на этапе 8 пункт для тестирования initrd.gz

Если все сделано правильно, то в конце загрузки будет выведено сообщение «Hello, world!» и приглашение оболочки, в котором мы введем команду tcplay. Программа должна выдать краткую справку по своим параметрам. После чего вводим команду exit и загружаемся в основную ОС.

Этап #12.
Генерация ключа для шифрования.

Для генерации ключа можно взять данные из /dev/urandom.
Если было несколько перезагрузок основной ОС и ОС некоторое время работала, то это должно быть довольно надежно. Хотя при написании данной статьи я и сомневался в этом, но мои сомнения были развеяны более опытными специалистами 🙂
Можно также воспользоваться генератором ключевых файлов, входящим в комплект Windows или Linux-версии Truecrypt, в таком случае следует использовать версию 7.1a, последнюю на момент закрытия проекта Truecrypt, скачать каковую можно, например отсюда.

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

Вот команда для генерации ключа с помощью /dev/random – стандартного устройства для получения псевдослучайных последовательностей
dd if=/dev/random of=/путь/к/файлу/имя_файла bs=1 count=256

Команда dd подробно описана, например, здесь

Далее под катом

Установка Linux и шифрование ее и всего содержимого жесткого диска.

Нам понадобятся:
1. Дистрибьютив Linux. Я здесь и далее использовал Slackware 14.2
2. Live CD Linux, я использовал Puppy Rus Slacko,

Идея в том, чтоб наша ОС и данные находились на надежно зашифрованных разделах, на жестком диске внешне не должно быть никакой разбивки, а система загружалась без ввода парольной фразы или ключа.
Как это можно реализовать
Загрузчик системы и ключ доступа будут храниться на небольшом(<50Mb) разделе флешки, при включении загрузчик разблокирует доступ к шифрованному винту, загружает ядро, далее происходит обычная загрузка системы.

Я не стал использовать LVM, а вместо LUKS выбрал клон truecrypt’а — tcplay

Этап #1. Разбиение диска на разделы

Итак, первым делом создаем нужные разделы на диске. Я сделал это в графической оболочке Puppy Rus с помощью имеющегося на диске gparted, но ничего не мешает вам сделать это с помощью другой программы.

Этап #2.
Подготовка загрузочной флешки.

Действуем как в вышеупомянутой статье – разбиваем флешку на 2 раздела, первый большой и видимый из Windows и других ОС, второй маленький – с загрузчиком операционной системы и ключами, отформатированный в Ext2. В статье рекомендуется сделать его приблизительно 50 Мб, и для загрузчика GRUB, ядра, хранения начальных настроек этого хватит. Я же сделал второй раздел побольше (1Гб) и перенес на него дополнительно Live дистрибутив Puppy Linux (чтоб в процессе настроек не грузиться с CD или другой флэшки).

Этап #3.
Установка загрузчика GRUB

Необходимо извлечь загрузочные флешки с которых ставили ОС, и/или с которых загружали Puppy Slacko, если таковые были использованы, и вставить нашу размеченную подготовленную загрузочную флешку.

Я воспользовался графической утилитой установки GRUB c LiveCD Puppy Slacko, доступ к которой можно получить из главного меню Puppy Slacko (оно по-умолчанию там же где и «Пуск» у Windows) «Система» — «Настройка загрузчика GRUB»
1. В первом диалоговом окне выбираем способ установки simple
2. Во втором предлагается выбрать разрешение экрана при загрузке, я выбрал standart, ибо для Slackware потом все равно необходимо перенастроить параметры разрешения экрана при загрузке в конфиге GRUB.
3. В следующем окне необходимо указать местоположение директории boot, это второй раздел нашей флешки, который у меня называется sdb2, соответственно указывается устройство /dev/sdb2
4. В следующем окне выбираем запись загрузчика в MBR
5. В следующем окне вводим устройство, в MBR которого будет записан загрузчик, в данном случае это наша флешка, которая обозначена как /dev/sdb (у меня)

Продолжение под катом

Поздравляю! Мы загрузились с помощью образа initrd до загрузки основной ОС.
Для продолжения загрузки надо ввести exit и нажать enter. Управление будет передано программе init из основной ОС и основная ОС загрузится.

Домашний сервер на базе Slackware Linux

Давно хотел собрать в кучу заметки про то, как можно организовать домашний сервер (или сервер для малого офиса) на базе Slackware Linux с VPN, I2P, Tor, файл-помойкой на локальном FTP, возможностью установки с сервера ПО и операционных систем, а возможно и с внутренними Web-сайтами, чатами и что там еще надо в зависимости от ваших задач. А еще и с полным шифрованием жесткого(-их) дисков.

Это пост-оглавление. Тут буду копить внутренние ссылки на заметки, относящиеся к организации сервера. Нумерация и последовательность также может меняться, т.к. я пишу как придется, а в содержании буду по мере накопления материала сортировать как надо.

Что примерно надо построить на начальном этапе. Сервер в локальной сети, позволяющий клиентам выходить в Интернет, как минимум через два различных IP (VPN и IP основного провайдера), поддерживающий локальный FTP и/или Samba (файловое хранилище), поддерживающий проходную ноду Tor и I2P-роутер, а также обеспечивающий локальным клиентам доcтуп в сети Tor и I2P.

Ремарка про железо. На самом деле, чем круче, тем круче, но изначально все делалось на старом Celeron с 500 Гб HDD и 512 Мб ОП, сейчас все вертится на Dual Core Intel Celeron E3200 (2400МГц) с гигабайтом встроенной памяти и встроенным видео, тоже не самая новая машина, но получше. А вообще хочу, чтоб оно на PIII-700 заработало. Сетевая карта одна (расскажу, как из одной реальной виртуальных наделать).

Оглавление

Установка Linux и шифрование жесткого диска:
Часть I Копия
Часть II Копия
Часть III Копия
Часть IV Копия
Пример конфига GRUB для загрузки сервера Копия
Эта часть целиком в PDF

Начальная настройка сети Копия [ССЫЛКА]
Настройка файерволла (IPTABLES) Копия

Локальный FTP Копия

Локальный прокси-сервер:
Запускающий скрипт Копия
Инструкция по установке Копия
Изменения в конфигурации последней версии Копия

Квест про панка Punk’s Not Dead V2.0

Нам, внезапно, прислали довольно милый квест про панка. Punk’s Not Dead V2.0, ажно 2005 года выпуска, написано на Flash, и, к сожалению, не дописано аффтарами, посему последний уровень, по сообщениям читателей, является непроходимым.

Редакция, к сожалению добралась только до антипобедного места, из-за которого на эту игру ругались в свое время фа, антифа и другие дезодоранты. В одном месте надо ебануть трубой дедушку-вытирана WOW.

Сохранения тоже нет, при перезапуске игра начинается сначала, так что если кого вдруг попрет — играйте на виртуалке, там есть Save State.

Нате вам скриншотов из начала:



И ссылку на скачивание:
Скачать с Mega.nz

Как вручную распаковать пакет nuget.

И извлечь из него сборки (библиотеки).

Часто бывает, что нужная библиотека лежит на nuget.org. Если у вас современная Visual Studio, то проблем нет — инструментарий nuget доступен, во всяком случае, из командной строки. Можно установить nuget и отдельно, но что делать, если устанавливать ничего не хочется?

На самом деле пакет nuget (файл *.nuget) это обыкновенный ZIP-архив. Поэтому можно скачать пакет, переименовать его в *.zip и открыть любимым архиватором.

Например, нам нужен упомянутый в предыдущем посте HtmlAgilityPack, версии 1.11.15.

1. Переходим по ссылке https://www.nuget.org/packages/HtmlAgilityPack/1.11.15
2. Выбираем справа Download package
3. Сохраняем пакет
4. Меняем ему расширение на zip
5. Открываем любимым архиватором

В архиве в подкаталоге \lib находятся каталоги различных сборок:

Net20
Net35
Net40
Net40-client
Net45
NetCore45
netstandard1.3
netstandard1.6
netstandard2.0
portable-net45+netcore45+wp8+MonoAndroid+MonoTouch
portable-net45+netcore45+wpa81+wp8+MonoAndroid+MonoTouch
uap10.0

C# Парсер HTML (под .NET Framework 2.0).

Понадобился тут для одного проекта все-таки полноценный парсер HTML, да еще желательно чтоб под не очень свежий .NET Framework 2.0. Ну не хочу я ради небольшого проекта жертвовать совместимостью да и переходить на новый .NET вообще, потому что в старом все прекрасно работает.

В общем выбирал-выбирал и остановился на HtmlAgilityPack, который в версии 1.11.15 поддерживает в т.ч. и .NET 2.0. Версия 1.11.16 .NET 2.0 уже не поддерживает, все остальное, начиная с .NET 3.5 есть.

Скачать можно через NuGet. Как быть тем, у кого NuGet нет читать здесь.

Прямая ссылка
Обсуждение на StackOwerflow

Держаться корней

Чуковский пишет Толстому:
«Лев, знал бы ты, как хочется вот так просто взять и нажраться! Набухаться в хлам, как Есенин. Или нанюхаться, как Маяковский!»
Толстой отвечает:
«Надо держаться, Корней!»

Настройка IPTables на сервере. Часть вторая, с поправками.

Итак, раньше копия мы уже делали первоначальную настройку IPTables, но оказалось, что делали не очень верно.

Товарищ [info]wasserstrahl@ljr внес поправку:

Открытие порта на исходящие соединения.

Ну чтоб с чем-то связаться по определенному порту.

iptables -A INPUT -p tcp —sport <# порта> -j ACCEPT
iptables -A OUTPUT -p tcp —dport <# порта> -j ACCEPT»

Нет.

iptables -A OUTPUT -p tcp —dport <# порта> -j ACCEPT» — это верно вроде,

а «iptables -A INPUT -p tcp —sport <# порта> -j ACCEPT» — нет. Потому что это правило позволяет любой входящий пакет с указанного порта с любого адреса. Если ты хочешь открыть ответы на исходящий трафик, то нужно писать что-то в стиле iptables -A INPUT -p tcp -m state —state RELATED,ESTABLISHED -j ACCEPT

Поправка верная, потому изменяем настройку IPTables в скрипте инициализации сервера.

Удаляем все правила файерволла:

# Delete all rules
echo "Delete firewall rules..."
iptables -F
iptables -F -t nat
iptables -F -t mangle
iptables -X
iptables -t nat -X
iptables -t mangle -X

Устанавливаем основную политику по умолчанию. Запретить все соединения (параноидальный режим):

# Drop all traffic
echo "Set main policy..."
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

Разрешаем принимать все установленные входящие соединения. Это надо для того, что если мы откроем порт на исходящие соединения, для того, чтоб сервер мог с чем-то связываться (например с WWW или rsync), то ответ был бы принят.

#prinimat' vse ustanovlennye vhodashie soedineniya
echo "Accepts all established inbound connections..."
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Открываем порт для клиентов, которые подключаются к серверу по протоколу PPTP (входящий трафик):

#open VPN ports and GRE
echo "Open VPN ports and GRE..."
#to computer
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1723 -j ACCEPT

И разрешаем для них же протокол GRE:

iptables -A INPUT -p gre -j ACCEPT
iptables -A OUTPUT -p gre -j ACCEPT

Поскольку сам сервер не будет соединяться с VPN-провайдером по протоколу PPTP (есть OpenVPN), то следующие строки я убрал:

iptables -A INPUT -p tcp --sport 1723 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 1723 -j ACCEPT

Разрешаем весь трафик на loopback (lo) интерфейсе. Если у нас будут сервисы, такие как Web-сервер и сервер баз данных MySQL на одном сервере, то связываться они будут как раз через lo-интерфейс.

#accept all traffic an lo interface
echo "Accept all lo interface traffic..."
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Открываем на вход 22 порт (ssh) для клиентов, которые подключатся к серверу через PPTP VPN:

# ssh (22 port)
echo "Open 22 port (ssh) for VPN clients..."
iptables -A INPUT -s 172.16.1.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s 172.16.1.0/24 -p tcp --sport 22 -j ACCEPT

Так же разрешаем им доступ к удаленному рабочему столу (XDMCP):

# XDMCP
echo "Open 177 port UDP (XDMCP) for VPN clients..."
iptables -A INPUT -s 172.16.1.0/24 -p udp --dport 177 -j ACCEPT
iptables -A OUTPUT -s 172.16.1.0/24 -p udp --sport 177 -j ACCEPT

echo "Open 6000:6005 ports (Windows XDMCP) in both directions for VPN clients..."
iptables -A INPUT -s 172.16.1.0/24 -p tcp -m multiport --dports 6000:6005 -j ACCEPT
iptables -A OUTPUT -s 172.16.1.0/24 -p tcp -m multiport --sports 6000:6005 -j ACCEPT

iptables -A INPUT -s 172.16.1.0/24 -p tcp -m multiport --sports 6000:6005 -j ACCEPT
iptables -A OUTPUT -s 172.16.1.0/24 -p tcp -m multiport --dports 6000:6005 -j ACCEPT

Разрешаем VPN-клиентам доступ к DNS:

echo "Open DNS for VPN clients..."
iptables -A INPUT -s 172.16.1.0/24 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -s 172.16.1.0/24 -p udp --sport 53 -j ACCEPT

iptables -A INPUT -s 172.16.1.0/24 -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -s 172.16.1.0/24 -p tcp --sport 53 -j ACCEPT

Разрешаем протокол ICMP (ping):

# Allow ICMP
echo "Allow ICMP and ports for TRACEROUTE..."
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT

И исходящие порты для TRACEROUTE (ответы, входящий трафик уже разрешен командой iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT):

#open ports from traceroute
iptables -A OUTPUT -p udp -m multiport --dports 33434:33534 -j ACCEPT

Открываем стандартные порты (HTTP, HTTPS, email, rsync) для доступа к соответствующим сервисам с сервера (входящие):

#Open standart ports (from computer)
echo "Open standart ports (DNS,WWW, email) from server"
# 53-DNS,80 8080/tcp - WWW, 443/tcp - https, 110,443,25,587 - e-mail 873/tcp - rsync (for sbopkg)
iptables -A OUTPUT -p udp -m multiport --dports 53,443 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dports 53,80,8080,443,110,443,25,587,873 -j ACCEPT

Запускаем PPTP VPN сервер (к его настройке вернусь несколько позже):

#start VPN server
echo "Starting PPTD VPN server..."
pptpd &

Производим окончательную настройку файервола для PPTP VPN клиентов:
1. Организуем NAT (маскарадинг):

echo "Final firewall settings for VPN clients..."
#NAT for VPN clients
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE

И немного подправляем пакеты (без этого виснут некоторые соединения). Буду благодарен, если мне кто-нибудь объяснит почему, но кстати, в Ростелекомовском файерволе такая настройка не установлена, потому это плохой провайдер, и их VPN висючий. В свое время задолбался с этим глюком.

#popravlaem pakety (bez etogo visnut nekotorye soedinenia)
iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

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

Источники к сожалению пролюбил.

tinyproxy свалился после обновления

Черт меня дернул обновить tinyproxy, о настройке которого я писал здесь копия

Свалился вот с такой ошибкой:

"Bind" cannot be used with transparent support enabled.
Syntax error on line 37
Unable to parse config file. Not starting.
Not starting (code 70)

Хотя никакое прозрачное проксирование я не включал.

Решилось тем, что строку 37:

Bind <адрес_сервера>

я просто закомментировал. После этого он штатно заработал.

Правда, нифига понять не могу, с чего это вдруг он так странно упал. В прошлой версии все работало, и вроде команда Bind правильная, нужная и на месте.

C#, проверить, открыта ли форма.

Например, для того, чтобы не дать пользователю повторно открыть одно и то же окно, несколько раз.

Например, такой код при нажатии на кнопку создаст столько форм frmChild, сколько раз кнопка будет нажата:

private void btnOpenForm_Click(object sender, EventArgs e)
{
    frmChild fChild = new frmChild();
    fChild.Show();
}

Конечно, можно сделать форму модальной, с помощью fChild.ShowDialog(), тогда мы не будем иметь доступа к первой форме, пока вторая не закроется. Но если это не нужно, например, мы хотим свободно переключаться между двумя формами, но вторую создать только один раз.

Открытые формы содержатся в Application.OpenForms. И фактически, надо просто перебрать этот массив, чтобы посмотреть, открыта или нет форма, например по ее имени:

foreach (Form f in Application.OpenForms)
    {
        if (f.Name == "frmChild")
        {
            lblFormOpened.Text = "Form #2 already opened!";
            return;
        }
    }

Код обработчика нажатия кнопки целиком:

private void btnOpenForm_Click(object sender, EventArgs e)
{
    lblFormOpened.Text = "";
    
    foreach (Form f in Application.OpenForms)
    {
        if (f.Name == "frmChild")
        {
            lblFormOpened.Text = "Form #2 already opened!";
            return;
        }
    }
    frmChild fChild = new frmChild();
    fChild.Show();
}

Источник
Код примера на GitHub

Электроника MK-45

Принесли вот такую няшечку, и оставили на наше попечение.
После замены конденсатора в блоке питания заработал. Показывает факториал из числа 666:

Шильдик:

Да, стоил достаточно дорого, две зарплаты продавца в магазине, или техника на метеостанции. Если примерно советский рубль по покупательной способности считать за евро (а примерно так и выходит), то на наши деньги 125 евро или 9000 путинских рублей. С учетом отсутствия в СССР кредитов, купить его мог профессор или какая-нибудь контора. Минус нашего прибора — даже после чистки клавиш, они все равно периодически залипают, потому подробного видеообзора не будет.
Зато нам едет настоящий программируемый МК, который мог даже в игры — доедет, на него будет полновесный обзор с видео.

Питается от 220 вольт, дисплей вакуумно-люминисцентный (т.е. вместо жидких кристаллов внутри у него хитросделанная вакуумная лампа).

Задняя часть

Микрокалькулятор «Электроника МК-45» является настольным вариантом калькулятора «Электроника МК-36». В настольном варианте не используется клавиша совмещения функций «F», а все функции вынесены в отдельные блоки клавиш. Калькулятор производился с 1983 года на заводах «Эльтав» в Дагестане и на заводе «Электронприбор» в городе Фрязино Московской области и продавался по цене 85 рублей.
Дизайн корпуса калькулятора повторяет модель «Электроника МК-44», однако количество клавиш позволяет легко различить эти модели.
Результат вычисления отображается на четырнадцатиразрядном вакуумно-люминесцентном индикаторе, при этом два разряда[SP1] никак не используются. Это было сделано специально ради экономии, чтобы не изготавливать новую модель индикатора, а использовать уже выпущенную и проверенную.

Калькулятор относится к классу инженерных. Имеются отдельная клавиша для вызова числа пи, клавиши для вычислений с двухуровневыми скобками, клавиши для вычислений тригонометрических функций и логарифмов, а также клавиши перевода величин, выраженных в градусах, в радианы и обратно. Все это значительно упрощало инженерные расчеты с использованием калькулятора.

Питание калькулятора осуществляется от сети переменного тока 220 В.

Габаритные размеры — 241✕185✕77 мм.
Вес не более 1,0 кг.

Описание с elektronika.su