MiniDevicesInfo ИТ блоги 2019-11-17 2019-11-17 Отображаются все разделы
12345

root
0

Tweaks
pfSense
Сетевое железо
Mikrotik
Домашний хостинг


5 комментариев
Подключение к внешнему IP-адресу из внутренней сети для роутера Mikrotik

Пил сегодня кофе у друга на работе в гостях, общались о том о сем, и друг мне поведал об интересной проблеме: у него на работе стоит неплохой сервер, где хостятся их сайты, но эти сайты недоступны изнутри. Пока в чашке был кофе, мы немножко помучали его "роутер", как он называл свою коробку на базе PfSense, но к сожалению кофе закончилось раньше, чем мы успели найти решение. Этот PfSense отлично решал эту проблему ранее, но очередное обновление изменило интерфейс настроек, и мой друг-любитель ГУЁв, теперь сидит с головной болью в поисках большой галочки "Сделать все" :)

Ну да ладно, статья не о друге. Дома у меня творится примерно такая же ситуация, только в других масштабах. Точно такой же сервер, точно такая же организация сети, разве что железо поновее, и во главе стола сидит его величество Mikrotik. Поскольку у меня и у жены (а мы - основные потребители наших сайтов) на устройствах стоят Linux, то проблема была решена относительно бескровно, хотя и костыльно: при помощи записи в /etc/hosts.

А теперь, мудаки с просторов интернета, советующие делать подобные костыли нормальным людям - разбежитесь и ударьтесь об стенку! Это не решение. И сегодня я осознал, почему...

1) Представьте что у вас ноутбук. Как у меня, да, с которого иногда можно поработать, или написать статью на своем сайте, подобно этой. Все хорошо, /etc/hosts, и все работает вроде как. А теперь берем этот самый ноутбук, и идем к другу хвастаться своим сайтиком. Садимся, а сайтик-то не работает! Несколько минут смеха, а потом судорожное открывание консоли, и комментирование записи в /etc/hosts. Была бы на месте моего друга какая-нибудь девушка, она бы наверное не дала такому неудачнику. 

2) А представьте себе что у вас Wordpress, но нету домена, что вполне логично, ибо вы оттачиваете свой сайт, для того чтобы на днях купить под него какое-нибудь интересное доменное имя. И ведь логично, что для открытия этого сайта мы будем использовать прямой IP-адрес сервера, ну например http://192.168.1.2, кой и будет внесен как SITE URL в настройках Вордпресса. И это будет работать. А теперь представляем, что получится если на наш сайт попытаться зайти извне? Мудак, которого я раньше упоминал, может спросить "а зачем это делать?" А затем, мудак, что можно попросить друга открыть твой сайт у него из дому, потому что...у него в отличие от тебя, дома есть экзотический Windows с Internet Explorer, только у него есть монитор с каким-нибудь идиотским разрешением 1280х1024, и только он сможет зайти на твой сайт с планшетика на Android, о котором кстати мы еще поговорим. А еще можно пользоваться всякими интересными утилитами вроде Google Pagespeed Insights. 

Итак, если мы зайдем на наш сайт извне, первый запрос будет успешным, и первый ответ нашего сервера будет тоже успешным. И это будет редирект 301. Куда ? Мудак наверное не догадается, но я подскажу: на http://192.168.1.2, который мы прописали в Вордпрессе.

3) Ну а что будем делать с телефонами, планшетами, на Андроидах и Виндовсах, с которых тоже хочется и сайтики свои потестить, да и просто в них поработать ? Будем рутовать, костылить, ломать ?


В общем задумался я о том, что у меня появилась проблема, такая же как и у друга. Правда ребята из Mikrotik предоставили более адекватное решение, нежели ребята из условно-OpenSource PfSense, по крайней мере на поиск этого решения мне понадобилось полчаса и гронка винограда. Итак, как зайти по внешнему IP-адресу из локальной сети?


1) Заходим на страницу настройки IP->Firewall->NAT

2) Создаем новое правило

3) Chain выбираем dstnat

4) Src address указываем нашу внутреннюю сеть с маской, например 192.168.88.0/24

5) Dst address указываем наш адрес, который виден извне, например 74.90.54.2

6) Dst port конечно же ставим 80. Для каждого порта нужно будет делать свое правило

7) Опускаемся ниже, и в Action выбираем dstnat

8) В поле To Addresses прописываем внутренний IP-адрес нашего сервера, например 192.168.88.2

9) На этом все. Поднимаемся вверх, жмем Apply/Ok, наслаждаемся.


Отдельно хочу отметить, что удивлен сложившейся ситуацией: в самом нищебродском старом TP-link, в самом убогом ddwrt, есть галочка для решения этой проблемы проброса. В монстрах от Mikrotik, pfSense, и прочих Smoothwall - приходится лезть в дебри, и включать разные фичи с переменным успехом. Или заходить из своей сети на свои же сайты - очень не популярно?


Кстати буду благодарен если в комментариях напишут как настроить этот NAT Loopback на PfSense последней версии. Рабочее решение, пожалуйста :)


root
0

Умный дом
Сделай сам
Печатные платы
ESP8266


Без комментариев
ESP8266 прошивка по WiFi

ESP8266 - маленькое устройство для DIY.

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


Создавать свой способ перепрошивки мы будем на основе популярной прошивки NodeMCU, поэтому я подразумеваю что у вас есть уже готовый девайс, подключенный к ПК через UART. Разбирать, где скачать NodeMCU и как перепрошивать - я не буду, мануалов в сети масса. Перейдем к самой сути.


Основная идея прошивки на лету - возможность NodeMCU вставлять и исполнять файлы .lua на лету. Это означает что мы можем создать один статический файл (пусть это будет init.lua), в который можем вставлять другой файл (например test.lua), который в свою очередь будет динамическим и содержать нашу "прошивку".


Много ерунды писать не буду, а сразу приведу полный скрипт.


wifi.setmode(wifi.STATION)
wifi.sta.config("wp_h","")
print("IP")

print(wifi.sta.getip())

-- 1

srv=net.createServer(net.TCP)
srv:listen(80,function(conn)

    conn:on("receive", function(client,request)

-- 2

        local buf = "";
        local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
        if(method == nil)then
            _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");

        end

-- 3

   if vars=="fwstart" then
   file.open("test.lua", "w+")
                       end


-- 4

   if vars=="fwend" then
   file.flush()
   file.close()
                    end

    

-- 5                  

   if method=="POST" and vars=="fw" then
   r = request
   _,_,DataToGet, request = string.find(request, "Content%-Length: (%d+)(.+)")
   if DataToGet~=nil then
   l = string.len(r)
   DataToGet = tonumber(DataToGet)
   start = l-DataToGet
   payload = string.sub(r, start , l)
   file.writeline(payload)
                        end
                                    end   

-- 6

client:send(buf);

client:close();
collectgarbage();
    end)
end)
dofile("test.lua")


Теперь вкратце разберем что какой блок делает.

-- 1:

Создаем веб-сервер. Все как обычно.

-- 2:

Все GET запросы передаем в переменную vars

-- 3:

Если в GET запросе получаем строку "fwstart", то открываем файл test.lua на запись. Файл пересоздается.

-- 4:

Если в GET запросе получаем строку "fwend", то сбрасываем буферы, и закрываем файл test.lua

-- 5:

Если получаем POST запрос, и при этом в GET запросе есть строка "fw", то считываем то что пришло в POST-запросе, и пишем в файл test.lua

-- 6:

Конец веб-сервера. И запускаем файл test.lua

Это все.


Теперь как этим пользоваться, в картинках.


Интерфейс ESPlorer. Еще ничего не прошито, ESP8266 - девственно чиста



Теперь прошито. Файл test.lua не найден. Ведь мы еще ничего не создавали.


Теперь открываем линуксовую консоль (проще всего делать там, главное поймите принцип)


Собственно процесс прошивки таков:

curl 'http://192.168.88.223?fwstart'

curl --data 'print("This is a test!!")' http://192.168.88.223?fw
curl --data 'print("Hello, daemons")' http://192.168.88.223?fw
curl --data 'print("End of program")' http://192.168.88.223?fw
curl 'http://192.168.88.223?fwend'


После перезапуска ESP8266, видим что прошивка подхватилась, и вывела в консоль наши три предложения



Собственно на этом все, далее можно модернизировать программу по своему усмотрению.



root
0

Linux Debian
Tweaks
Фриланс


Без комментариев
Восстановление InnoDB MySQL

Как бы не убеждал нас Oracle и Mariadb о надежности InnoDB - это не так.

Поддержка транзакций и прочее страшные слова хороши до тех пор пока база данных не скрашилась (как вариант, не была дерзко скопирована в другое место). В этом случае наступает кризис, и останавливается работа.
Итак, описанный хак будет работать только в случае, если вы используете хранение каждой таблицы в отдельном файле (параметр innodb_file_per_table=1 в my.cnf). Если у вас такой настройки нет - сделайте ее, иначе будет поздно. Вы можете определить использование отдельного файла для таблицы, по присутствию множества .ibd файлов в каталоге базы данных.
Т.е., примерно в /var/lib/mysql/DATABASE_NAME/ у вас должны быть файлы с расширением FRM и IBD.
FRM - это структура таблицы. IBD - содержимое таблицы. Простое копирование не поможет, поскольку несмотря на то, что MySQL будет видеть названия таблиц, ни SELECT FROM ни DESC не получится.

Итак, допустим у вас есть все условия: бэкап с множеством IBD-файлов:
1) Удаляем файлы ibdata1 и логи в папке /var/lib/mysql (или в вашем каталоге с базами)
2) Перезапускаем MySQL. Он должен перезапуститься
3) Открываем консоль MySQL и заходим в него
4) Выполняем show databases; use <имя_вашей_базы>;show tables - вы должны увидеть таблицы.


Основной принцип восстановления таблиц из файлов следующий:
1) Создаем промежуточную базу данных
2) Восстанавливаем структуру каждой таблицы вашей поврежденной базы, при помощи утилиты
3) Создаем таблицы в промежуточной базе, на основе восстановленных из предыдущего пункта
4) Удаляем текущий контент таблицы, при помощи хитрой команды
5) Копируем физический файл с данными таблицы, из нашей поврежденной базы
6) Заставляем MySQL принять и перечитать новые данные.


Как это будет в командах.
1) cd /var/lib/mysql
2) rm ib_logfile0;rm ib_logfile1; rm ibdata1
3) service mysql restart
4) mysql -u'root' -p'ваш_пароль'
5) CREATE DATABASE swap;
6) quit
7) mysqlfrm --server=root:ваш_пароль@localhost:3306 --diagnostic <имя_файла.frm> > table.sql
8) mysql -u'root' -p'ваш_пароль' swap < table.sql
9) Предыдущие команды возможно вызовут ошибки, они незначительные, к примеру незакомментированное слово WARNING, но их придется устранить вручную
10) mysql -u'root' -p'ваш_пароль' swap
11) ALTER TABLE <имя_таблицы_которую мы создали пару пунктов назад> DISCARD TABLESPACE;
12) quit
13) cp <файл_таблицы.ibd из поврежденной базы> swap/ - попросту говоря, копируем восстанавливаемый файл IBD из папки старой базы, в папку с новой
14) mysql -u'root' -p'ваш_пароль' swap
15) ALTER TABLE <имя_таблицы_которую мы создали пару пунктов назад> IMPORT TABLESPACE;
16) Вуаля. service mysql restart


Для автоматизации рутинной работы, я написал скрипт
Код скрипта:

#!/bin/bash

pass='ваш_рутовый_пароль_на_mysql'

rm swap
db=$1
echo "================Restoring database $db======================="
cd $db
echo "1) Creating temp database _$db"
echo "drop database _$db;" | mysql -u'root' -p"$pass"
echo "create database _$db;" | mysql -u'root' -p"$pass"
echo "2) Re-creating table structure"
f=`ls | grep '.frm'`
cd ..
 for ii in $f;do
 tbl=`echo "$ii" | awk -F '.' {'print $1'}`
 echo " Creating structure for table $tbl"
 mysqlfrm --server=web:$pass@localhost:3306 --diagnostic $db/$ii | grep -v 'WARNING' | sed "s/$db/_$db/" > $db.$tbl.sql
 DONE=false
