"Интеллект — это способность избегать выполнения работы, но так, чтобы она при этом была сделана." Линус Торвальдс

Создание fstab

Открытие:

nano /etc/fstab

Параметры сети

Установка имени узла:

nano /etc/conf.d/hostname

(присвойте переменной hostname имя своего узла)

hostname="tux"

Установка dhcpcd:

emerge dhcpcd

Для подключения сети загружаем пакет net-dialup/ppp:

emerge --ask net-dialup/ppp

Параметры системы

Пароль root:

passwd
Password: (введите пароль)
Re-enter password: (повторно введите пароль)

Для настройки параметров часов открываем /etc/conf.d/hwclock

nano /etc/conf.d/hwclock

Если аппаратные часы системы настроены не на часовой пояс UTC (Гринвич),
в файл необходимо добавить строку

clock="local".

В противном случае будет сдвиг часового пояса.
Установка системной службы журналирования:

emerge syslog-ng

Для syslog-ng рекомендуется установить app-admin/logrotate:

emerge app-admin/logrotate
rc-update add syslog-ng default

Установка GRUB 2

Проверяем, включен ли режим UEFI, посмотрев содержимое каталога efivars:

ls /sys/firmware/efi/efivars

Отсутствие такого каталога, говорит что система загружена в режиме BIOS или CSM.
При использовании UEFI, если в make.conf ранее не установлено, добавляем:

echo GRUB_PLATFORMS="efi-64" >> /etc/portage/make.conf

Загружаем Grub:

emerge --ask sys-boot/grub

Устанавливаем файлы GRUB в /boot/grub:
Когда используется BIOS:

grub-install /dev/sda


Если нужно установить BIOS - версию загрузчика из-под системы, загруженной в режиме UEFI, требуется принудительно задать программе установки нужную сборку GRUB:

grub-install --target=i386-pc /dev/sda

Когда используется UEFI:

grub-install --target=x86_64-efi --efi-directory=/boot/efi

Генерируем конфигурацию GRUB:

grub-mkconfig -o /boot/grub/grub.cfg

В выводе команды хотя бы одно ядро Linux должно быть найдено.
Для настройки конфигурации Grub, используется файл /etc/default/grub.

Окончание установки Gentoo

exit

перезагружаем компьютер:

reboot

Удаляем загрузочный носитель.
Добавление учетной записи для повседневной работы:
Login: User Password: (ваш пароль user)

useradd -m -G users,wheel,audio,video -s /bin/bash username

passwd username
Password: (введите пароль для username)
Re-enter password: (повторно введите пароль для подтверждения)

Удаляем tar-архив со stage3

rm /stage3-*.tar.bz2*

Настраиваем сеть.
Просмотр существующих сетевых интерфейсов:

ls /sys/class/net
enp3s0 lo

Открытие /etc/conf.d/net для автоматического получения адреса IP для enp0s3:

nano /etc/conf.d/net
config_enp3s0="dhcp"

Автоматический запуск сетевого подключения при загрузке.
Добавление net.enp3s0 в уровень запуска default:

cd /etc/init.d
ln -s net.lo net.enp3s0
rc-update add net.enp3s0 default
/etc/init.d/net.enp3s0 restart


Для systemd настройка проводного и беспроводного адаптеров на одной машине:
для проводной сети с простой конфигурацией DHCP

nano /etc/systemd/network/50-dhcp.network

[Match]
Name=enp3s0

[Network]
DHCP=yes

[DHCP]
RouteMetric=10

для беспроводной сети

nano /etc/systemd/network/60-dhcp.wireless

[Match]
Name=wlan0

[Network]
DHCP=yes

[DHCP]
RouteMetric=20

Cлужба dhcpcd.service запускает клиент для всех сетевых интерфейсов:

systemctl enable dhcpcd.service
systemctl start dhcpcd.service


Включаем в автозапуск и запускаем следующие службы:

systemctl enable systemd-networkd.service
systemctl start systemd-networkd.service

Чтобы systemd управлял настройками DNS, заменим resolv.conf на символическую ссылку и запустим systemd-resolved:

ln -snf /run/systemd/resolve/resolv.conf /etc/resolv.conf
systemctl enable systemd-resolved.service
systemctl start systemd-resolved.service

Загружаем (при необходимости) файловый редактор "vim":

emerge vim

Утилиты необходимые для работы с файловыми системами

VFAT: emerge sys-fs/dosfstools
NTFS: emerge sys-fs/ntfs3g
Btrfs: emerge sys-fs/btrfs-progs

Немного о Btrfs:
Btrfs имеет ряд функций, общих с ZFS.
Имеются и другие функции:
Можно сконвертировать файловые системы ext2, ext3 и ext4 в Btrfs с помощью утилиты btrfs-convert, убедившись, что отмонтирован раздел:

umount <mounted_device>

Проверяем целостность файловой системы с помощью утилиты fsck:

fsck.ext4 -f <unmounted_device>

Конвертируем отформатированное ext* устройство в Btrfs:

btrfs-convert <unmounted_device>

Не забываем отредактировать файл /etc/fstab и изменить значение в колонке файловая система с ext4 на Btrfs
Полезная функция Btrfs это онлайн дефрагментация:

btrfs filesystem defragment -r -v /home

Btrfs поддерживает прозрачное сжатие с помощью алгоритмов zlib, lzo и zstd:

btrfs filesystem defragment -r -v -clzo /home

Можно использовать алгоритм сжатия zlib вместо lzo, zlib более медленный, но имеетющий более высокую степень сжатия:

btrfs filesystem defragment -r -v -czlib /home


Обновление дерева Portage:

emerge --sync

Обновление новой версии Portage:

emerge --oneshot portage

Обновление пакетов:

emerge -auvDN world

Некоторые ebuild требуют определенные комбинации USE -флагов.

Пример: Описание:
REQUIRED_USE="foo? ( bar )" Если foo установлен, то bar должен быть установлен.
REQUIRED_USE="foo? ( !bar )" Если foo установлен, то bar не должен быть установлен.
REQUIRED_USE="foo? ( || ( bar baz ) )" Если foo установлен, то bar или baz должен быть установлен.
REQUIRED_USE="^^ ( foo bar baz )" Только один из foo, bar или baz должен быть установлен.
REQUIRED_USE="|| ( foo bar baz )" Хотя бы один из foo, bar или baz должен быть установлен (но можно больше).
REQUIRED_USE="?? ( foo bar baz )" Установка необязательна, но только один из foo, bar или baz может быть установлен.

При возникновении проблемы "!!!Problem with sandbox binary. Disabling...", устанавливаем sandbox с переменной:

CFLAGS_x86="-m64" emerge sys-apps/sandbox

Обработка изменений конфигурационных файлов:

etc-update

Набираем номер конфигурационного файла, будет показано сравнение старого и нового конфига.
- - - и + + + соответственно означает что будет удалено, а что добавлено.
После ознакомления нажимаем q для выхода и система предлагает нам несколько вариантов.
Набираем то что нам подходит:
1 — заменит полностью старый конфиг новым,
2 - удалит новый конфиг и оставит старый,
3 — попытается слить 2 конфига в один,
4 — ещё раз покажет различия.

Определяем UUID:

blkid

В /etc/fstab заменяем /dev/sdaX на соответсвующий UUID=XXXX....

Если, при системе инициализации OpenRC, во время загрузки появляется уведомление типа
* /etc/init.d/ ... User Runscript, pleas convert to openrc-run, необходимо выполнить следующее:

cd /etc/init.d/
sed -i "s/runscript/openrc-run/" *


При этом нужно быть очень внимательным, так как исправить что либо будет очень сложно!
Для очистки репозитория от неиспользуемых архивов исходного кода и бинарных пакетов используем утилиту eclean, входяшею в app-portage/gentoolkit.
Устанавливаем gentoolkit:

emerge --ask app-portage/gentoolkit

Очищаем директорию архивов исходных файлов:

eclean distfiles

Краткий вариант:

eclean-dist

Очитка директории бинарных пакетов:

eclean packages

Краткий вариант:

eclean-pkg

Для освобождения большего места на диске добавляем опцию --deep: каждый архив исходных файлов или же бинарный пакет, который не соответствует какому-либо "установленному в данный момент" пакету (версия не имеет значения), будет удалён. В данном случае пользователи не защищены от необходимости повторного скачивания, в случае, если они должны понизить версию пакета или переустановить удаленный ранее пакет.
В качестве альтернативы можно использовать сразу две опции: --deep и --package-names. Каждый архив исходных кодов или бинарный пакет, не связанный с сейчас установленным пакетом (версия не имеет значение) будет удалён. С такими опциями также потребуется снова скачать исходные файлы, когда необходимо снова установить ранее удаленный пакет, но, в этом случае, останутся исходные файлы для возможности понижения версии пакета.
Обновляем GCC:

emerge --ask --oneshot sys-devel/gcc

Проссматриваем установленные профили:

gcc-config --list-profiles
[1] x86_64-pc-linux-gnu-7.3.0 *
[2] x86_64-pc-linux-gnu-8.2.0


Выбираем необходимый профиль:

gcc-config 2
source /etc/profile


и пересоберём libtool:

emerge --ask --oneshot --usepkg=n sys-devel/libtool

Проверяем номер текущей версии, а затем удаляем старую версию:

gcc --version
emerge --ask --depclean =sys-devel/gcc-7.3.0

Проверяем целостность системы, запустив:

revdep-rebuild

Русификация Gentoo

USE-флаги LINGUAS="ru en" L10N="ru en" и "USE=nls unicode" уже установлены ранее.

vim /etc/rc.conf Устанавливаем:

unicode="YES"

В ядре проверяем, а если нет, то включаем:

vim /usr/src/linux/.config
CONFIG_NLS_DEFAULT="utf8"
CONFIG_NLS_UTF8=y
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ISO8859_1=y

В make.conf устанавливаем:

LINGUAS="ru en"
L10N="ru en"


Конфигурация локалей:
Открываем /etc/locale.gen

vim /etc/locale.gen

Определяем локали:

en_US ISO-8859-1
en_US.UTF-8 UTF-8
ru_RU.KOI8-R KOI8-R
ru_RU.UTF-8 UTF-8
ru_RU.CP1251 CP1251

запускаем:

locale-gen

Эта программа сгенерирует все локали, которые определены в файле /etc/locale.gen.
Проссматриваем доступные локали:

eselect locale list

Устанавливаем необходимую локаль (ru_RU.UTF-8):

eselect locale set 8

Перезагружаем окружение оболочки:

env-update && source /etc/profile

Устанавливаем шрифты:

emerge terminus-font intlfonts freefonts cronyx-fonts corefonts kbd

Переменные окружения:
В файле /etc/env.d/02locale прописываем:

LC_ALL="ru_RU.utf8"
LANG="ru_RU.utf8"

перечитываем конфигурацию:

env-update && source /etc/profile

Выбор раскладки клавиатуры:

vim /etc/conf.d/keymaps устанавливаем:
keymap="-u ru"
windowkeys="YES"
extended_keymaps=""
dumpkeys_charset="koi8-r"
fix_euro="NO"

Добавляем /etc/init.d/keymaps в уровень запуска boot:

rc-update add keymaps boot

Перезапускаем раскладку клавиатуры для применения изменений:

rc-service keymaps restart

Консольные шрифты можно посмотреть:

ls /usr/share/consolefonts/

Задаём консольный шрифт:

vim /etc/conf.d/consolefont устанавливаем например:
consolefont="Cyr_a8x16"

после чего добавляем в уровень запуска boot:

rc-update add consolefont boot
* service consolefont added to runlevel boot

Принудительный просмотр русских манов:

$ man -L ru <man page>

Для systemd поверяем список доступных локалей:

localectl list-locales

устанавливаем требуемую локаль:

localectl set-locale LANG=ru_RU.utf8

проверяем результат:

localectl | grep "System Locale"
System Locale: LANG=ru_RU.utf8

проверяем доступные раскладки для консоли:

localectl list-keymaps

устанавливаем необходимую раскладку для консоли, например:

localectl set-keymap us

проверяем, что раскладка для консоли была установлена:

localectl | grep "VC Keymap"
VC Keymap: us

Консольные шрифты находятся в каталоге /usr/share/consolefonts/.
Выбираем понравившийся шрифт и добавляем его в /etc/vconsole.conf, например:

vim /etc/vconsole.conf
KEYMAP=us
FONT=Cyr_a8x16

Добавляем консольные шрифты в автозапуск:

systemctl enable systemd-vconsole-setup.service

Раскладки доступные для сервера X11 можно проверить:

localectl list-x11-keymap-layouts

устанавливаем необходимые раскладки для X11:

localectl set-x11-keymap "us ru"

проверяем, установленые раскладки для X11:

localectl | grep "X11 Layout"
X11 Layout: us ru

Модель, вариант и опции устанавливаем так:

localectl set-x11-keymap <LAYOUT> <MODEL> <VARIANT> <OPTIONS>

например:

localectl set-x11-keymap us,ru "" "" grp:alt_shift_toggle

Подключение к интернету PPP

Пакет net-dialup/ppp загружен ранее.
В /etc/rc.conf устанавливаем:

vim /etc/rc.conf

rc_depend_strict="YES"

В ядре подключаем:

Device Drivers -->
[*] Network device support -->
<*> PPP (point-to-point protocol) support
<> PPP BSD-Compress compression (NEW)
<*> PPP Deflate compression (NEW)
[*] PPP filtering (NEW)
<*> PPP MPPE compression (encryption) (EXPERIMENTAL) (NEW)
[ ] PPP multilink support (EXPERIMENTAL) (NEW)
<*> PPP over Ethernet (EXPERIMENTAL)
<*> PPP support for async serial ports (NEW)
<*> PPP support for sync tty ports (NEW)

Компилируем ядро.
Добавляем в файл /etc/conf.d/net:

vim /etc/conf.d/net

config_enp3s0="dhcp"
config_ppp0="ppp"
link_ppp0="enp3s0" #(Specify your ethernet interface)
plugins_ppp0="pppoe"
username_ppp0='1234' #(логин сети)
password_ppp0='5678' #(пароль сети)
pppd_ppp0="
noauth
defaultroute
usepeerdns
holdoff 3
child-timeout 60
lcp-echo-interval 15
lcp-echo-failure 3
noaccomp noccp nobsdcomp nodeflate nopcomp novj novjccomp"
rc_net_ppp0_need="net.enp3s0"

Добавляем символическую ссылку в /etc/init.d:

ln -s /etc/init.d/net.lo /etc/init.d/net.ppp0

Запускаем PPPoE

/etc/init.d/net.ppp0 start

Для systemd Создаём файл настроек соединения:

vim /etc/ppp/peers/provider

следующего содержания:

plugin rp-pppoe.so
# rp_pppoe_ac 'имя концентратора доступа'
# rp_pppoe_service 'имя службы PPPoE'
# сетевой интерфейс
enp3s0
name "логин провайдера"
usepeerdns
persist
# раскомментируйте, если вам нужен автодозвон "по требованию"
#demand
#idle 180
defaultroute
hide-password
noauth

Добавляем запись с паролем соединения в /etc/ppp/pap-secrets или /etc/ppp/chap-secrets, в зависимости от типа аутентификации, используемого вашим провайдером.
Если не уверены, можно добавить запись в оба файла, pppd выберет нужный самостоятельно.

логин провайдера * пароль провайдера

Пробуем установить соединение:

pppd call provider

или

pon provider (в данном случае просто pon)

где provider — имя файла настроек, созданного в /etc/ppp/peers.
Чтобы убедиться, что соединение PPPoE установлено, проверяем вывод pppd в системном логе:

journalctl -b --no-pager | grep pppd

Файл настроек /etc/ppp/peers/provider используется по умолчанию.
Если при вызове pppd было указано другое имя файла, вместо явного указания имени файла можно просто добавить символическую ссылку на этот файл:

ln -s /etc/ppp/peers/имя_соединения /etc/ppp/peers/provider

Теперь можно устанавливать соединение одной командой:

pon

Чтобы разорвать соединение, выполняем:

poff имя_соединения

Iptables

Для клиентских компьютеров в ядре должны быть активированы основные параметры:

[*] Networking support --->
Networking options --->
...
[*] TCP/IP networking
<*> IP: IPsec transport mode
<*> IP: IPsec tunnel mode
...
<*> INET: socket monitoring interface
...
<*> The IPv6 protocol --->
...
[*] Network packet filtering framework (Netfilter) --->
...
<M> Netfilter LOG over NFNETLINK interface
<*> Netfilter connection tracking support
...
-*- Netfilter Xtables support (required for ip_tables)
*** Xtables combined modules ***
...
*** Xtables matches ***
<*> "conntrack" connection tracking match support
...
IP: Netfilter Configuration --->
<*> IPv4 connection tracking support (required for NAT)
<*> IP tables support (required for filtering/masq/NAT)
<*> Packet filtering
<*> REJECT target support
...
IPv6: Netfilter Configuration --->
<*> IPv6 connection tracking support
<*> IP6 tables support (required for filtering)
< > "ipv6header" IPv6 Extension Headers Match
<*> Packet filtering
<*> REJECT target support

Для Router следующие параметры:

[*] Networking support --->
Networking options --->
[*] TCP/IP networking
[*] IP: multicasting
[*] IP: advanced router
...
[*] IP: ARP daemon support
[*] IP: TCP syncookie support
<M> IP: AH transformation
<M> IP: ESP transformation
<M> IP: IPComp transformation
<M> IP: IPsec transport mode
<M> IP: IPsec tunnel mode
<M> IP: IPsec BEET mode
<*> Large Receive Offload (ipv4/tcp)
<*> INET: socket monitoring interface
<M> UDP: socket monitoring interface
[ ] TCP: advanced congestion control --->
...
<M> The IPv6 protocol --->
...
[*] Network packet filtering framework (Netfilter) --->
[*] Advanced netfilter configuration
Core Netfilter Configuration --->
<M> "addrtype" address type match support
<M> "comment" match support
<M> "hl" hoplimit/TTL match support
<M> "limit" match support
<M> "multiport" Multiple port match support
<M> "recent" match support

Установка Iptables:

emerge --ask net-firewall/iptables

Программа nmap, которую обычно используют взломщики:

emerge --ask net-analyzer/nmap

Подсистема iptables и Netfilter встроена в ядро Linux.
Все сетевые пакеты, которые проходят через компьютер, отправляются компьютером или предназначены компьютеру, ядро направляет через фильтр iptables. Там эти пакеты поддаются проверкам и затем для каждой проверки, если она пройдена выполняется указанное в ней действие. Например, пакет передается дальше ядру для отправки целевой программе, или отбрасывается.
Все пакеты делятся на три типа: входящие, исходящие и проходящие.
Все пакеты делятся на три цепочки:
input - обрабатывает входящие пакеты и подключения. Например, если какой-либо внешний пользователь пытается подключиться к компьютеру по ssh или любой веб-сайт отправит свой контент по запросу браузера. Все эти пакеты попадут в эту цепочку;
forward - эта цепочка применяется для проходящих соединений. Сюда попадают пакеты, которые отправлены на ваш компьютер, но не предназначены ему, они просто пересылаются по сети к своей цели. Такое наблюдается на маршрутизаторах или, например, если компьютер раздает wifi;
output - эта цепочка используется для исходящих пакетов и соединений. Сюда попадают пакеты, которые были созданы при попытке выполнить ping или когда вы запускаете браузер и пытаетесь открыть любой сайт.
Для каждого типа пакетов можно установить набор правил, которые по очереди будут проверяться на соответствие с пакетом и если пакет соответствует, то применять к нему указанное в правиле действие. Правила образуют цепочку, поэтому input, output и forward называют цепочками, цепочками правил. Действий может быть несколько:
ACCEPT - разрешить прохождение пакета дальше по цепочке правил;
DROP - удалить пакет;
REJECT - отклонить пакет, отправителю будет отправлено сообщение, что пакет был отклонен;
LOG - сделать запись о пакете в лог файл;
QUEUE - отправить пакет пользовательскому приложению.
Правила могут проверять любые соответствия, например, по ip, по порту получателя или отправителя, заголовкам пакета и многому другому. Если пакет не подходит ни одному из правил, то к нему применяется действие по умолчанию, обычно ACCEPT.
Кроме перечисленных выше, есть еще две дополнительные цепочки правил:
prerouting - в эту цепочку пакет попадает перед обработкой iptables, система еще не знает куда он будет отправлен, в input, output или forward;
postrouting - сюда попадают все проходящие пакеты, которые уже прошли цепочку forward.
Над цепочками правил в iptables есть еще один уровень абстракции, и это таблицы. В системе есть несколько таблиц, и все они имеют стандартный набор цепочек input, forward и output. Таблицы предназначены для выполнения разных действий над пакетами, например для модификации или фильтрации. Фильтрация пакетов iptables осуществляется в таблице filter:
raw - предназначена для работы с сырыми пакетами, пока они еще не прошли обработку;
mangle - предназначена для модификации пакетов;
nat - обеспечивает работу nat, если вы хотите использовать компьютер в качестве маршрутизатора;
filter - основная таблица для фильтрации пакетов, используется по умолчанию.
Обычно команда имеет такой общий вид:
iptables [-t имя-таблицы] команда [шаблон] [-j действие]
имя-таблицы указывает таблицу, с которой нужно работать, этот параметр можно упустить, команда - нужное действие, например, создать или удалить правило, а дополнительные параметры описывают действие и правило, которое нужно выполнить.
Список команд:
-A имя-цепочки правило (добавить правило в конец цепочки; ключ --set-counters позволяет установить счётчики пакетов и байтов)
-I имя-цепочки номер правило (вставить правило в цепочку перед правилом с указанным номером, нумерация с 1; ключ --set-counters позволяет установить счётчики пакетов и байтов)
-R имя-цепочки номер правило (заменить; ключ --set-counters позволяет установить счётчики пакетов и байтов)
-D имя-цепочки номер (удалить правило с указанным номером, нумерация с 1)
-D имя-цепочки правило (удалить правило по текстуальному совпадению)
-C имя-цепочки пакет (тестировать прохождение пакета; исходящий адрес, адрес назначения, протокол, интерфейс, порты задаются соответствующими ключами)
-L [имя-цепочки] (показать список правил; дополнительные ключи:
-v (вывести дополнительную информацию, в частности, счётчики)
--exact (показывать счётчики без округления до KB, MB и т.д.)
--numeric (показывать адреса и номера портов в виде чисел)
--line-numbers (выводить номера правил)
-F имя-цепочки (удалить все правила из цепочки)
-Z имя-цепочки (обнулить счетчики)
-N имя-цепочки (создать цепочку)
-X имя-цепочки (удалить пустую цепочку, на которую нет ссылок)
-P имя-цепочки действие (изменить действие по умолчанию: ACCEPT, DROP, QUEUE, RETURN)
-E старое-имя-цепочки новое-имя-цепочки (переименовать цепочку)
Дополнительные опции для правил:
-p - указать протокол, один из tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp, mh;
-s - указать ip адрес устройства-отправителя пакета;
-d - указать ip адрес получателя;
-i - входной сетевой интерфейс;
-m, --match - указывает соответствие для использования, то есть модуль расширения, который проверяет конкретное свойство. Набор совпадений составляет условие, при котором вызывается цель. Match сначала оцениваются, как указано в командной строке, и работают в режиме короткого замыкания, т.е. если одно расширение дает ложное значение, оценка прекращается.
-o - исходящий сетевой интерфейс;
-j - выбрать действие, если правило подошло.
Просмотр правил iptables:

$ iptables -L -n
$ iptables -S

Можно указать нужную цепочку, чтобы вывести правила только для нее:

$ iptables -L INPUT

Нельзя просто так отключить iptables остановив сервис обновления правил iptables или даже удалив набор утилит для настройки. Подсистема работает на уровне ядра и не зависит от того, что там установлено. Поэтому если сделать что-то не так, нужно будет очистить правила:

$ iptables -F

Только для определенной цепочки:

$ iptables -F Input

Если для пакета не подходит ни одно правило, то для него применяется действие по умолчанию. Его можно задать с помощью опции -p:

$ iptables -p INPUT ACCEPT
$ iptables -p OUTPUT ACCEPT
$ iptables -p FORWARD DROP

В этом примере разрешаются цепочки INPUT и OUTPUT, но запрещается FORWARD.
Для блокировки пакетов можно использовать действие DROP, фильтровать пакеты, которые нужно заблокировать можно по множеству критериев, например, протоколу, ip адресу, маске сети, порту и многому другому.
Команда, которая позволяет добавить правило iptables для блокировки всех входящих пакетов от 10.10.10.10:

$ iptables -A INPUT -s 10.10.10.10 -j DROP

Блокировка исходящих пакетов на этот же адрес:

$ iptables -A OUTPUT -s 10.10.10.10 -j DROP

Блокировка диапазона ip выполняется подобным образом. Для этого нужно использовать маску сети 10.10.10.0/24. Это будут все адреса начиная от 10.10.10.0 до 10.10.10.255:

$ iptables -A INPUT -s 10.10.10.0/24 -j DROP

Или расширенный вариант маски:

$ iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP

Также можно заблокировать все входящие соединения ssh:

$ iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP

Для удаления правил iptables используется опцию D.
Так можно удалить правило iptables:

$ iptables -A OUTPUT -s 10.10.10.10 -j DROP

Запрет ICMP- сообщений, которые могут выдать дополнительную информацию о хосте или быть использованы для выполнения различных злонамеренных действий (например, модификации таблицы маршрутизации).
Таблица со списком возможных типов ICMP-сообщений:
0 — echo reply (echo-ответ, пинг)
3 — destination unreachable (адресат недосягаем)
4 — source quench (подавление источника, просьба посылать пакеты медленнее)
5 — redirect (редирект)
8 — echo request (echo-запрос, пинг)
9 — router advertisement (объявление маршрутизатора)
10 — router solicitation (ходатайство маршрутизатора)
11 — time-to-live exceeded (истечение срока жизни пакета)
12 — IP header bad (неправильный IP заголовок пакета)
13 — timestamp request (запрос значения счетчика времени)
14 — timestamp reply (ответ на запрос значения счетчика времени)
15 — information request (запрос информации)
16 — information reply (ответ на запрос информации)
17 — address mask request (запрос маски сети)
18 — address mask reply (ответ на запрос маски сети)
Ответ на некоторые ICMP-сообщения может привести к разглашению некоторой информации о хосте, в то время как другие — привести к модификации таблицы маршрутизации, поэтому их необходимо запретить.
Обычно выход во внешний мир разрешают ICMP-сообщениям 0, 3, 4, 11 и 12, в то время как на вход принимают только 3, 8 и 12.

Брутфорс.
Разведав информацию об открытых портах и ОС, взломщик предпринимает попытки проникновения в систему, которые могут быть основаны на эксплуатации дыр в сервисах, либо на подборе паролей.
Предотвратить возможность взлома сервисов брандмауэр не поможет, однако затормозить процесс перебора паролей — легко.
Для этого применяются возможности по ограничению количества пакетов, пришедших на машину с одного IP-адреса.
Вот как это можно сделать с помощью iptables:
# Цепочка для проверки соединений

# iptables -N brute_check

# Блокировка адреса, если за 60 секунд он инициировал более 2-х соединений

# iptables -A brute_check -m recent --update --seconds 60 --hitcount 2 -j DROP

# Если нет — разрешаем соединение и заносим адрес в список

# iptables -A brute_check -m recent --set -j ACCEPT

# Очищаем цепочку INPUT

# iptables -F INPUT

# Отправляем в цепочку brute_check всех, кто пытается подключиться к 22-му порту

# iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 22 -j brute_check
# iptables -P INPUT DROP

При такой конструкции Iptables блокирует все соединения по IP, а не только 22 порт. Лучше защищать от брутфорса так:

iptables -A brute_check -p tcp --syn --dport 22 -m recent --name radiator --set
iptables -A brute_check -p tcp --syn --dport 22 -m recent --name radiator --update --seconds 120 --hitcount 2 -j DROP
iptables -A INPUT -j brute_check

Спуфинг.
Спуфинг (подмена адреса отправителя пакета) может быть использован для осуществления DoS-атак или обхода брандмауэра.
В первом случае спуфинг дает огромное преимущество атакующему, так как существенно затрудняет реакцию на атаку (пакеты, приходящие с совершенно разными адресами отправителя, не так просто классифицировать и заблокировать) и затягивает процесс закрытия новых соединений (обычно поддельный адрес недостижим, поэтому закрытие соединения происходит лишь по истечению таймаута).
Спуфинг, осуществляемый для обхода системы защиты, менее опасен и в большинстве случаев поддается контролю.
Достаточно часто, блокируя внешние сетевые сервисы хоста, системные администраторы оставляют их открытыми для определенного диапазона адресов (например, для подключения со своей домашней машины).
Вычислив один из этих адресов, взломщик может сформировать пакет, указав этот адрес в качестве обратного, и таким образом «проскользнуть » через брандмауэр. Далее он может угадать номера последовательности TCP-пакетов и сделать так, чтобы доверяющий обратному адресу сервис выполнил нужное ему действие. Это очень трудная в реализации атака, которая, тем не менее, может быть выполнена грамотным специалистом, а если речь идет о протоколе UDP, то это под силу и кулхацкеру.
Для защиты от подобных атак достаточно не открывать порты незащищенных сервисов во внешний мир, а в случае резкой необходимости использовать защитные системы самих сервисов (например, сертификаты ssh) или механизм «стука в порты».
Ситуация становится более сложной, когда дело касается сетевого моста, разделяющего внутреннюю и внешнюю сети (или две локальных сети).
Доверительные отношения внутри локальной сети — обычное дело. Сервисы доступны всем, никакой аутентификации, шифрования и т.д. — просто лакомый кусочек для взломщика.
Находясь во внешней сети, он может узнать сетевую маску внутренней сети и сформировать пакеты с соответствующим ей обратным адресом, что приведет к получению доступа ко всем ресурсам локалки. Это действительно опасная ситуация, но ее легко предотвратить с помощью правильной настройки брандмауэра или ОС.
Для этого достаточно запретить прохождение пакетов, обратные адреса которых соответствуют используемым во внутренней сети, с внешнего интерфейса:

iptables -A INPUT -i $outif -s 192.168.1.0/24 -j DENY

В качестве альтернативы или дополнительной меры защиты нужно использовать специальные директивы ipfw и pf и настройки ядра Linux:

echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter

Эти три команды приводят к одинаковым результатам. Все пакеты, обратные адреса которых соответствуют маске сети другого интерфейса, отбрасываются.
Удаленное управления брандмауэром, получившего имя «стук в порты» (port knoking).
Суть его заключается в том, чтобы заставить файервол выполнять определенные действия после подключения к заданному порту.
Ниже приведен пример правил, открывающих порт SSH на 10 секунд после «стука» в 27520-ый порт iptables и port knocking.
# Цепочка для проверки соединений на защищаемый порт

iptables -N knock

# Разрешаем соединение, если стук был в течение последних 10 секунд

iptables -A knock -m recent --rcheck --seconds 10 -j ACCEPT

# Очищаем INPUT

iptables -F INPUT

# Разрешаем все, что относится к уже установленным соединениям

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Все попытки открыть соединение с 22-м портом отправляем на проверку в цепочку knock

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 22 -j knock

# Правило добавляет адрес стучащегося в список. Если та же машина в течение 10 секунд после стука обратится к 22-му порту, соединение будет установлено.
# Заносим адрес стучащегося в 27520-й порт в список

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 27520 -m recent --set

# При стуке в соседние порты удаляем адрес из списка

iptables -A INPUT -m conntrack --ctstate NEW -p tcp -m multiport --dport 27519,27521 -m recent --remove

# Запрещаем все

iptables -P INPUT DROP

iptables распространяется в пакете xtables-addons (patch-o-matic) и носит имя TARPIT. Это действие (такое же, как ACCEPT или DENY), которое «подвешивает» соединение, не позволяя атакующей стороне его закрыть.
Соединение, пакеты которого попадают в TARPIT, будет благополучно установлено, однако размер окна будет равен нулю, благодаря чему удаленная машина не сможет отправлять данные, расходуя свои ресурсы, а соединение будет закрыто только по истечению таймаута.
TARPIT можно использовать в экстренных случаях для защиты от DoS:

iptables -A INPUT -p tcp -m tcp -dport 80 -j TARPIT

Или же для введения атакующего в заблуждение и борьбы против сканеров портов (только обычное TCP-сканирование, '-sT'):

iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -j TARPIT

Эти правила создают видимость системы, в которой открыты все порты, однако при попытке подключения к любому из них (кроме 80 и 25) соединения будут «подвисать».
Того же результата, но без «провисших» соединений, можно добиться с помощью действия DELUDE, которое правильно отвечает на все попытки инициации соединения, но посылает RST-пакет в ответ на все остальные пакеты.
Для еще большего запутывания атакующего можно использовать действие CHAOS, которое случайным образом активирует одно из двух описанных выше действий.
Выяснение, какие порты прослушиваются на машине:

netstat -tuwpln

Команда netstat признана устаревшей и на смену ей пришла более быстрая и удобная в использовании команда ss.
Если запустить ss без аргументов командной строки или опций, она выведет полный список работающих соединений.
Команда ss (без опций) показывает очень много данных (подробности по всем соединениям, установленным по TCP, UDP и с помощью сокетов Unix), можно отправить вывод этой команды в файл для того, чтобы проанализировать его позже:

ss > ss_output

Флаги для команды ss:
-h, --help Вывести справку.
-V, --version Вывести версию программы.
-n, --numeric Не раскрывать имена служб.
-r, --resolve Не раскрывать номера адресов/портов.
-a, --all Показывать все сокеты.
-l, --listening Показывать слушающие сокеты.
-o, --options Показывать информацию таймера.
-e, --extended Показывать детальные сведения о сокете.
-m, --memory Показывать использование памяти сокетом.
-p, --processes Показывать процесс, использующий сокет.
-i, --info Показывать внутреннюю информацию TCP.
-s, --summary Выводить сводку. Эта опция не обрабатывает список сокетов, а получает сведения из других источников. Полезно при огромном количестве сокетов, что делает обработку файла /proc/net/tcp слишком долгим.
-4, --ipv4 Показывать только сокеты IP версии 4 (аналогично -f inet).
-6, --ipv6 Показывать только сокеты IP версии 6 (аналогично -f inet6).
-0, --packet Показывать пакетные сокеты.
-t, --tcp Показывать только сокеты TCP.
-u, --udp Показывать только сокеты UDP.
-d, --dccp Показывать только сокеты DCCP.
-w, --raw Показывать только сокеты RAW.
-x, --unix Показывать только сокеты Unix.
-f ТИП, --family=ТИП Показывать только сокеты указанного ТИПА. Поддерживаются следующие типы: unix, inet, inet6, link, netlink.
-A ЗАПРОС, --query=ЗАПРОС Список таблиц сокетов, разделенных запятыми. Поддерживаются следующие идентификаторы: all, inet, tcp, udp, raw, unix, packet, netlink, unix_dgram, unix_stream, packet_raw, packet_dgram.
-D ФАЙЛ Не показывать ничего, вывести необработанные данные о сокетах TCP в ФАЙЛ с учетом фильтров. Если ФАЙЛ указан как -, вывести на стандартный вывод.
-F ФАЙЛ, --filter=ФАЙЛ Прочитать фильтр из ФАЙЛА. Каждая строка ФАЙЛА интерпретируется как отдельная опция командной строки. Если ФАЙЛ указан как -, получить содержимое из стандартного ввода.
FILTER := [ state ФЛАГ_TCP ] [ ВЫРАЖЕНИЕ ] Обратитесь к официальной документации (пакет iproute-doc в Debian) для описания фильтров.
Фильтрация сокетов с использованием состояний TCP, например:

ss -4 state FILTER-NAME-HERE

Где FILTER-NAME-HERE может быть любым из приведённых ниже:
established
syn-sent
syn-recv
fin-wait-1
fin-wait-2
time-wait
closed
close-wait
last-ack
listen
closing
all : все вышеперечисленные состояния;
connected : все состояния, за исключением прослушивания и закрытия;
synchronized : все подключенные состояния, за исключением syn-sent;
bucket : gоказывать состояния, которые поддерживаются как мини-сокеты, т.е. время ожидания и syn-recv;
big : Противоположно состоянию bucket.
Формировать правила брандмауэра можно в скрипте.
Нет необходимости запускать скрипт после каждой загрузки.
Пример скрипта Iptables:

#!/bin/bash

IPTB="/sbin/iptables"
GENTOOSYNC="160.116.15.34 89.238.71.6"
SKYPEPORTLIST="3478 3479 3480 3481"
# Очищаем цепочки таблиц filter
$IPTB -F
$IPTB -X
$IPTB -Z
# Политики по умолчанию для filter
$IPTB -t filter -P INPUT DROP
$IPTB -t filter -P FORWARD DROP
$IPTB -t filter -P OUTPUT DROP
# Разрешение форвардинга для QEMU
$IPTB -t filter -A OUTPUT -o tap0 -j ACCEPT
# Политики для внутренних интерфейсов
$IPTB -A INPUT -i lo -j ACCEPT
# Все входящие установленные и связанные соединения пропускаем
$IPTB -t filter -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Разрешим прохождение служебных пакетов типа ping
$IPTB -t filter -A OUTPUT -p icmp -j ACCEPT
# Открытие портов для различных служб
$IPTB -A INPUT -p icmp --icmp-type 3 -j ACCEPT
$IPTB -A INPUT -p icmp --icmp-type 11 -j ACCEPT
$IPTB -A INPUT -p icmp --icmp-type 12 -j ACCEPT
$IPTB -A INPUT -p tcp --syn --dport 113 -j REJECT --reject-with tcp-reset
$IPTB -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT # SSH
$IPTB -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT # DNS (53 UDP)
$IPTB -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT # DNS (53 TCP )
$IPTB -t filter -A OUTPUT -p udp --dport 68 -j ACCEPT # dhcpcd
$IPTB -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT # HTTP client (80 TCP)
$IPTB -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT # POP3 (110 TCP)
$IPTB -t filter -A OUTPUT -p udp --dport 137 -j ACCEPT # nmbd Samba
$IPTB -t filter -A OUTPUT -p udp --dport 138 -j ACCEPT # nmbd Samba
$IPTB -t filter -A OUTPUT -p tcp --dport 139 -j ACCEPT # smbd Samba
$IPTB -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT # HTTPS client (443 TCP)
$IPTB -t filter -A OUTPUT -p tcp --dport 445 -j ACCEPT # smbd Samba
$IPTB -t filter -A OUTPUT -p tcp --dport 465 -j ACCEPT # Почта исходящие
$IPTB -t filter -A OUTPUT -p tcp --dport 631 -j ACCEPT # CUPS CLIENT (631 TCP)
$IPTB -t filter -A INPUT -p tcp -s 10.0.0.0/24 --dport 631 -j ACCEPT # CUPS SERVER (631 TCP)
$IPTB -t filter -A OUTPUT -p tcp --dport 993 -j ACCEPT # IMAP Почта входящие
$IPTB -t filter -A OUTPUT -p tcp --dport 995 -j ACCEPT # POP3 Почта входящие
$IPTB -t filter -A OUTPUT -p udp --dport 1194 -j ACCEPT # OpenVPN
$IPTB -t filter -A OUTPUT -p tcp --dport 3389 -j ACCEPT # qTox
$IPTB -t filter -A OUTPUT -p tcp --dport 5355 -j ACCEPT # systemd-resol
$IPTB -t filter -A OUTPUT -p tcp --dport 5900 -j ACCEPT # Spisy
$IPTB -t filter -A OUTPUT -p udp --dport 6881 -j ACCEPT # ktorrent
$IPTB -t filter -A OUTPUT -p udp --dport 7881 -j ACCEPT # ktorrent
$IPTB -t filter -A OUTPUT -p udp --dport 8881 -j ACCEPT # ktorrent
$IPTB -t filter -A OUTPUT -p tcp --dport 9050 -j ACCEPT # Tor
$IPTB -t filter -A OUTPUT -p tcp --dport 33445 -j ACCEPT # qTox
$IPTB -t filter -A OUTPUT -p tcp --destination-port 33446:46353 -j ACCEPT # KeePass
for NFSSERV in $NFSSERVERS
do
$IPTB -t filter -A INPUT -f -s $NFSSERV # Разрешили фрагментированные пакеты
$IPTB -t filter -A INPUT -s $NFSSERV -j ACCEPT
$IPTB -t filter -A OUTPUT -d $NFSSERV -j ACCEPT
done
# UDP ports for Skype
for PORTADDR in $SKYPEPORTLIST
do
$IPTB -t filter -A OUTPUT -p udp --dport $PORTADDR -j ACCEPT
done
# Gentoo emerge --sync (873 TCP)
for GSYNC in $GENTOOSYNC
do
$IPTB -t filter -A OUTPUT -p tcp -d $GSYNC --dport 873 -j ACCEPT
done
# Все установленные и связанные соединения пропускаем
$IPTB -t filter -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
ip6tables -F
ip6tables -X
ip6tables -Z
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT DROP
ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A INPUT -m conntrack --ctstate INVALID -j DROP
ip6tables -A INPUT -s fe80::/10 -p ipv6-icmp -j ACCEPT
ip6tables -A INPUT -p udp -m conntrack --ctstate NEW -j REJECT --reject-with icmp6-port-unreachable
ip6tables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j REJECT --reject-with tcp-reset
ip6tables -t filter -A OUTPUT -p udp --dport 58 -j ACCEPT # dhcpcd
ip6tables -t filter -A OUTPUT -p tcp --dport 139 -j ACCEPT # smbd Samba
ip6tables -t filter -A OUTPUT -p tcp --dport 445 -j ACCEPT # smbd Samba
ip6tables -t filter -A OUTPUT -p udp --dport 1194 -j ACCEPT # OpenVPN
ip6tables -t filter -A OUTPUT -p tcp --dport 5355 -j ACCEPT # systemd-resol
ip6tables -t filter -A OUTPUT -p tcp --dport 6881 -j ACCEPT # ktorrent
ip6tables -t filter -A OUTPUT -p udp --dport 6881 -j ACCEPT # ktorrent
ip6tables -t filter -A OUTPUT -p udp --dport 7881 -j ACCEPT # ktorrent
ip6tables -t filter -A OUTPUT -p udp --dport 8881 -j ACCEPT # ktorrent
ip6tables -t filter -A OUTPUT -p udp --dport 33445 -j ACCEPT # qTox

Все настройки iptables с помощью команд или после запуска скрипта сохранятся только до перезагрузки. После перезагрузки компьютера все изменения будут стерты. По этому для сохранения правила iptables, нужно выполнить команду:
Для IPv4

$ rc-service iptables save

Правила сохраняются обычно в /var/lib/iptables/rules-save и /var/lib/ip6tables/rules-save
Запуск iptables:

$ rc-service iptables start

Добавляем iptables в автозагрузку:

$ rc-update add iptables default

Для IPv6

$ rc-service ip6tables save
$ rc-service ip6tables start
$ rc-update add ip6tables default

Для запуска в systemd создаём юнит

iptables ip6tables
vim /etc/systemd/system/firewall.service vim /etc/systemd/system/firewall6.service
следующего содержания:
[Unit] [Unit]
Description=iptables Description=ip6tables
DefaultDependencies=false DefaultDependencies=false
[Service] [Service]
Type=oneshot Type=oneshot
RemainAfterExit=yes RemainAfterExit=yes
ExecStart=/sbin/iptables-restore /var/lib/iptables/rules-save ExecStart=/sbin/ip6tables-restore /var/lib/ip6tables/rules-save
[Install] [Install]
WantedBy=sysinit.target WantedBy=sysinit.target
Перезагружаем systemd для поиска новых или измененных юнитов:
systemctl daemon-reload
Сохранение правил:
systemctl start iptables-store systemctl start ip6tables-store
Включаем юнит в автозагрузку:
systemctl enable firewall.service systemctl enable firewall6.service
Запускаем юнит:
systemctl start firewall.service systemctl start firewall6.service


подключение к интернетуподключение к интернету

Продаются
книги

Оставить отзыв

Установи и
БУДЕШЬ СЧАСТЛИВ!

Спасибо, Господи, что взял деньгами...

Scrooge
Dollar
Ruble
Ruble
Gold