Archive

Archive for April, 2011

Table “mysql.servers” doesn’t exist

Често срещана грешка в PLESK е:

Error: Connection to the database server has failed:
Table ‘mysql.servers’ doesn’t exist

Това се получава след като се upgrade-не mysql сървъра.
За да решим проблема трябва с root през конзолата да изпълним следната команда:

[root@server ~]# mysql_fix_privilege_tables --user=admin --password=<root password here> --verbose

Ще видите доста грешки, но всичко ще е наред и можете да продължите да работите с PLESK без проблеми 🙂

This script updates all the mysql privilege tables to be usable by
the current version of MySQL
 
You can safely ignore all 'Duplicate column' and 'Unknown column' errors
because these just mean that your tables are already up to date.
This script is safe to run even if your tables are already up to date!
 
ERROR 1060 (42S21) at line 132: Duplicate column name 'File_priv'
ERROR 1060 (42S21) at line 138: Duplicate column name 'Grant_priv'
ERROR 1060 (42S21) at line 139: Duplicate column name 'Grant_priv'
ERROR 1060 (42S21) at line 140: Duplicate column name 'Grant_priv'
ERROR 1060 (42S21) at line 151: Duplicate column name 'ssl_type'
ERROR 1061 (42000) at line 161: Duplicate key name 'Grantor'
ERROR 1054 (42S22) at line 188: Unknown column 'Type' in 'columns_priv'
ERROR 1060 (42S21) at line 210: Duplicate column name 'type'
ERROR 1060 (42S21) at line 220: Duplicate column name 'Show_db_priv'
ERROR 1060 (42S21) at line 237: Duplicate column name 'max_questions'
ERROR 1060 (42S21) at line 247: Duplicate column name 'Create_tmp_table_priv'
ERROR 1060 (42S21) at line 250: Duplicate column name 'Create_tmp_table_priv'
ERROR 1060 (42S21) at line 375: Duplicate column name 'Create_view_priv'
ERROR 1060 (42S21) at line 378: Duplicate column name 'Create_view_priv'
ERROR 1060 (42S21) at line 381: Duplicate column name 'Create_view_priv'
ERROR 1060 (42S21) at line 387: Duplicate column name 'Show_view_priv'
ERROR 1060 (42S21) at line 390: Duplicate column name 'Show_view_priv'
ERROR 1060 (42S21) at line 393: Duplicate column name 'Show_view_priv'
ERROR 1060 (42S21) at line 410: Duplicate column name 'Create_routine_priv'
ERROR 1060 (42S21) at line 413: Duplicate column name 'Create_routine_priv'
ERROR 1060 (42S21) at line 416: Duplicate column name 'Create_routine_priv'
ERROR 1060 (42S21) at line 422: Duplicate column name 'Alter_routine_priv'
ERROR 1060 (42S21) at line 425: Duplicate column name 'Alter_routine_priv'
ERROR 1060 (42S21) at line 428: Duplicate column name 'Alter_routine_priv'
ERROR 1060 (42S21) at line 431: Duplicate column name 'Execute_priv'
ERROR 1060 (42S21) at line 434: Duplicate column name 'Execute_priv'
ERROR 1060 (42S21) at line 447: Duplicate column name 'max_user_connections'
ERROR 1060 (42S21) at line 456: Duplicate column name 'Create_user_priv'
ERROR 1060 (42S21) at line 478: Duplicate column name 'Routine_type'
ERROR 1054 (42S22) at line 603: Unknown column 'Event_priv' in 'where clause'
ERROR 1060 (42S21) at line 619: Duplicate column name 'sql_mode'
ERROR 1060 (42S21) at line 658: Duplicate column name 'originator'
ERROR 1060 (42S21) at line 662: Duplicate column name 'time_zone'
ERROR 1060 (42S21) at line 665: Duplicate column name 'character_set_client'
ERROR 1060 (42S21) at line 671: Duplicate column name 'collation_connection'
ERROR 1060 (42S21) at line 677: Duplicate column name 'db_collation'
ERROR 1060 (42S21) at line 683: Duplicate column name 'body_utf8'
ERROR 1054 (42S22) at line 693: Unknown column 'Trigger_priv' in 'where clause'
done
Categories: PLESK Tags:

Системен потребител с много непрочетени писма във “вътрешната” поща

Както може би знаете, при изпълнението на всеки cron, output-а се изпраща до системния потребител изпълнил cron-a. Точно за това днес получих алерт от един от сървърите, че има необичайно голям mail файл за един от потребителите на машината.

Лесно решение на проблема. Отиваме в папката с mailboxes и разбира се потвърждаваме големината на файла:

server:~# cd /var/spool/mail
server:/var/spool/mail# ls -lh
total 3.8G
-rw------- 1 mail     mail 3.8G 2011-04-27 09:13 user
-rw------- 1 root     mail 5.2K 2011-04-05 16:45 root

Лесно го затриваме 🙂 В моя случай изпразваме съдържанието на файла:

server:/var/spool/mail# echo > user
Categories: Debian, Linux Tags:

OpenVPN под Windows

April 22nd, 2011 2 comments

VPN (Virtual Private Network) стана доста модерна технология днес. OpenVPN е доста добър софтуер, но защо да не го използваме и под Windows. Ето и целия процес на изграждане на мрежата стъпка по стъпка, но преди това някои основни неща. Има три основни вида настойки, който трябва да се направят: настойки на самия VPN Server, настойки на VPN Client и допълнителни настойки на мрежата. Обикновенно VPN мрежата се състои от един VPN Server и няколко VPN Client-а. Потра който използва OpenVPN по подразбиране е UTP 1194, но винаги може да го промените, ако се налага. Ако се намирате зад рутър, той трябва да се препрати до конкретната машина. Използването на статично IP e задължително, освен ако не използвате Dynamic DNS.

Необходимия софтуер може да свалите от: http://openvpn.se/download.html

Инсталирайте, като приемете създаването на TAP-Win32 виртуални устройства. След инсталацията отворете C:\Program Files\OpenVPN\sample-config и копирайте файла “server” в папката ..\Config\. Отворете файла и конфигурирайте необходимите променливи. Ето и примерна конфигуранция:

## server.ovpn ##
port 1194
proto udp
dev tun
ca ca.crt
cert widget.crt
key widget.key
dh dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push “route 192.168.0.0 255.255.255.0”
push “dhcp-option WINS 192.168.0.1”
push “dhcp-option DNS 192.168.0.1”
push “dhcp-option DOMAIN acme.com.local”
keepalive 10 120
comp-lzo
max-clients 4
persist-key
persist-tun
status openvpn-status.log
verb 3


Генериране на сертификати (CA):

Отворете в cmd:

C:\Program Files\OpenVPN\easy-rsa> init-config
C:\Program Files\OpenVPN\easy-rsa> vars
C:\Program Files\OpenVPN\easy-rsa> clean-all
C:\Program Files\OpenVPN\easy-rsa> build-ca

Като на последния файл попълнете исканите данни. Копирайте генерирания файл в Config папката:

C:\Program Files\OpenVPN\easy-rsa> copy keys\ca.crt ..\config\

Генериране на сървърен ключ и сертификат:
След като сме настроили CA, може да генерираме ключ и сертификат за сървъра.

C:\Program Files\OpenVPN\easy-rsa> vars
C:\Program Files\OpenVPN\easy-rsa> build-key-server widget
C:\Program Files\OpenVPN\easy-rsa> build-dh

Последната процедура може да отнеме време. После копирайте файловете:

C:\Program Files\OpenVPN\easy-rsa> copy keys\widget.crt ..\config\
C:\Program Files\OpenVPN\easy-rsa> copy keys\widget.key ..\config\
C:\Program Files\OpenVPN\easy-rsa> copy keys\dh1024.pem ..\config\

Настройки при клиента:

## acme.ovpn ##
client
proto udp
dev tun
remote 1.2.3.4 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert fred.crt
key fred.key
comp-lzo
verb 3

Тук трябва да промените IP, името на сертификата (fred).

Генерирайте на сървъра сертификати за отделните потребители (fred e пример)

C:\Program Files\OpenVPN\easy-rsa> vars
C:\Program Files\OpenVPN\easy-rsa> build-key fred

C:\Program Files\OpenVPN\easy-rsa> copy keys\fred.crt a:\
C:\Program Files\OpenVPN\easy-rsa> copy keys\fred.key a:\
C:\Program Files\OpenVPN\easy-rsa> copy keys\ca.crt a:\

C:\Program Files\OpenVPN\easy-rsa> copy a:\fred.crt ..\config\
C:\Program Files\OpenVPN\easy-rsa> copy a:\fred.key ..\config\
C:\Program Files\OpenVPN\easy-rsa> copy a:\ca.crt ..\config\

После следва десен бутон Connect и готово.

Categories: LAN, Windows, Защита Tags:

Защита от DoS атака с iptables

Тези команди ще ви помогнат да се защитите от DoS атака. Посредством тях, ще блокирате всяко IP, което за 60 секунди има повече от 20 връзки (connections) към текущата машина:

iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
 
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 20 -j DROP

Резултат от командата:

[root@server ~]# netstat -alpn| grep ":80"| awk '{ print $5 }'| cut -d: -f4| sort| uniq -c | sort -n
      1 *
      3 66.249.72.131
     16 81.100.74.82
     17 82.12.246.158
     19 212.183.140.13
     19 78.148.123.94
     20 85.211.47.252
     20 86.166.141.234
     20 87.97.215.7
     20 89.253.191.173
     20 91.92.170.172
     20 94.156.57.170
     20 94.169.158.18
     22 77.78.11.99

Разбира се това е само пример и можете да смените стоностите за секунди (60) и брои връзки (20).
Имайте впредвид, че максималните стойности за –seconds са 60, а за –hitcount са 20

За да премахнете правило (RULE) от iptables използвайте следните команди.
Лист на всички правила в iptables:

iptables -L INPUT -n --line-numbers
[root@server ~]# iptables -L INPUT -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 state NEW recent: UPDATE seconds: 60 hit_count: 20 name: DEFAULT side: source 
2               tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 state NEW recent: SET name: DEFAULT side: source 
3    fail2ban-SSH  tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22 
4    DROP       all  --  67.195.0.0/24        0.0.0.0/0           
[root@server ~]#

За да изтрием правилото за блокиране на IP-тата в този случай пишем:

iptables -D INPUT 1
Categories: bash, Cent OS, Debian, Linux, Защита Tags:

Брой конекции от 1 IP адрес

Как да разберем колко конекции (connections) имаме към определен порт на нашата машина.
Командата дава списък с IP–та и за всяко едно от тях брои връзките, които то (IP-то) е направило към машината. Текущата команда сканира връзките към порт 80:

netstat -alpn| grep ":80"| awk '{ print $5 }'| cut -d: -f4| sort| uniq -c | sort -n
Categories: bash Tags:

iFrame or not?

How to detect if our website is opened inside an iFrame?

if ( window != window.top ) { alert("I'm in a frame!"); }
Categories: JavaScript Tags:

Cisco lab

April 7th, 2011 2 comments

This is one of my labs when I deal with networking.

Categories: Всичко друго Tags:

MySQL Replication basics или Репликация на MySQL server

Защо да използваме репликация на базата данни?

Има много и различни доводи, поради които хората използват репликацията (MySQL replication). Всеки сам трябва да отговори на този въпрос, като обърне внимание на нуждите на конкретният проект, в който ще се използва тази практика. Няма универсален отговор.
При нас ще го използваме най-вече за да намалим натоварването на нашия master сървър.

Как става всичко това?

За начало ни трябват 2 MySQL сървъра. За опитната постановка и двата сървъра са с версия 5.4.3-beta