until $DONE ;do
read x || DONE=true
# Следующие строки нужны,чтобы заменять возможные апострофы в комментариях
xx=`echo $x | grep ' comment '`
if [[ "$xx" != "" ]];then
x=`echo $x | sed 's/"/\^/g' | sed "s/'/\"/" |  sed "s/',/\",/"`
                            fi
echo $x >> swap
done < $db.$tbl.sql
mv swap $db.$tbl.sql
mysql -u'root' -p"$pass" < $db.$tbl.sql
done
echo "Now will restart mysql..."
read a
# killall mysqld
# killall mysqld_safe
service mysql stop
/etc/init.d/mysql stop
service mysql start
echo "3) Discarding current table"
# cd ..
cd _$db
f=`ls | grep '.frm'`
for ii in $f;do
tbl=`echo "$ii" | awk -F '.' {'print $1'}`
printf " DISCARD _$db.$tbl..."
mv $tbl.ibd $tbl.bkp 
echo "USE _$db; ALTER TABLE $tbl DISCARD TABLESPACE;" | mysql -u'root' -p"$pass" 2> log
cp ../$db/$tbl.ibd $tbl.ibd

chmod 777 $tbl.ibd

echo "OK"

done
 f=`ls | grep '.ibd'`
 for ii in $f;do
 tbl=`echo "$ii" | awk -F '.' {'print $1'}`
 printf " IMPORT _$db.$tbl..."
 res=`echo "USE _$db; ALTER TABLE $tbl IMPORT TABLESPACE;" | mysql -u'root' -p"$pass" 2>err`
 err=`cat err | grep 'Data structure corruption'`
 # Если контент в IBD файле поврежден, мы его не восстановим, для этого придется оставить таблицу чистой, и снять с нее DISCARD
 if [[ "$err" != "" ]];then
 printf "Data corrupted, running restoration..."
 rm $tbl.ibd
 echo "USE _$db; ALTER TABLE $tbl DISCARD TABLESPACE;" | mysql -u'root' -p"$pass" 2> log
 mv $tbl.bkp $tbl.ibd
 echo "USE _$db; ALTER TABLE $tbl IMPORT TABLESPACE;" | mysql -u'root' -p"$pass" 2> log
 fi
 echo "OK"
 done
service mysql restart


Скрипт должен быть размещен в каталоге datadir (/var/lib/mysql)

Запускается он, находясь в каталоге, командой ./script.sh <имя_базы_данных>

Естественно, каталог с базой должен находиться здесь же. Скрипт создаст новую базу с таким же названием, но со знаком подчеркивания. Не забудьте так же поставить mysqlfrm (apt-get install mysql-utilities в Debian-based).


Не упрекайте меня пожалуйста за красоту программирования на bash, главная цель вовсе не она.

Надеюсь я вам помог.


root
1

Игровое железо
Апгрейды ПК
Новые разработки


Без комментариев
Обзор Gigabyte Brix GB-BSi3HA-6100

Очередной апгрейд очередного компьютера...

Как мне уже надоело искать эту золотую середину. Ни один компьютер практически не может полностью удовлетворить желание скорости. Один компьютер тормозит по процессору. Второй вроде не тормозит, но медленно грузится. А тут еще вышли SSD PCIE, и оказалось что нет разъема, снова апгрейд. Третий вроде хорошо работает по скорости, но много кушает и вдобавок шумит. 

В общем, поменял я старый (двухмесячной давности, хе) компьютер на новенький Gigabyte Brix. О нем и поведаю.


Это неттоп. Собран он на мобильном процессоре Core i3-6100U. И стоит порядка 10 000 грн, что относительно немного для такого класса устройств. Обзоров в интернете по нему я не нашел, есть на модель GB-BSi3HA-6100, но они кардинально различаются, примерно как Волга и Бентли.


Итак, чтобы не путать читателей и планирующих купить этот девайс, выложу фотографии обеих. Слева будет GB-BSi3HA-6100, справа - GB-BSi3H-6100. О различиях во внутренностях поговорим позже.

Лицо.


Жопа.


Разница спереди вполне очевидна. Кстати был конфликт с первым магазином у которого я хотел заказать этот ПК (Deshevshe.NET), в ходе которого смешные менеджеры предложили мне сделать скидку и привезти другую модель, мотивируя это тем что "мы честно говоря не нашли различий".

Различие - в наличии USB 3.1, который позволяет передавать данные со скоростью 10 Гбитc (в два раза быстрее чем USB 3.0, и в 1.9 раза быстрее чем SATA, и до 100 Вт заряда). А так же в разъеме будущего, USB 3.1 Type C, который маленький, и в который можно вставлять вслепую кабель любой стороной, т.е. симметричный. Странно что продавцы Deshevshe.net не знают, что они продают.

Кстати, пользуясь случаем, хочу порекомендовать магазин EuroPlus (Украина). Цены очень дешевые, ребята очень ответственно и быстро подошли к задаче, и товар был у меня на следующий же день). Сайт магазина - http://www.eplus.kiev.ua


Внутренности на первый взгляд тоже одинаковы внешне, за исключением одной маленькой детали: у обеих есть новомодный разъем M.2, но в дешевой версии (H), он поддерживает носители только в стандарте SATA (то есть тормознутые 550 Мбc в другой упаковке), а в более дорогой версии (HA) он поддерживает PCIE (NVME) со скоростью полтора-два Гбс. Совсем небольшое различие, да ? 


В процессе работы удалось выяснить, что Gigabyte мошенничает (точнее просто не предупреждает) о том, что PCI-E шина, подведенная к М.2 разъему, не 3.0, а 2.0. То есть максимальная скорость чтения вашего SSD будет не 2.5 Гб, а только 1.6. Учитывайте это, если собираетесь покупать этот компьютер под SSD, как сделал я.


Компьютер в целом абсолютно себя оправдывает, согласно своим габаритам, и своей ценовой категории. Работает шустро, практически не греется, места не занимает, и еле слышно шумит.


Большие плюсы:

1. Процессор Intel Core i3 6100U (последняя разработка Intel), что намного лучше чем в неттопах той же ценовой категории, включая Intel NUC;

2. Абсолютно небольшие габариты. 12х12 см, и высотой в 5 см;

3. Соответственно отличное встроенное видео Intel HD 520;

4. Поддержка DDR4-памяти. Новые технологии, все такое;

5. Наличие USB 3.1-порта, в том числе Type-C (универсального симметричного). За ним будущее;

6. Наличие WiFi стандарта b/g/n/ac, двухстандартного, 2.4 ГГц и 5 ГГц;

7. Наличие одновременно слота М.2 и стандартного SATA вместе с корзинкой под 2.5" диски;

8. Поддеркжа PCI-E разъемом M.2. А значит будут работать высокоскоростные SSD типа Samsung 950 Pro и Kingston Predator;

9. Питание от обычного ноутбучного 19В блока питания, собственно потребление такое же мизерное;

10. VESA-крепление. Можно закрепить за монитором;

11. Уникальная и легкая система разборки. Четыре винта в удобных резиновых подножках. Подножки действительно качественные, и отлично изолируют стол от шелеста вентилятора.


Большие минусы:

1. Отсутствие VGA-разъема. К старым проекторам и мониторам не подключишь;

2. Присутствие вентилятора. Хоть он и малошумный, но в спальне все же слышен шелест. Было бы не так обидно, если бы китайцы не сделали бесшумную систему из аллюминиевого корпуса;

3. Сдвоенный аудио-разъем под наушники и микрофон. Хотя колонки по отдельности - работают, хоть за это спасибо.


Небольшие минусы:

1. Как уже писал выше, PCI-E работает на скорости 2.0, а значит максимальная скорость чтения вашего SSD будет 1.6 Гбc, вместо 2.5 пиковых. На скорости это все равно не сказывается, пока главные тормоза в ОС, но все равно обидно;

2. Разъем SATA - специфическая косичка в специфическом разъеме. Если часто дергать и поломается - можно помахать ручкой;

3. Пластиковый, хоть и жутко красивый корпус;

4. Отсутствие возможности поставить вертикально. Нету ножек или хотя бы подставки.


Резюме:

Как видите, даже вкупе с небольшими минусами, количество его минусов (впрочем они так же субъективны) значительно ниже количества плюсов.


root
0

Linux Ubuntu
Linux ElementaryOS
Tweaks
Новые разработки


2 комментариев
Высер ElementaryOS Loki Beta

