Автоматический перезапуск апача. watchdog apache linux

Создаем скрипт в домашней дирректории с правами на запуск. Например apache2rst.sh

#!/bin/bash
ps ax | grep apache2 | grep -v grep -q || /etc/init.d/apache2 restart > /dev/null
reply=`curl -s -L --head -w "%{http_code}\n" http://mysite.ru | tail -n1`
if grep sheph! /var/log/watchdog-apache.log > /dev/null
then
    sed "/^.*[sheph\!]$/d" /var/log/watchdog-apache.log > /tmp/watchdog-apache.log
    cp /tmp/watchdog-apache.log /var/log/watchdog-apache.log
    echo "`date +%d-%m-%Y` `date +%H:%M:%S` Use ok, sheph!" >> /var/log/watchdog-apache.log
else
    echo "`date +%d-%m-%Y` `date +%H:%M:%S` 2 Use ok, sheph!" >> /var/log/watchdog-apache.log
fi
if [ $reply -ne "200" ]
then
echo "`date +%d-%m-%Y`  `date +%H:%M:%S%` Sheph, use propalo. Server podvis." >> /var/log/watchdog-apache.log
/etc/init.d/apache2 restart
echo "Site mysite.ru upal. Status="$reply | mail -s "Site upal" myemail@gmail.com
fi
exit 0
Добавляем его в крон рута

sudo crontab -eu root
Будем запускать раз в минуту

* * * * * /home/myuser/apache2rst.sh >> /var/log/watchdog-apache.log

21 пример использования iptables для администраторов.

Знак # означает, что команда выполняется от root. Откройте заранее консоль с рутовыми правами - sudo -i в Debian-based системах или su в остальных.

1. Показать статус.

# iptables -L -n -v
Где:
-L : Показать список правил.
-v : Отображать дополнительную информацию. Эта опция показывает имя интерфейса, опции, TOS маски. Также отображает суффиксы 'K', 'M' or 'G'.
-n : Отображать IP адрес и порт числами (не используя DNS сервера для определения имен. Это ускорит отображение).

2. Отобразить список правил с номерами строк.

# iptables -n -L -v --line-numbers
Вы можете использовать номера строк для того, чтобы добавлять новые правила.

3. Отобразить INPUT или OUTPUT цепочки правил.

# iptables -L INPUT -n -v
# iptables -L OUTPUT -n -v --line-numbers

4. Остановить, запустить, перезапустить файрвол.

Силами самой системы:
# service ufw stop
# service ufw start
Можно также использовать команды iptables для того, чтобы остановить файрвол и удалить все правила:
# iptables -F
# iptables -X
# iptables -t nat -F
# iptables -t nat -X
# iptables -t mangle -F
# iptables -t mangle -X
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT
Где:
-F : Удалить (flush) все правила.
-X : Удалить цепочку.
-t table_name : Выбрать таблицу (nat или mangle) и удалить все правила.
-P : Выбрать действия по умолчанию (такие, как DROP, REJECT, или ACCEPT).

5. Удалить правила файрвола.

Чтобы отобразить номер строки с существующими правилами:
# iptables -L INPUT -n --line-numbers
# iptables -L OUTPUT -n --line-numbers
# iptables -L OUTPUT -n --line-numbers | less
# iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1
Получим список IP адресов. Просто посмотрим на номер слева и удалим соответствующую строку. К примеру для номера 3:
# iptables -D INPUT 3
Или найдем IP адрес источника (202.54.1.1) и удалим из правила:
# iptables -D INPUT -s 202.54.1.1 -j DROP
Где:
-D : Удалить одно или несколько правил из цепочки.

6. Добавить правило в файрвол.

Чтобы добавить одно или несколько правил в цепочку, для начала отобразим список с использованием номеров строк:
# iptables -L INPUT -n --line-numbers
Чтобы вставить правило между 1 и 2 строкой:
# iptables -I INPUT 2 -s 202.54.1.2 -j DROP
Проверим, обновилось ли правило:
# iptables -L INPUT -n --line-numbers
7. Сохраняем правила файрвола.
Через iptables-save:
# iptables-save > /etc/iptables.rules

8. Восстанавливаем правила.

Через iptables-restore
# iptables-restore < /etc/iptables.rules

9. Устанавливаем политики по умолчанию.

Чтобы сбрасывать весь трафик:
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -P FORWARD DROP
# iptables -L -v -n
После вышеперечисленных команд ни один пакет не покинет данный хост.
# ping google.com

10. Блокировать только входящие соединения.

Чтобы сбрасывать все не инициированные вами входящие пакеты, но разрешить исходящий трафик:
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -L -v -n
Пакеты исходящие и те, которые были запомнены в рамках установленных сессий - разрешены.
# ping google.com

11. Сбрасывать адреса изолированных сетей в публичной сети.

# iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Список IP адресов для изолированных сетей:
10.0.0.0/8 -j (A)
172.16.0.0/12 (B)
192.168.0.0/16 (C)
224.0.0.0/4 (MULTICAST D)
240.0.0.0/5 (E)
127.0.0.0/8 (LOOPBACK)

12. Блокировка определенного IP адреса.

Чтобы заблокировать адрес взломщика 1.2.3.4:
# iptables -A INPUT -s 1.2.3.4 -j DROP
# iptables -A INPUT -s 192.168.0.0/24 -j DROP
# iptables -I INPUT -m iprange --src-range 5.143.231.0-5.143.231.255 -j DROP

13. Заблокировать входящие запросы порта.

Чтобы заблокировать все входящие запросы порта 80:
# iptables -A INPUT -p tcp --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP
Чтобы заблокировать запрос порта 80 с адреса 1.2.3.4:
# iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP

14. Заблокировать запросы на исходящий IP адрес.

Чтобы заблокировать определенный домен, узнаем его адрес:
# host -t a facebook.com
Вывод: facebook.com has address 69.171.228.40
Найдем CIDR для 69.171.228.40:
# whois 69.171.228.40 | grep CIDR
Вывод:
CIDR: 69.171.224.0/19
Заблокируем доступ на 69.171.224.0/19:
# iptables -A OUTPUT -p tcp -d 69.171.224.0/19 -j DROP
Также можно использовать домен для блокировки:
# iptables -A OUTPUT -p tcp -d www.fаcebook.com -j DROP
# iptables -A OUTPUT -p tcp -d fаcebook.com -j DROP

15. Записать событие и сбросить.

Чтобы записать в журнал движение пакетов перед сбросом, добавим правило:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Проверим журнал (по умолчанию /var/log/messages):
# tail -f /var/log/messages
# grep -i --color 'IP SPOOF' /var/log/messages

16. Записать событие и сбросить (с ограничением на количество записей).

Чтобы не переполнить раздел раздутым журналом, ограничим количество записей с помощью -m. К примеру, чтобы записывать каждые 5 минут максимум 7 строк:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

16. Сбрасывать или разрешить трафик с определенных MAC адресов.

# iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP
## *разрешить только для TCP port # 8080 с mac адреса 00:0F:EA:91:04:07 * ##
# iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT

17. Разрешить или запретить ICMP Ping запросы.

Чтобы запретить ping:
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
Разрешить для определенных сетей / хостов:
# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT
Разрешить только часть ICMP запросов:
### ** предполагается, что политики по умолчанию для входящих установлены в DROP ** ###
# iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
## ** разрешим отвечать на запрос ** ##
# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

18. Открыть диапазон портов.

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT

19. Открыть диапазон адресов.

## разрешить подключение к порту 80 (Apache) если адрес в диапазоне от 192.168.1.100 до 192.168.1.200 ##
# iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT
## пример для nat ##
# iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25

20. Закрыть или открыть стандартные порты.

Заменить ACCEPT на DROP, чтобы заблокировать порт.
## ssh tcp port 22 ##
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
## cups (printing service) udp/tcp port 631 для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT
## time sync via NTP для локальной сети (udp port 123) ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT
## tcp port 25 (smtp) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT
# dns server ports ##
iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
## http/https www server port ##
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT
## tcp port 110 (pop3) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT
## tcp port 143 (imap) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT
## Samba file server для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT
## proxy server для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT
## mysql server для локальной сети ##
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

21. Ограничить количество параллельных соединений к серверу для одного адреса.

Для ограничений используется connlimit модуль. Чтобы разрешить только 3 ssh соединения на одного клиента:
# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
Установить количество запросов HTTP до 20:
# iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP
Где:
--connlimit-above 3 : Указывает, что правило действует только если количество соединений превышает 3.
--connlimit-mask 24 : Указывает маску сети.

Помощь по iptables.

Для поиска помощи по iptables, воспользуемся man:
$ man iptables
Чтобы посмотреть помощь по определенным командам и целям:
# iptables -j DROP -h

Проверка правила iptables.

Проверяем открытость / закрытость портов:
# netstat -tulpn
Проверяем открытость / закрытость определенного порта:
# netstat -tulpn | grep :80
Проверим, что iptables разрешает соединение с 80 портом:
# iptables -L INPUT -v -n | grep 80
В противном случае откроем его для всех:
# iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
Проверяем с помощью telnet
$ telnet ya.ru 80
Можно использовать nmap для проверки:
$ nmap -sS -p 80 ya.ru

Часто используемые команды и конструкции при разработке на Bitrix

Вывод массива php

Часто есть необходимость посмотреть что содержит переменная или массив. Ниже несколько вариантов как это можно сделать, в том числе незаметно для посетителей сайта.

<div style="display: none;"><? echo json_encode($arResult['ITEMS']);?></div>
<textarea style="display: none;"><? echo var_export($arResult['ITEMS']);?></textarea&gt
<?global $USER; if($USER->isAdmin()){echo ‘<pre>’;print_r($array);echo ‘</pre>}?>
<? echo "<pre>"; print_r ($arResult); echo "</pre>"; ?>
<?echo "<pre style='display: inline;'>"; print_r(get_defined_vars());echo "</pre>";?> //вывод массива всех определенных серверных и пользовательских переменных

Запись массива в файл или лог Apache

Если нет возможности вывести массив на страницу, то можно записать его в файл

$current = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/log.txt');

$current .= "John Smith\n";

$current .= var_export($_SESSION, true);

file_put_contents($file, $current);


или лог Apache


error_log ("blyat` ".var_export($arStatus, true), 0);
error_log ("blyat` ".var_export($arStatus, true), 1, "wer@mail.ru")

Вывод лога в реальном времени.

tail -f /var/log/syslog

Работа с базой

Посмотреть какие запросы идут в базу можно так:
В терминале
mysql -uroot -p
пароль
затем
SHOW PROCESSLIST;

Прямое обращение к базе работает на много быстрее чем через API битрикса.

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/dbconn.php");
$db=new PDO($DBType.':host='.$DBHost.';dbname='.$DBName, $DBLogin, $DBPassword);
$db->query("SET CHARACTER SET utf8");
$res=$db->prepare(" SELECT VALUE FROM `b_iblock_element_property`  WHERE (`IBLOCK_PROPERTY_ID`='3847' and `IBLOCK_ELEMENT_ID` LIKE '%".$item['id']."%')");
 $res->execute();// выборка из базы возвращает код товара поставщика по внутреннему коду товара
 if($row=$res->fetch()){
  if ($row<1){error_log ("пусто", 0);}
  else  echo $row[0];
 }

Интерактивная консоль php

Проверить код можно в интерактивной консоли php. Для этого в терминале нужно запустить команду 
php -a

SSH

Монтируем файловую систему удаленного сервера к своей
sshfs user@domen.ru:/ /media/sshfsdomen.ru -o reconnect

Если злобный админ закрыл куда-нибудь доступ
sudo ssh -D 777 user@domen.ru
получаем socks сервер на localhost:777

Просмотр лога в реальном времени.
ssh myyser@site.ru tail -f /var/log/nginx/error.log

Посмотреть кто зашел
who

Проверка свободного места на диске

Куда делось место на диске покажет команда
df -h
du -| grep "[0-9]M" | sort --r

Работа с архивами

Распаковать бэкап битрикса можно командой<
sudo cat *.* | tar xzv

Поиск куска кода

sudo find -type f -name '*.php' | xargs grep -l "echo '$aritem" --color

Задать права на файлы рекурсивно

sudo chmod -R 777 /bitrix/templates/newtempl

Дамп TCP

tcpdump -vX -i eth0 port 80

Смотрим подключения

netstat -tap | grep nginx


fail2ban iptables

Забаннить
iptables -I INPUT -j DROP -s 58.40.10.2
iptables -I INPUT -m iprange --src-range 5.143.231.0-5.143.231.255 -j DROP


Алиасы .bashrc или в .bash_aliases для быстрого банна
alias ban=’iptables -I INPUT -j DROP -s’
alias unban=’iptables -D INPUT -j DROP -s’


Список забанненых
iptables-saveили
iptables -L -n -v --line-numbers


Удалить ip из банна
iptables -D fail2ban-ssh -j DROP -s 46.20.67.32/32
iptables -D fail2ban-ssh 1

Остановить, запустить файрвол.
service ufw stop
service ufw start


Сохраняем правила файрвола.
iptables-save > /etc/iptables.rules


Восстанавливаем правила.
iptables-restore < /etc/iptables.rules

21 пример использования iptables для администраторов.

Знак # означает, что команда выполняется от root. Откройте заранее консоль с рутовыми правами - sudo -i в Debian-based системах или su в остальных.

1. Показать статус.

# iptables -L -n -v
Где:
-L : Показать список правил.
-v : Отображать дополнительную информацию. Эта опция показывает имя интерфейса, опции, TOS маски. Также отображает суффиксы 'K', 'M' or 'G'.
-n : Отображать IP адрес и порт числами (не используя DNS сервера для определения имен. Это ускорит отображение).

2. Отобразить список правил с номерами строк.

# iptables -n -L -v --line-numbers
Вы можете использовать номера строк для того, чтобы добавлять новые правила.

3. Отобразить INPUT или OUTPUT цепочки правил.

# iptables -L INPUT -n -v
# iptables -L OUTPUT -n -v --line-numbers

4. Остановить, запустить, перезапустить файрвол.

Силами самой системы:
# service ufw stop
# service ufw start
Можно также использовать команды iptables для того, чтобы остановить файрвол и удалить все правила:
# iptables -F
# iptables -X
# iptables -t nat -F
# iptables -t nat -X
# iptables -t mangle -F
# iptables -t mangle -X
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT
Где:
-F : Удалить (flush) все правила.
-X : Удалить цепочку.
-t table_name : Выбрать таблицу (nat или mangle) и удалить все правила.
-P : Выбрать действия по умолчанию (такие, как DROP, REJECT, или ACCEPT).

5. Удалить правила файрвола.

Чтобы отобразить номер строки с существующими правилами:
# iptables -L INPUT -n --line-numbers
# iptables -L OUTPUT -n --line-numbers
# iptables -L OUTPUT -n --line-numbers | less
# iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1
Получим список IP адресов. Просто посмотрим на номер слева и удалим соответствующую строку. К примеру для номера 3:
# iptables -D INPUT 3
Или найдем IP адрес источника (202.54.1.1) и удалим из правила:
# iptables -D INPUT -s 202.54.1.1 -j DROP
Где:
-D : Удалить одно или несколько правил из цепочки.

6. Добавить правило в файрвол.

Чтобы добавить одно или несколько правил в цепочку, для начала отобразим список с использованием номеров строк:
# iptables -L INPUT -n --line-numbers
Чтобы вставить правило между 1 и 2 строкой:
# iptables -I INPUT 2 -s 202.54.1.2 -j DROP
Проверим, обновилось ли правило:
# iptables -L INPUT -n --line-numbers
7. Сохраняем правила файрвола.
Через iptables-save:
# iptables-save > /etc/iptables.rules

8. Восстанавливаем правила.

Через iptables-restore
# iptables-restore < /etc/iptables.rules

9. Устанавливаем политики по умолчанию.

Чтобы сбрасывать весь трафик:
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -P FORWARD DROP
# iptables -L -v -n
После вышеперечисленных команд ни один пакет не покинет данный хост.
# ping google.com

10. Блокировать только входящие соединения.

Чтобы сбрасывать все не инициированные вами входящие пакеты, но разрешить исходящий трафик:
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -L -v -n
Пакеты исходящие и те, которые были запомнены в рамках установленных сессий - разрешены.
# ping google.com

11. Сбрасывать адреса изолированных сетей в публичной сети.

# iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Список IP адресов для изолированных сетей:
10.0.0.0/8 -j (A)
172.16.0.0/12 (B)
192.168.0.0/16 (C)
224.0.0.0/4 (MULTICAST D)
240.0.0.0/5 (E)
127.0.0.0/8 (LOOPBACK)

12. Блокировка определенного IP адреса.

Чтобы заблокировать адрес взломщика 1.2.3.4:
# iptables -A INPUT -s 1.2.3.4 -j DROP
# iptables -A INPUT -s 192.168.0.0/24 -j DROP
# iptables -I INPUT -m iprange --src-range 5.143.231.0-5.143.231.255 -j DROP

13. Заблокировать входящие запросы порта.

Чтобы заблокировать все входящие запросы порта 80:
# iptables -A INPUT -p tcp --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP
Чтобы заблокировать запрос порта 80 с адреса 1.2.3.4:
# iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP

14. Заблокировать запросы на исходящий IP адрес.

Чтобы заблокировать определенный домен, узнаем его адрес:
# host -t a facebook.com
Вывод: facebook.com has address 69.171.228.40
Найдем CIDR для 69.171.228.40:
# whois 69.171.228.40 | grep CIDR
Вывод:
CIDR: 69.171.224.0/19
Заблокируем доступ на 69.171.224.0/19:
# iptables -A OUTPUT -p tcp -d 69.171.224.0/19 -j DROP
Также можно использовать домен для блокировки:
# iptables -A OUTPUT -p tcp -d www.fаcebook.com -j DROP
# iptables -A OUTPUT -p tcp -d fаcebook.com -j DROP

15. Записать событие и сбросить.

Чтобы записать в журнал движение пакетов перед сбросом, добавим правило:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Проверим журнал (по умолчанию /var/log/messages):
# tail -f /var/log/messages
# grep -i --color 'IP SPOOF' /var/log/messages

16. Записать событие и сбросить (с ограничением на количество записей).

Чтобы не переполнить раздел раздутым журналом, ограничим количество записей с помощью -m. К примеру, чтобы записывать каждые 5 минут максимум 7 строк:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

16. Сбрасывать или разрешить трафик с определенных MAC адресов.

# iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP
## *разрешить только для TCP port # 8080 с mac адреса 00:0F:EA:91:04:07 * ##
# iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT

17. Разрешить или запретить ICMP Ping запросы.

Чтобы запретить ping:
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
Разрешить для определенных сетей / хостов:
# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT
Разрешить только часть ICMP запросов:
### ** предполагается, что политики по умолчанию для входящих установлены в DROP ** ###
# iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
## ** разрешим отвечать на запрос ** ##
# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

18. Открыть диапазон портов.

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT

19. Открыть диапазон адресов.

## разрешить подключение к порту 80 (Apache) если адрес в диапазоне от 192.168.1.100 до 192.168.1.200 ##
# iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT
## пример для nat ##
# iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25

20. Закрыть или открыть стандартные порты.

Заменить ACCEPT на DROP, чтобы заблокировать порт.
## ssh tcp port 22 ##
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
## cups (printing service) udp/tcp port 631 для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT
## time sync via NTP для локальной сети (udp port 123) ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT
## tcp port 25 (smtp) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT
# dns server ports ##
iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
## http/https www server port ##
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT
## tcp port 110 (pop3) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT
## tcp port 143 (imap) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT
## Samba file server для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT
## proxy server для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT
## mysql server для локальной сети ##
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

21. Ограничить количество параллельных соединений к серверу для одного адреса.

Для ограничений используется connlimit модуль. Чтобы разрешить только 3 ssh соединения на одного клиента:
# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
Установить количество запросов HTTP до 20:
# iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP
Где:
--connlimit-above 3 : Указывает, что правило действует только если количество соединений превышает 3.
--connlimit-mask 24 : Указывает маску сети.

Помощь по iptables.

Для поиска помощи по iptables, воспользуемся man:
$ man iptables
Чтобы посмотреть помощь по определенным командам и целям:
# iptables -j DROP -h

Проверка правила iptables.

Проверяем открытость / закрытость портов:
# netstat -tulpn
Проверяем открытость / закрытость определенного порта:
# netstat -tulpn | grep :80
Проверим, что iptables разрешает соединение с 80 портом:
# iptables -L INPUT -v -n | grep 80
В противном случае откроем его для всех:
# iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
Проверяем с помощью telnet
$ telnet ya.ru 80
Можно использовать nmap для проверки:
$ nmap -sS -p 80 ya.ru

Часто используемые команды и конструкции при разработке на Bitrix

Вывод массива php

Часто есть необходимость посмотреть что содержит переменная или массив. Ниже несколько вариантов как это можно сделать, в том числе незаметно для посетителей сайта.

<div style="display: none;"><? echo json_encode($arResult['ITEMS']);?></div>
<textarea style="display: none;"><? echo var_export($arResult['ITEMS']);?></textarea&gt
<?global $USER; if($USER->isAdmin()){echo ‘<pre>’;print_r($array);echo ‘</pre>}?>
<? echo "<pre>"; print_r ($arResult); echo "</pre>"; ?>
<?echo "<pre style='display: inline;'>"; print_r(get_defined_vars());echo "</pre>";?> //вывод массива всех определенных серверных и пользовательских переменных

Запись массива в файл или лог Apache

Если нет возможности вывести массив на страницу, то можно записать его в файл

$current = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/log.txt');

$current .= "John Smith\n";

$current .= var_export($_SESSION, true);

file_put_contents($file, $current);


или лог Apache


error_log ("blyat` ".var_export($arStatus, true), 0);
error_log ("blyat` ".var_export($arStatus, true), 1, "wer@mail.ru")

Вывод лога в реальном времени.
tail -f /var/log/syslog

Работа с базой

Посмотреть какие запросы идут в базу можно так:
В терминале
mysql -uroot -p
пароль
затем
SHOW PROCESSLIST;

Прямое обращение к базе работает на много быстрее чем через API битрикса.

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/dbconn.php");
$db=new PDO($DBType.':host='.$DBHost.';dbname='.$DBName, $DBLogin, $DBPassword);
$db->query("SET CHARACTER SET utf8");
$res=$db->prepare(" SELECT VALUE FROM `b_iblock_element_property`  WHERE (`IBLOCK_PROPERTY_ID`='3847' and `IBLOCK_ELEMENT_ID` LIKE '%".$item['id']."%')");
 $res->execute();// выборка из базы возвращает код товара поставщика по внутреннему коду товара
 if($row=$res->fetch()){
  if ($row<1){error_log ("пусто", 0);}
  else  echo $row[0];
 }

Интерактивная консоль php

Проверить код можно в интерактивной консоли php. Для этого в терминале нужно запустить команду 
php -a

SSH

Монтируем файловую систему удаленного сервера к своей
sshfs user@domen.ru:/ /media/sshfsdomen.ru -o reconnect

Если злобный админ закрыл куда-нибудь доступ
sudo ssh -D 777 user@domen.ru
получаем socks сервер на localhost:777

Просмотр лога в реальном времени.
ssh myyser@site.ru tail -f /var/log/nginx/error.log

Посмотреть кто зашел
who

Проверка свободного места на диске

Куда делось место на диске покажет команда
df -h
du -| grep "[0-9]M" | sort --r

Работа с архивами

Распаковать бэкап битрикса можно командой<
sudo cat *.* | tar xzv

Поиск куска кода

sudo find -type f -name '*.php' | xargs grep -l "echo '$aritem" --color

Задать права на файлы рекурсивно

sudo chmod -R 777 /bitrix/templates/newtempl

Дамп TCP

tcpdump -vX -i eth0 port 80

Смотрим подключения

netstat -tap | grep nginx


fail2ban iptables

Забаннить
iptables -I INPUT -j DROP -s 58.40.10.2
iptables -I INPUT -m iprange --src-range 5.143.231.0-5.143.231.255 -j DROP


Алиасы .bashrc или в .bash_aliases для быстрого банна
alias ban=’iptables -I INPUT -j DROP -s’
alias unban=’iptables -D INPUT -j DROP -s’


Список забанненых
iptables-saveили
iptables -L -n -v --line-numbers


Удалить ip из банна
iptables -D fail2ban-ssh -j DROP -s 46.20.67.32/32
iptables -D fail2ban-ssh 1

Остановить, запустить файрвол.
service ufw stop
service ufw start


Сохраняем правила файрвола.
iptables-save > /etc/iptables.rules


Восстанавливаем правила.
iptables-restore < /etc/iptables.rules

Bitrix: пример вывода картинки элемента

Вывода изображения на из карточки товара например в шаблоне письма или списке заказов

<?

