Есть такое понятие, как дружественный пользователю Linux. Возникло оно оно очень давно, возможно через несколько минут после того, как Линус Торвальдс анонсировал свою разработку в листе comp.os.minix. Трудно сказать принесла-ли пользу данная концепция и различные её воплощения на рабочей станции. Понятно одно, что прогресс на этом пути довольно-таки ощутимо не совпадает с ожиданиями этого самого пользователя.
Возможно дело в том, что производители коммерческих дистрибутивов Linux и производители ПК стараются показать, что вполне реалистично использовать на рабочей станции Linux и при этом не использовать консоль в качестве основного инструмента управления ОС. Возможно, в будущем так и будет, но сегодня консоль на домашнем компьютере так же незаменима, как и на сервере и для этого есть веские основания.
Предлагаем рассмотреть несколько сценариев из реальной жизни, где хочешь — не хочешь, все необходимо сделать в CLI. Таких примеров очень и очень много, это всего лишь пара кейсов в огромном множестве подобных.
Большинство дистрибутивов Linux дают возможность графической установки ОС, которая для продвинутого пользователя Windows, или macOS не представляет из себя ничего сложного. Есть свидетельства в пользу того, что Ubuntu работает из коробки для пользователя, который впервые ставит Linux.
Однако дальше сразу возникает необходимость ручками внести правки в /etc/sudoers для того, чтобы пользователь имел права на исполнение sudo команд. Входить под учетной записью root в DE окружение не удастся, по умолчанию большинство Desktop Manager-ов отключают эту опцию. Придется вручную снимать эти ограничения в консольном режиме, вот и уловка 22. Остается visudo /etc/sudoers, или в крайнем случае vim /etc/sudoers из под супер пользователя.
Так выгладит моя правка файла.
|18:42:09|admin@srv:[~]> sudo diff /etc/sudoers /etc/sudoers.orig
85c85
< %wheel ALL=(ALL) NOPASSWD: ALL
---
> # %wheel ALL=(ALL) NOPASSWD: ALL
Нужно всего лишь отключить комментирование в соответствующей строке, после чего достаточно включить пользователя в группу wheel. Странно было бы это делать в графике, если можно запустить всего лишь gpasswd -a admin wheel из под пользователя root.
Но раз уж у нас есть права sudo надо уметь ими пользоваться. Самое первое для чего эти права понадобятся — для установки и обновления программ. Можно конечно воспользоваться графическим фронтендом программ из репозитория, в конце концов даже Gentoo имеет GUI для своего portage. Однако ограниченность и второсортность этих средств настолько выпирают, что буквально подталкивают пользователя в сторону CLI.
Вы же не собираетесь вместо простого sudo aptitude update / sudo dnf update запускать графический фронтенд и беспомощно кататься вверх-вниз по списку пакетов. Если вы собираетесь оставаться на Linux всерьез и надолго, то необходимо освоить необходимый минимум консольных команд для вашего пакетного менеджера.
Чуть менее привычным делом является настройка шрифтов. Одной установкой шрифтов семейства Liberation, Noto, Dejavu и Droid дело не ограничивается. Нужно еще избавиться от использования древних шрифтов Microsoft из пакета corefonts. Проще всего их не ставить совсем, однако часто они проникают в систему, как зависимость для Wine, или других пакетов. В таком случае придется создать, или редактировать файл ~/.fonts.conf. Вот директива по избавлению от Arial.
<match target=«pattern»>
<test name=«family» qual=«any»>
<string>Arial</string>
</test>
<edit name=«family» binding=«same» mode=«assign»>
<string>Noto Sans</string>
</edit>
</match>
Хочу подчеркнуть, что проблема не в том, что используются шрифты Microsoft, а в том, что это очень старые версии их. Соответственно, на экране они выглядят не очень, мягко говоря. Только их и разрешено использовать в дистрибутивах Linux. Можно делать это в графическом редакторе, но файлы с точкой в начале имени придется хитрым способом открывать во встроенном файловом менеджере каждый раз, а это неудобно.
Кроме того, возможно придется шаманить с симлинками в /usr/share/fonts, или в /etc/fonts для того, чтобы избавиться от ШГ. Так что лучше сразу все делать в командной строке. На самом деле тут многие сходят с дистанции, стараясь как можно дольше делать все с помощью графических приложений, через какое-то время ломаются обновления, слетают драйвера и все катится в тартарары.
Этого нельзя допустить, поэтому сразу переходим к следующему этапу — необходимости освоить консольный текстовый редактор: vim, emacs, или их клоны. Поверьте не стоит привязываться к простеньким nano, или mcedit, в которых даже undo еще не завезли. Освоив эти редакторы вы спокойно можете редактировать конфигурационные файлы в /etc, $HOME и получить надежный контроль над системой.
Сейчас с NetworkManager настраивать сети стало намного проще, а раньше для настройки беспроводного соединения обязательно нужно было редактировать файл wpa_supplicant.conf. Однако и сегодня функционал NetworkManager во многом пока еще ограничен. Например в нем нельзя подключиться к vpn по протоколу Juniper Pulse с двухфакторной аутентификацией — только CLI.
|18:29:57|admin@srv:[~]> sudo openconnect --protocol=pulse \
--authgroup ТOTP -u jsmith https://my.company-gateway.com
В офисе вполне может случится так, что заблокированы многие порты на исходящий и входящий трафик по главной сети, но разблокированы во второстепенной. Если подключится ко второстепенной сети, то тогда многие важные ресурсы главной сети становятся недоступны. С другой стороны утыкаться в межсетевой экран, тоже не хочется. Какой выход?
Берем важные подсети главной сети и прописываем их статистическим маршрутом.
sudo ip route add 110.10.0.0/8 via 110.10.10.1;
После чего подключаемся ко второстепенной сети и остальной трафик направляем через нее. Так как метрика главной сети меньше в абсолютном значении, у нее приоритет выше и при двух параллельных default route трафик все же упорно идет через нее. Так как поменять метрику маршрута нельзя, проще удалить ненужный default route.
sudo ip route delete default dev eth0;
Для одного раза достаточно запустить эти две команды, но каждый день так подключаться неудобно, надо это автоматизировать. Для этого нужно создать скрипт в папке /etc/NetworkManager/dispatcher.d/.
|17:43:17|admin@srv:[~]> ls /etc/NetworkManager/dispatcher.d/
10-openrc-status no-wait.d pre-down.d pre-up.d
|17:43:22|admin@srv:[~]> cd /etc/NetworkManager/dispatcher.d/pre-up.d
|17:43:27|admin@srv:[~]> sudo chmod +x 10-office-netw.sh
Скрипты, которые следует выполнить перед активацией сетевого соединения должны находиться в pre-up.d. Соответственно, скрипты на случай отключения сетевого соединения следует класть в pre-down.d. Названия могут быть произвольные, если скриптов несколько, то они будут выполняться в алфавитном порядке.
#!/bin/bash
if [ «$1« == «eth0» ] && [ «$2« == «up» ]; then
ip route add 110.10.0.0/8 via 110.10.10.1
ip route delete default dev eth0
#более высокая метрика, чтобы быть ниже основного gw в ip route
ip route add default dev eth0 metric 700
fi
Объективности ради надо сказать, что директивы ip route add можно реализовать из интерфейса NetworkManager в свойствах в закладке соединения IPv4 => Routes.
Буквально каждый день мы получаем новые доказательство в пользу того, что неплохо бы обзавестись собственным VPN решением. Сегодня под запретом торренты, зарубежные букмекерские сайты, завтра решат ограничить социальные сети и онлайн-библиотеки, а затем и новостные ресурсы кому-то не понравятся. Благо технологии тоже не стоят на месте и при соответствующих навыках можно за 15 минут настроить Wireguard VPN и обходить все нелепые ограничения. Самое главное наличие Linux сервера с внешним, т․ е․ не российским IP адресом.
Вся настройка происходит исключительно с использование CLI и текстовых конфигурационных файлов. Это не полноценный гайд по настройке, так как весь процесс состоит из следующих этапов.
На самом деле в терминологии Wireguard участники сетевого соединения именуются не клиент и сервер, а peers — равные. Однако на деле, все же один из узлов выполняет функцию именно сервера, поэтому логичнее их так и именовать для данного кейса.
Конфигурационный файл VPN-сервера содержит собственный закрытый ключ и открытый ключ клиента. Обратное также верно, в конфигурационном файле VPN-клиента прописываем собственный закрытый ключ и открытый ключ сервера.
#client config
[Interface]
PrivateKey = uJPzgCQ6WNlAUp3s5rabE/EVt1qYh3Ym01sx6oJI0V4
Address = 192.168.10.2/24
[Peer]
PublicKey = qdjdqh2pN3DEMDUDRob8K3bp9BZFJbT59fprBrl99zM
AllowedIPs = 0.0.0.0/0
Endpoint = 172.105.211.120:51820
PersistentKeepalive = 20
Любая неточность в каждом из перечисленных пунктов, кроме проверки OSI L2 соединения приведет к сбою в работе VPN туннеля, но при необходимой сноровке все можно сделать быстро и точно.
#server conifg
[Interface]
Address = 192.168.10.1/24
ListenPort = 51820
PrivateKey = eEvqkSJVw/7cGUEcJXmeHiNFDLBGOz8GpScshecvNHU
SaveConfig = true
[Peer]
PublicKey = 2H8vRWKCrddLf8vPwwTLMfZcRhOj10UBdc0j8W7yQAk=
AllowedIPs = 192.168.10.2/32
В некоторых примерах AllowedIPs клиента бывает выставлен на внутренний туннельный IP адрес сервера непонятно зачем. Тогда только запросы на этот IP адрес и будут разрешены, если же выставить 0.0.0.0/0 то весь трафик пойдет через Wireguard VPN. Также Endpoint клиента обязательно должен указывать на внешний IP адрес сервера.
Остается настроить NAT masquerade для того, чтобы Wireguard сервер мог осуществлять маршрутизацию трафика в NAT среде.
#IPv4
[root@wgsrv ~]$ iptables -A FORWARD -i wg0 -j ACCEPT
[root@wgsrv ~]$ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#IPv6
[root@wgsrv ~]$ ip6tables -A FORWARD -i wg0 -j ACCEPT
[root@wgsrv ~]$ ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#NAT
[root@wgsrv ~]$ iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE
После чего надо сохранить правила в базе iptables, или netfilter. Также и сервис wg-quick, заведующий VPN туннелем Wireguard, необходимо добавить в автозагрузку.
[root@wgsrv ~]$ systemctl enable wg-quick@wg0
[root@wgsrv ~]$ systemctl netfilter-persistent save
[root@wgsrv ~]$ systemctl enable netfilter-persistent
Надеюсь приведенных примеров достаточно для того, чтобы показать насколько необходимо умение работать с CLI и насколько проще выполнять основные действия по системному администрированию даже для домашней рабочей станции с Linux OS.
Источник статьи: https://habr.com/ru/company/macloud/blog/558102/
Возможно дело в том, что производители коммерческих дистрибутивов Linux и производители ПК стараются показать, что вполне реалистично использовать на рабочей станции Linux и при этом не использовать консоль в качестве основного инструмента управления ОС. Возможно, в будущем так и будет, но сегодня консоль на домашнем компьютере так же незаменима, как и на сервере и для этого есть веские основания.
Предлагаем рассмотреть несколько сценариев из реальной жизни, где хочешь — не хочешь, все необходимо сделать в CLI. Таких примеров очень и очень много, это всего лишь пара кейсов в огромном множестве подобных.
Кейс 1 — настройка пользовательского окружения
Большинство дистрибутивов Linux дают возможность графической установки ОС, которая для продвинутого пользователя Windows, или macOS не представляет из себя ничего сложного. Есть свидетельства в пользу того, что Ubuntu работает из коробки для пользователя, который впервые ставит Linux.
Однако дальше сразу возникает необходимость ручками внести правки в /etc/sudoers для того, чтобы пользователь имел права на исполнение sudo команд. Входить под учетной записью root в DE окружение не удастся, по умолчанию большинство Desktop Manager-ов отключают эту опцию. Придется вручную снимать эти ограничения в консольном режиме, вот и уловка 22. Остается visudo /etc/sudoers, или в крайнем случае vim /etc/sudoers из под супер пользователя.
Так выгладит моя правка файла.
|18:42:09|admin@srv:[~]> sudo diff /etc/sudoers /etc/sudoers.orig
85c85
< %wheel ALL=(ALL) NOPASSWD: ALL
---
> # %wheel ALL=(ALL) NOPASSWD: ALL
Нужно всего лишь отключить комментирование в соответствующей строке, после чего достаточно включить пользователя в группу wheel. Странно было бы это делать в графике, если можно запустить всего лишь gpasswd -a admin wheel из под пользователя root.
Но раз уж у нас есть права sudo надо уметь ими пользоваться. Самое первое для чего эти права понадобятся — для установки и обновления программ. Можно конечно воспользоваться графическим фронтендом программ из репозитория, в конце концов даже Gentoo имеет GUI для своего portage. Однако ограниченность и второсортность этих средств настолько выпирают, что буквально подталкивают пользователя в сторону CLI.
Вы же не собираетесь вместо простого sudo aptitude update / sudo dnf update запускать графический фронтенд и беспомощно кататься вверх-вниз по списку пакетов. Если вы собираетесь оставаться на Linux всерьез и надолго, то необходимо освоить необходимый минимум консольных команд для вашего пакетного менеджера.
Чуть менее привычным делом является настройка шрифтов. Одной установкой шрифтов семейства Liberation, Noto, Dejavu и Droid дело не ограничивается. Нужно еще избавиться от использования древних шрифтов Microsoft из пакета corefonts. Проще всего их не ставить совсем, однако часто они проникают в систему, как зависимость для Wine, или других пакетов. В таком случае придется создать, или редактировать файл ~/.fonts.conf. Вот директива по избавлению от Arial.
<match target=«pattern»>
<test name=«family» qual=«any»>
<string>Arial</string>
</test>
<edit name=«family» binding=«same» mode=«assign»>
<string>Noto Sans</string>
</edit>
</match>
Хочу подчеркнуть, что проблема не в том, что используются шрифты Microsoft, а в том, что это очень старые версии их. Соответственно, на экране они выглядят не очень, мягко говоря. Только их и разрешено использовать в дистрибутивах Linux. Можно делать это в графическом редакторе, но файлы с точкой в начале имени придется хитрым способом открывать во встроенном файловом менеджере каждый раз, а это неудобно.
Кроме того, возможно придется шаманить с симлинками в /usr/share/fonts, или в /etc/fonts для того, чтобы избавиться от ШГ. Так что лучше сразу все делать в командной строке. На самом деле тут многие сходят с дистанции, стараясь как можно дольше делать все с помощью графических приложений, через какое-то время ломаются обновления, слетают драйвера и все катится в тартарары.
Этого нельзя допустить, поэтому сразу переходим к следующему этапу — необходимости освоить консольный текстовый редактор: vim, emacs, или их клоны. Поверьте не стоит привязываться к простеньким nano, или mcedit, в которых даже undo еще не завезли. Освоив эти редакторы вы спокойно можете редактировать конфигурационные файлы в /etc, $HOME и получить надежный контроль над системой.
Кейс 2 — настроить сетевое окружение в офисе
Сейчас с NetworkManager настраивать сети стало намного проще, а раньше для настройки беспроводного соединения обязательно нужно было редактировать файл wpa_supplicant.conf. Однако и сегодня функционал NetworkManager во многом пока еще ограничен. Например в нем нельзя подключиться к vpn по протоколу Juniper Pulse с двухфакторной аутентификацией — только CLI.
|18:29:57|admin@srv:[~]> sudo openconnect --protocol=pulse \
--authgroup ТOTP -u jsmith https://my.company-gateway.com
В офисе вполне может случится так, что заблокированы многие порты на исходящий и входящий трафик по главной сети, но разблокированы во второстепенной. Если подключится ко второстепенной сети, то тогда многие важные ресурсы главной сети становятся недоступны. С другой стороны утыкаться в межсетевой экран, тоже не хочется. Какой выход?
Берем важные подсети главной сети и прописываем их статистическим маршрутом.
sudo ip route add 110.10.0.0/8 via 110.10.10.1;
После чего подключаемся ко второстепенной сети и остальной трафик направляем через нее. Так как метрика главной сети меньше в абсолютном значении, у нее приоритет выше и при двух параллельных default route трафик все же упорно идет через нее. Так как поменять метрику маршрута нельзя, проще удалить ненужный default route.
sudo ip route delete default dev eth0;
Для одного раза достаточно запустить эти две команды, но каждый день так подключаться неудобно, надо это автоматизировать. Для этого нужно создать скрипт в папке /etc/NetworkManager/dispatcher.d/.
|17:43:17|admin@srv:[~]> ls /etc/NetworkManager/dispatcher.d/
10-openrc-status no-wait.d pre-down.d pre-up.d
|17:43:22|admin@srv:[~]> cd /etc/NetworkManager/dispatcher.d/pre-up.d
|17:43:27|admin@srv:[~]> sudo chmod +x 10-office-netw.sh
Скрипты, которые следует выполнить перед активацией сетевого соединения должны находиться в pre-up.d. Соответственно, скрипты на случай отключения сетевого соединения следует класть в pre-down.d. Названия могут быть произвольные, если скриптов несколько, то они будут выполняться в алфавитном порядке.
#!/bin/bash
if [ «$1« == «eth0» ] && [ «$2« == «up» ]; then
ip route add 110.10.0.0/8 via 110.10.10.1
ip route delete default dev eth0
#более высокая метрика, чтобы быть ниже основного gw в ip route
ip route add default dev eth0 metric 700
fi
Объективности ради надо сказать, что директивы ip route add можно реализовать из интерфейса NetworkManager в свойствах в закладке соединения IPv4 => Routes.
Кейс 3 — поднять Wireguard VPN
Буквально каждый день мы получаем новые доказательство в пользу того, что неплохо бы обзавестись собственным VPN решением. Сегодня под запретом торренты, зарубежные букмекерские сайты, завтра решат ограничить социальные сети и онлайн-библиотеки, а затем и новостные ресурсы кому-то не понравятся. Благо технологии тоже не стоят на месте и при соответствующих навыках можно за 15 минут настроить Wireguard VPN и обходить все нелепые ограничения. Самое главное наличие Linux сервера с внешним, т․ е․ не российским IP адресом.
Вся настройка происходит исключительно с использование CLI и текстовых конфигурационных файлов. Это не полноценный гайд по настройке, так как весь процесс состоит из следующих этапов.
- Установить пакет утилит Wireguard.
aptitude install wireguard-tools - Установить kernel-headers для более ранних версий ядра.
aptitude install linux-headers - Открыть наружу связующий UDP порт (в нашем примере 51820) с управляющей консоли сервиса виртуального сервера.
- Создать открытый и закрытый ключи для Wireguard на клиенте и сервере.
umask 077; wg genkey | tee privatekey | wg pubkey > publickey - Создать конфигурационный файл в /etc/wireguard.
- Проверить наличие L2 соединения.
wg show, если есть нечто вроде transfer: 4.80 MiB received, 1833.04 KiB sent, то это хороший признак. - Подключить IP Forwarding с помощью sysctl -w net.ipv4.ip_forward=1 и прописать в /etc/sysctl.conf, если этого еще не было сделано.
- Настроить маршрутизацию трафика и NAT masquerade.
На самом деле в терминологии Wireguard участники сетевого соединения именуются не клиент и сервер, а peers — равные. Однако на деле, все же один из узлов выполняет функцию именно сервера, поэтому логичнее их так и именовать для данного кейса.
Конфигурационный файл VPN-сервера содержит собственный закрытый ключ и открытый ключ клиента. Обратное также верно, в конфигурационном файле VPN-клиента прописываем собственный закрытый ключ и открытый ключ сервера.
#client config
[Interface]
PrivateKey = uJPzgCQ6WNlAUp3s5rabE/EVt1qYh3Ym01sx6oJI0V4
Address = 192.168.10.2/24
[Peer]
PublicKey = qdjdqh2pN3DEMDUDRob8K3bp9BZFJbT59fprBrl99zM
AllowedIPs = 0.0.0.0/0
Endpoint = 172.105.211.120:51820
PersistentKeepalive = 20
Любая неточность в каждом из перечисленных пунктов, кроме проверки OSI L2 соединения приведет к сбою в работе VPN туннеля, но при необходимой сноровке все можно сделать быстро и точно.
#server conifg
[Interface]
Address = 192.168.10.1/24
ListenPort = 51820
PrivateKey = eEvqkSJVw/7cGUEcJXmeHiNFDLBGOz8GpScshecvNHU
SaveConfig = true
[Peer]
PublicKey = 2H8vRWKCrddLf8vPwwTLMfZcRhOj10UBdc0j8W7yQAk=
AllowedIPs = 192.168.10.2/32
В некоторых примерах AllowedIPs клиента бывает выставлен на внутренний туннельный IP адрес сервера непонятно зачем. Тогда только запросы на этот IP адрес и будут разрешены, если же выставить 0.0.0.0/0 то весь трафик пойдет через Wireguard VPN. Также Endpoint клиента обязательно должен указывать на внешний IP адрес сервера.
Остается настроить NAT masquerade для того, чтобы Wireguard сервер мог осуществлять маршрутизацию трафика в NAT среде.
#IPv4
[root@wgsrv ~]$ iptables -A FORWARD -i wg0 -j ACCEPT
[root@wgsrv ~]$ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#IPv6
[root@wgsrv ~]$ ip6tables -A FORWARD -i wg0 -j ACCEPT
[root@wgsrv ~]$ ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#NAT
[root@wgsrv ~]$ iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE
После чего надо сохранить правила в базе iptables, или netfilter. Также и сервис wg-quick, заведующий VPN туннелем Wireguard, необходимо добавить в автозагрузку.
[root@wgsrv ~]$ systemctl enable wg-quick@wg0
[root@wgsrv ~]$ systemctl netfilter-persistent save
[root@wgsrv ~]$ systemctl enable netfilter-persistent
Заключение
Надеюсь приведенных примеров достаточно для того, чтобы показать насколько необходимо умение работать с CLI и насколько проще выполнять основные действия по системному администрированию даже для домашней рабочей станции с Linux OS.
Источник статьи: https://habr.com/ru/company/macloud/blog/558102/