master – това е сървъра, който е главен за replication cluster-a и от който всички останали ще взимат данните
slave – това е сървъра, който пази огледално копие на съдържанието на master сървъра – бази данни, таблици, записи

Настройки на master сървъра

За начало трябва да пуснем сървъра да слуша на външното IP на машината като закоментираме следния ред в my.cnf (обикновено се намира в /etc/mysql/my.cnf):

#skip-networking
#bind-address            = 127.0.0.1

Също там (в my.cnf) добавяме информация за самата репликация:

log-bin = /var/log/mysql/mysql-master-bin.log # log, в който ще се записва случващото се с MySQL сървъра (базите данни) на master сървъра
binlog-do-db=exampledb # име на базата данни, която ще репликираме. Ако махнете този ред ще се репликират всички бази
server-id=1 # задължително добавяме ID на сървъра. Изисква се от конфигурацията.

Следващата стъпка е да рестартираме master MySQL сървъра:

/etc/init.d/mysql restart

След рестарта се логваме в MySQL конзолата и даваме права на slave сървъра да чете от нашият нов master сървър:

GRANT REPLICATION SLAVE ON *.* TO 'slaveUser'@'%' IDENTIFIED BY '<password>'; (заменете <password> с парола по ваш избор)
FLUSH PRIVILEGES;

Настройки на slave сървъра

За тези настройки има много информация в Интернет. Голяма част от нея е deprecated, тоест вече е остаряла и не е съвместима с направените промени по текущия MySQL сървър.

Отваряме my.cnf на slave сървъра и правим следните промени:

server-id=2 # задължително го добавяме. Различно от server-id на master сървъра
replicate-do-db=exampledb # коя база данни ще репликираме тук, тоест коя ще взимаме от master и ще записваме тук на slave сървъра
 
# следващите данни са масово разпространени в Интернет, но не са нужни в този файл.
master-host=0.0.0.0
master-user=slaveУser
master-password=secret-password-here

И двата сървъра вече са стартирани или ако не са, трябва да ги стартирате 🙂

Сега имаме работещ master и работещ slave сървър, но това не е всичко. Трябва да кажем на slave сървъра къде се намира нашият master и кои негови бази данни да чете.

За целта се логваме в MySQL конзолата на slave сървъра и изпълняваме следните команди:

mysql> STOP SLAVE;
mysql> CHANGE MASTER TO MASTER_HOST='0.0.0.0', MASTER_USER='slaveUser', MASTER_PASSWORD='<password>', MASTER_LOG_FILE='mysql-master-bin.000003', MASTER_LOG_POS=0, MASTER_PORT=3306;
MASTER_HOST='0.0.0.0' # IP на master сървъра
MASTER_USER='slaveUser' # потребителското име за slave сървъра, което избрахме по-горе
MASTER_PASSWORD='<password>' # паролата, която избрахме по-горе
MASTER_LOG_FILE='mysql-master-bin.000003' # това се взима от следващата описана команда
MASTER_LOG_POS=0 # тук е добре да оставим 0 и съответно на slave машината да нямаме създадена базата данни, която искаме да репликираме
MASTER_PORT=3306 # порт, на който слуша master сървъра

За да намерим MASTER_LOG_FILE изпълняваме следната команда на master сървъра

mysql> show master status;
+-------------------------+-----------+--------------+------------------+
| File                    | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------------+-----------+--------------+------------------+
| mysql-master-bin.000006 | 272737959 |              |                  |
+-------------------------+-----------+--------------+------------------+
1 row in set (0.00 sec)
 
mysql>

Съответно нашият MASTER_LOG_FILE се казва mysql-master-bin.000006

След като сме определили файла и сме изпълнили заявката за потребител, парола и порт на slave сървъра, пак на него изпълняваме командата за стартиране на slave:

mysql> START SLAVE;

От тук нататък би трябвало да имате изцяло работещи и реплекиращи master и slave сървъри.

За пълна информация можете да погледнете документацията на MySQL за MySQL replication

Categories: MySQL Tags: