Предположение Вас только хочет принять входящий трафик TCP, можно использовать эти правила ограничить исходящий трафик установленными соединениями TCP (который, должно быть, инициировался с внешней стороны), и IP-адреса вне LAN:
iptables -A INPUT -p tcp -i lo -j ACCEPT
iptables -A INPUT -p tcp -p 22 -j ACCEPT # repeat for other ports you want to allow
iptables -P INPUT -j DENY
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -p tcp \! -d 10.0.0.0/8 -j ACCEPT # replace by your LAN's network(s)
iptables -A OUTPUT -p tcp \! --syn -j ACCEPT
iptables -P OUTPUT -j DENY
Учитывая Ваши требования, можно предпочесть применять некоторые правила конкретно к процессам, выполняемым сторонниками. Предположим, они находятся в supporters
группа, следующие правила отклонят сторонников (и только сторонников) все соединения (поступление или выход) в Вашей LAN:
iptables -I INPUT \! -i lo -s 10.0.0.0/8 -m owner --gid-owner supporters -j DENY
iptables -I OUTPUT \! -o lo -d 10.0.0.0/8 -m owner --gid-owner supporters -j DENY
Отметьте это gid-owner
тестирует fsgid процесса, который является почти всегда эффективным GID. Если процесс не выполняется setgid или переключает свой эффективный GID на дополнительную группу, основную группу пользователя (зарегистрированный в пользовательской базе данных, например. /etc/passwd
) применяется.
Я записал функцию, которая возвращается 1
если аргументом является корневое устройство, 0
если это не, и отрицательная величина для ошибки:
#include <stdio.h> #include <stdlib.h> #include <sys/stat.h> static int root_check(const char *disk_dev) { static const char root_dir[] = "/"; struct stat root_statb; struct stat dev_statb; if (stat(root_dir, &root_statb) != 0) { perror(root_dir); return -1; } if (!S_ISDIR(root_statb.st_mode)) { fprintf(stderr, "Error: %s is not a directory!\n", root_dir); return -2; } if (root_statb.st_ino <= 0) { fprintf(stderr, "Warning: %s inode number is %d; " "unlikely to be valid.\n", root_dir, root_statb.st_ino); } else if (root_statb.st_ino > 2) { fprintf(stderr, "Warning: %s inode number is %d; " "probably not a root inode.\n", root_dir, root_statb.st_ino); } if (stat(disk_dev, &dev_statb) != 0) { perror(disk_dev); return -1; } if (S_ISBLK(dev_statb.st_mode)) /* That's good. */ ; else if (S_ISCHR(dev_statb.st_mode)) { fprintf(stderr, "Warning: %s is a character-special device; " "might not be a disk.\n", disk_dev); } else { fprintf(stderr, "Warning: %s is not a device.\n", disk_dev); return(0); } if (dev_statb.st_rdev == root_statb.st_dev) { printf("It looks like %s is the root file system (%s).\n", disk_dev, root_dir); return(1); } // else printf("(It looks like %s is NOT the root file system.)\n", disk_dev); return(0); }
Первые два теста являются в основном проверками работоспособности: если stat("/", …)
сбои или “/
” не каталог, Ваша файловая система повреждается. st_ino
тесты являются чем-то вроде выстрела в темноте. AFAIK, inode числа никогда не должен быть отрицательным или нуль. Исторически (которым я имею в виду 30 лет назад), корневой каталог всегда имел inode номер 1. Это может все еще быть верно для нескольких разновидностей *, отклоняют (кто-либо слышал о “Minix”?), и это может быть верно для специальных файловых систем, как /proc
, и для Windows (FAT) файловые системы, но самый современный Unix и подобные Unix системы, кажется, используют inode номер 1 для отслеживания сбойных блоков, продвигая корень до inode номера 2.
S_ISBLK
верно для “блочных устройств”, как /dev/sda1
, откуда вывод ls -l
начинается “b
”. Аналогично, S_ISCHR
верно для “устройств посимвольного ввода-вывода”, где вывод от ls -l
начинается “c
”. (Можно иногда видеть дисковые имена как /dev/rsda1
; “r
” обозначает “сырые данные”. Устройства неструктурированного диска иногда используются для fsck
и резервное копирование, но не монтирование.) Каждый inode имеет a st_dev
, который говорит, какая файловая система, что inode идет. Inodes для устройств также имеют st_rdev
поля, которые говорят, каковы устройство они. (Два разделенных от запятой числа Вы видите вместо размера файла когда Вы ls -l
устройство составляет два байта st_rdev
.)
Так, прием должен видеть ли st_rdev
из дискового устройства соответствует st_dev
из корневого каталога; т.е. указанное устройство то это “/
” идет?
Можно проверить, смонтировано ли устройство, и где:
awk -v device=/dev/sda1 ' $1 == device {print $2}' /proc/mounts
Это не обнаруживает устройства, используемые подсистемой ядра, такие как mdraid или LVM. Они видимы через /sys/class/block/sda1/holders
(что каталог содержит символьную ссылку на объект картопостроителя устройства, который использует устройство).
/
? Это рассчитывает, если это смонтировано в VM? Это рассчитывает, если в прошлый раз что-нибудь произошло с ним, это было смонтировано в /
, но затем разрушенная система?
– Gilles 'SO- stop being evil'
15.01.2013, 00:02
stat
функции. Это - лучшее решение. – jlledom 21.04.2013, 02:03