if (CModule::IncludeModule('iblock')) {

 if ($arProduct = CIBlockElement::GetByID($item["PRODUCT_ID"])->Fetch()) {

  if ($arProduct['PREVIEW_PICTURE'] > 0) {

   $fileID = $arProduct['PREVIEW_PICTURE'];

  } elseif ($arProduct['DETAIL_PICTURE'] > 0) {

   $fileID = $arProduct['DETAIL_PICTURE'];

  } else {

   $fileID = 0;

  }

   $arPicture = CFile::ResizeImageGet($fileID, array('width' => 100, 'height' => 100));

   $arPicture['SIZE'] = getimagesize($_SERVER['DOCUMENT_ROOT'].$arPicture['src']);

 }

}?>


<img src="<?=$arPicture['src']?>" alt="image" />

Bitrix: Проверка наличия товара на складах.


 <?

//////////////// проверка наличия товара на складах ///////////////////////////////

if(CModule::IncludeModule('catalog')){

 $resStore = CCatalogStore::GetList(array(),array("ACTIVE" => "Y", "TITLE" => "Склад ".$_SESSION["city"]),false,false,array());

 $sklad = $resStore->Fetch();

 $arFilter = Array('PRODUCT_ID' =>$arItem["PRODUCT_ID"], 'STORE_ID' => $sklad["ID"]);

 $rsStore = CCatalogStoreProduct::GetList(array(), $arFilter, false, false, array('AMOUNT'));

 if ($arStore = $rsStore->Fetch())

 {

  $RegionStore = $arStore['AMOUNT'];///////////// наличие в региональном складе

 }

 $resStore = CCatalogStore::GetList(array(),array("ACTIVE" => "Y", "TITLE" => "Склад Центральный"),false,false,array());

 $sklad = $resStore->Fetch();

 $arFilter = Array('PRODUCT_ID' =>$arItem["PRODUCT_ID"], 'STORE_ID' => $sklad["ID"]);

 $rsStore = CCatalogStoreProduct::GetList(array(), $arFilter, false, false, array('AMOUNT'));

 if ($arCentrStore = $rsStore->Fetch())

 {

  $CentrStore = $arStore['AMOUNT'];///////////// наличие на центральном складе

 }

}

?>

Docker на ubuntu через прокси

sudo nano /etc/default/docker
раскомментировать  строку http_proxy ...

Установите docker с помощью скрипта:

curl -sSL https://get.docker.com/ | sh

Примечание: Если ваш сервер находится за прокси фильтрацией, вы можете обнаружить, что команде apt-key не удается получить ключ для докер репозитория во время установки. Чтобы обойти эту проблему, добавьте ключ непосредственно с помощью следующих действий: wget -qO- https://get.docker.com/gpg | sudo apt-key add -

Локальный вебсервер без боли с Docker

Локальный вебсервер без боли с Docker:



'via Blog this'



Локальный вебсервер без боли с Docker

Всем доброго времени суток!
Довольно давно я сюда уже не писал, но сегодня решил сделать исключение и написать пост с решением одной проблемы - лично мне уже давно лень тестировать различные CMS на PHP хотя бы потому что приходится делать однотипные действия - добавить хост в Apache, добавить пользователя и базу в MySQL. А потом еще не забыть все это удалить чтобы не замусоривалось.
Сразу оговорюсь что для локальной разработки я в основном использую Vagrant и Docker т.к. не хочу захламлять основную систему установленным LAMP-стеком. Обычно после пары тройки однотипных добавлений новых хостов получалось что виртуальные машины и контейнеры замусоривались никому не нужными БД и конфигами для сайтов которые уже неактуальны. Да и в hosts нет уже желания видеть бесчисленную череду всяких blog.dev,test.dev,site.dev и т.д.
Ну а сегодня я решил сказать «Хватит!».
Выбор решения
Реализовать решил все на Docker т.к. он обладает рядом неоспоримых плюсов:
  1. Это не виртуальная машина -> контейнер жрет меньше ресурсов и стартует мнгновенно
  2. Если не закоммитить изменения вручную то при остановке контейнера все ваши изменения в контейнере никуда не запишутся.
Второй пункт особенно для нас важен так как мы планируем изменять только код веб-приложений, сами настройки серверного ПО пусть будут постоянными.
Статья рассчитана в основном на линуксоидов т.к. для той же Windows придется сперва поднять виртуальную машину с Linux и уже только на ней Docker. Думаю что в таком случае проще поставить какой-нибудь OpenServer и в ус не дуть :P
Для Mac OS X кстати говоря вроде запилили нативный инсталлятор докера.
Тут должна была быть картинка по теме, но таковых нет. Поэтому чтобы хоть как то разбавить скучный текст держите сиськи xD
Ну да ладно, что-то я отвлекся.
Итак, вот краткий рецепт:
  1. Ставим Docker (желательно отсюда из раздела Installation т.к. в репах дистрибутивов обычно старые версии докера)
  2. Скачиваем образ моего контейнера с hub.docker.io:
    sudo docker pull rhamdeew/lamp
  3. Создаем директорию для проекта:
    mkdir ~/dockertest
  4. Запускаем контейнер:
    sudo docker run -v ~/dockertest/:/var/www/srv/ -p 80:80 -t -i rhamdeew/lamp /bin/bash
  5. В контейнере:
    cp -R /var/www/example /var/www/srv
  6. В контейнере:
    cd /var/www/srv
  7. В контейнере:
    ./start.sh
  8. В браузере открываем: http://localhost/1.php
  9. Видим вывод phpinfo =)
Теперь рассказываю что же мы такое сделали
Итак, первым делом мы стянули образ с преднастроенным контейнером, там уже установлены Apache2, PHP и MySQL, а в директории /var/www/example лежит шаблон для добавления проектов.
Далее мы стартуем контейнер.
Если внимательно посмотреть на аргументы запуска контейнера то можно увидеть что для контейнера мы прокинули нашу локальную директорию ~/dockertest в /var/www/srv у контейнера и также прокинули наружу 80 порт.
После старта контейнера (обычно это моментально!) мы получаем доступ к рутовой консоли внутри контейнера. Тут вспоминаем про то что я заботливо положил шаблон для нового проекта в /var/www/example и копируем его в /var/www/srv помня что на хостовой машине это папка ~/dockertest/. После мы переходим в /var/www/srv и запускаем скрипт start.sh.
Сам скрипт ничего магического не делает, просто стартует MySQL с Apache2 и подгружает базу данных из дампа лежащего в db/db.sql с реквизитами указанными в db/db.txt.
Там же кстати лежит скрипт stop.sh который дампит базу обратно в db.sql (ведь в процессе работы мы могли что-то писать в базу). Его нужно запускать после того как вы поработали с контейнером и решили его остановить.
В итоге получается что нам больше не нужно канифолить себе мозги кучей конфигов и иметь на компе минимальный набор - наш контейнер с LAMP и директории с проектами.
Реальный пример
Для примера покажу как теперь можно заценить новую версию Wordpress:
  1. Копируем наш шаблон проекта:
    cp -R ~/dockertest ~/wordpress
  2. Скачиваем архив с wordpress и распаковываем его в ~/wordpress/www
  3. Опционально правим ~/wordpress/db/db.txt где указываем желаемые реквизиты: название БД, имя пользователя и пароль
  4. Стартуем контейнер:
    sudo docker run -v ~/wordpress/:/var/www/srv/ -p 80:80 -t -i rhamdeew/lamp /bin/bash
  5. В контейнере:
    cd /var/www/srv/
  6. В контейнере:
    ./start.sh
  7. В браузере открывем http://localhost/ и приступаем к установке Wordpress, если в п.2 ничего не меняли то во время установки указываем в качестве реквизитов БД везде test
Различные улучшения и вариации
Конечно данное решение неидеальное и обладает некоторым количеством минусов. К примеру после долгой работы над сайтом можно случайно заглушить контейнер и потерять все изменения в БД. Тут в качестве решения можно выгружать БД например по крону. Думаю что можно скрипт stop.sh как то повесить на запуск при остановке контейнера, но пока до этого не дошел. Кстати start.sh также можно воткнуть куда-нибудь в init-скрипты.
Можно пойти дальше и сделать 2-3 контейнера с разными версиями ПО, но схожими настройками - для масштабных тестов вообще ок.
Тут еще должно быть 100500 примеров использования, но если вы вольетесь в данную тему то вероятно придумаете варианты и получше моих =)

Поиск по этому блогу