Наконец увидел свет долгожданный релиз ElementaryOS - системы, грозящейся порвать и Windows и MacOS, и даже Ubuntu. Спустя год громких обещаний, да.

На вопрос "почему так долго?" разработчики отвечали краткой отговоркой "Ждем стабильную Ubuntu 16.04". Человек мало-мальски знакомый с ОС на базе Linux, сразу заподозрит неладное, поскольку знает что любой дистрибутив - это всего лишь набор программ, объединенных одним репозиторием и системой установки. То есть например, нам ничего не мешает взять Ubuntu 8.04, бородатого 2008 года, и накатить туда Xfce 4.12, которое 2015 года. 

Но разработчики ElementaryOS решили по-другому. Они решили подождать, пока другие ребята возьмут ядро 4.4 (которому уже ого-го), прикрутят туда репозитории из debian testing, натянут туда сову unity, и выдадут в Mir. Дождались. Целых два месяца прошло, и вот долгожданный БЕТА.

Поставив эту ОС, я разочаровался. Максимум похоже на жуткую alpha, с кучей багов и детских болезней, которые простительны самостоятельной системе, но никак не форку Убунты.

Итак, пару скриншотов.

Ах как эстетично смотрится круглая иконка Midori среди нормальных квадратных иконок в докбаре. Неужто за год нельзя было оквадратить очертания? 







И даже дизайн (то чем так важно кичились разработчики) начал хромать. Только посмотрите - белое окно (наверное), без заголовка, с хаотично разбросанным текстом...Им явно нужно скооперироваться с ребятами из Arc.





Найденные сразу же баги.


1. Жуткие тормоза. Убунта в Кедах курят в сторонке. Мой Pentium Skylake + 8Gb DDR4 + PCI-E Samsung 950Pro - иногда лагает. Круто, а я только собирался поставить ее на EeePC с гигом мозгов.

2. Обновления можно устанавливать только по очереди. Здорово когда нужно обновить 50 приложений.

3. Libreoffice крашится с Segmentation Fault. Повторяю, компьютер 2016 года сборки, все по последним технологиям.

4. При загрузке долго ожидает. Секунд 30. Если подключена вебка. Без вебки грузится быстрее.

5. Lightdm не воспринимает тап (касание по тачпаду, которое имитирует левую кнопку мыши). Система воспринимает.

6. Иногда отказывается перезагружаться. sudo reboot работает всегда.

7. Нету меню "Закрепить в докбаре". Хотя отдельный plank его имеет.

8. Ноутбучные клавиши не работают. И дело не в ядре, то же самое ядро на Дебиане отлично регулирует громкость и яркость.

9. Та же самая потеря фокуса при переключении языка.

10. Та же самая необходимость ставить твики для изменения тривиальных настроек.

11. Та же самая мать ее, невозможность поставить CTRL+SHIFT для переключения языков.


В общем, ребята ГОД пропинали одно место, в итоге выпустили продукт с ошибками, которых уже лет 10 не имеет ни одно ДЕ. И даже предыдущие не исправили. Это плохо.

ElementaryOS не нужен


Если нужно красиво - можно ставить Debian + Cinnamon. Возможностей ого-го, в том числе поддержка плагинов. К десктопу, да. Захотели глобальное меню ? Плагин. Захотели таймер ? Плагин. Захотели запись экрана в видео ? Плагин в панель. Поддержка тем на высоте. Детские глюки быстро устраняются. А главное, разработчики выкатили новую версию, и она оооочень сильно отличается от предыдущей в лучшую сторону.

Если нужно быстро и красиво - можно ставить Debian + Xfce. Реально летает. Запускается быстрее, чем отпустишь кнопку мышки.

Не ставьте это убожество. По крайней мере ПОКАМЕСТ (а судя по предыдущей версии, Freya - никогда).

Посмотрите так же: Записки системного администратора _ и Подключение к внешнему IP-адресу из внутренней сети для роутера Mikrotik _


Вы должны войти в систему, чтобы создавать блоги

1-1 / 1-1
В этой строке мы предупреждаем Вас, что можем использовать так называемые cookies
Нам искренне плевать на введенную Вами информацию о себе. Мы просто запоминаем у Вас на устройстве то, что Вы же и настроили.