Archive

Archive for the ‘FreeBSD’ Category

установка OpenVPN на FreeBSD

January 20th, 2009

Установим OpenVPN в самой простой конфигурации, когда есть один статический ключ и мы хотим чтобы пользователь ходил по инету через впн:

cd /usr/ports/security/openvpn && make install
cd /etc
openvpn --genkey --secret static.key

Конфиг положим сюда /etc/openvpn.conf:

dev tun
ifconfig 10.8.0.1 10.8.0.2
secret static.key
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
comp-lzo
user nobody
group nobody
daemon
log /var/log/openvpn.log
status /var/log/openvpn-status.log
verb 4
mute 10

В rc.conf:

openvpn_enable="YES"
openvpn_configfile="/etc/openvpn.conf"
ipnat_enable="YES"
ipnat_rules="/etc/ipnat.rules"
gateway_enable="YES"

В /etc/ipnat.rules:

map bge0 10.8.0.0/16 -> 0/32

где bge0 внешний интерфейс сервера.

Включаем openvpn, роутинг и нат:

/etc/rc.d/ipnat start
/usr/local/etc/rc.d/openvpn start
sysctl net.inet.ip.forwarding=1

Теперь на клиента надо скопировать static.key. Поставить виндовый клиент и сделать такой конфиг-файл:

proto udp
remote ип-сервера
dev tun
ifconfig 10.8.0.2 10.8.0.1
secret static.key
comp-lzo
keepalive 10 60
ping-timer-rem
redirect-gateway

Надо отметить, что эта конфигурация пригодна для эксплуатации одновременно только с одним клиентом.

FreeBSD, vpn , ,

установка tinydns на freebsd

December 25th, 2008

Сразу замечу, что tinydns это днс-сервер для авторитативных запросов. Если надо еще кэширующий днс-резолвер то необходимо настроить dnscache из того же комплекта.
Ставим из портов djbdns, daemontools.
затем:

echo svscan_enable="YES" >> /etc/rc.conf
tinydns-conf bind bind /etc/tinydns 1.2.3.5
mkdir /var/service
ln -s /etc/tinydns /var/service
/usr/local/etc/rc.d/svscan.sh start

создаем файлик /etc/tinydns/root/data с примерно таким содержимым:

#domain.com
.domain.com::ns1.domain.com.:2500
&domain.com::ns2.domain.com.:2500
+ns1.domain.com:192.168.0.1:2500
+ns2.domain.com:192.168.0.1:2500
+domain.com:192.168.0.3:2500
+www.domain.com:192.168.0.3:2500

Находясь в /etc/tinydns/root/ делаем tinydns-data

dns, FreeBSD ,

универсальный конфиг nginx

December 9th, 2008

С данным конфигом не надо будет прописывать в nginx каждый сайт. Условимся что сайты лежат в /home/домен-без-www/html

user  nobody;
worker_processes  4;
worker_rlimit_nofile 8192;

error_log  /var/log/nginx/nginx-error.log crit;

pid        /var/run/nginx.pid;

events {
worker_connections  2048;
# for linux
use epoll;
# for freebsd
# use kqueue;
}

http {
include       mime.types;
default_type  application/octet-stream;

#access_log  /var/log/httpd/nginx-access.log  main;
access_log  off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;

keepalive_timeout  65;
client_max_body_size       20m;

gzip  on;
gzip_disable "MSIE [1-6]";
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain text/css text/xml application/x-javascript;

server {
listen       *:80 default;
server_name ~^(.*)$;

set $p $host;
if ($host ~ www\.(.*)) { set $p $1; }

location / {
proxy_pass         http://127.0.0.1/;
proxy_redirect     off;
proxy_set_header   Host             $p;
proxy_set_header   X-Real-IP        $remote_addr;
proxy_set_header    X-Forwarded-For $remote_addr;
}

location ~* \.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|js|swf)$ {
root /home/$p/html;
expires max;
}
}
}

FreeBSD, nginx

nginx, ограничение по странам

December 9th, 2008

Будем запрещать доступ только если ип проверен по двум базам. т.к. там встречаются ошибки.
Качаем базу maxmind
ее надо сконвертить в формат Nginx скриптом geo2nginx.pl
Вторую базу качаем отсюда в CIDR формате.
в nginx.conf в http

geo $geo {
        default US;
        include geo-best.conf;
    }

    geo $geo2 {
        default US;
        include worldip.conf;
}

внутри Location

if ($geo ~ "^(CN)$"){
                set $i  "a";
            }
            if ($geo2 ~ "^(CN)$"){
                set $i  "a$i";
            }
            if ($i = "aa"){
                access_log /var/log/httpd/bad-country.log;
                return 403;
            }

FreeBSD ,

установка MogileFS

December 9th, 2008

Общая часть:
ставим subversion

cd /usr/ports/devel/p5-subversion && make install

сохраняем текущий транк в /root/mogile:

svn checkout http://code.sixapart.com/svn/mogilefs/trunk

или лучше просто перенести архивом с существующего места

ставим из портов:

/usr/ports/sysutils/p5-mogilefs-server
/usr/ports/sysutils/p5-MogileFS-Utils
/usr/ports/sysutils/p5-MogileFS-Client
/usr/ports/devel/p5-String-CRC32

- обновляем все библиотеки в /usr/local/lib/perl5/site_perl/5.8.8/ и в /usr/local/bin на полученные из svn
- копируем /mogile/trunk/server/lib/mogdeps/Gearman в /usr/local/lib/perl5/site_perl/5.8.8/
- setenv PERL5LIB lib:/usr/local/lib/perl5/5.8.8/BSDPAN:/usr/local/lib/perl5/site_perl/5.8.8/mach:/usr/local/lib/perl5/site_perl/5.8.8:/usr/local/lib/perl5/site_perl:/usr/local/lib/perl5/5.8.8/mach:/usr/local/lib/perl5/5.8.8:/usr/local/lib/perl5/site_perl/5.8.8/MogileFS

- /etc/mogilefs/mogilefs.conf

lib = /usr/local/lib/perl5/site_perl/5.8.8/
trackers=192.168.0.4:6001

- добавляем юезра:

pw groupadd mogile
pw useradd mogile -g mogile -s tcsh -m

копируем скрипты для мониторинга загрузки дисков в /root/scripts в crontab
*/2 * * * * root /root/scripts/disk-busy-stat.sh

установка трекера:
- ставим из портов:

/usr/ports/databases/p5-DBD-mysql51 (или для 5.0)
/usr/ports/databases/p5-DBI
# mysql
mysql> CREATE DATABASE mogilefs;
mysql> GRANT ALL ON mogilefs.* TO 'mogile'@'%';
mysql> SET PASSWORD FOR 'mogile'@'%' = OLD_PASSWORD( '1111111' );
mysql> FLUSH PRIVILEGES;
mysql> quit
mogdbsetup --dbhost=127.0.0.1 --dbname=mogilefs
-  /etc/mogilefs/mogilefsd.conf
db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
db_user = mogile
db_pass = 111111
conf_port 6001

если после запуска процессы могилы жрут много цпу на трекере – рестартануть могилу на стораджах.

# su mogile
$ mogilefsd -c /etc/mogilefs/mogilefsd.conf --daemon
$ exit

установка storage ноды:

- mkdir /var/mogdata
- монтируем туда как “devN” сами диски-стораджи (N должно быть уникальное для всего трекера)
ln -s /usr/home/mogile/dev4/ /var/mogdata/dev4
- создаем в каждом каталог test-write mkdir /home/mogile/dev4/test-write
- ставим на них права 777 chmod -R 777 /usr/home/mogile/dev4/
- /etc/mogilefs/mogstored.conf
mgmtlisten=0.0.0.0:7501
docroot=/var/mogdata
server=none

- ставим апач (сначала) и пхп из портов.

cd /usr/ports/www/apache20 && make install
cd /usr/ports/lang/php5 && make config

- Ставим nginx

cd /usr/ports/www/nginx && make config

- включить mod_dav, mod_flv(он будет как вебдав и отдавать статику)
Если у нас будет антихотлинк на стораджах

cd /usr/ports/security/php5-mcrypt && make install

в rc.conf

apache2_enable="YES"
nginx_enable="YES"
mogstored_enable="YES"
mkdir /var/log/nginx
chmod 777 /var/log/nginx/

- nginx.conf и httpd.conf взять с других стораджей
- mkdir /usr/home/domain.com, скопировать туда скрипты
- автостартап скрипт для стораджа

- проверить содержимое /etc/mogilefs/
- синхронизировать время /usr/sbin/ntpdate pool.ntp.org
- запускаем nginx, апач
- /usr/local/etc/mogstored start
- в ротацию

/var/log/nginx/nginx-access.log         600  7     10000 *  J /var/run/nginx.pid
/var/log/nginx/error_log                600  7     10000 *  J /var/run/nginx.pid
/var/log/httpd-access.log               600  7     10000 *  J /var/run/httpd.pid
/var/log/snmpd.log                      644  7     3000 *     J

Трекер должен быть запущен.
- Добавляем новый хост на трекер (выполняем на трекере): mogadm host add [dns имя нового стораджа] –ip=[ip нового стораджа] –status=alive
например,

mogadm host add storage1.domain.com --ip=1.2.3.1 --status=alive

- Добавляем папки с нового хоста на трекер:
mogadm device add [dns имя нового стораджа] N –status=alive
например,

mogadm device add storage1.domain.com 1 --status=alive

Сделать приоритет в два раза больше чем у других

mogadm device modify storage1.domain.com 1 --status=alive --weight=200

Если надо приостановить отдачу с хоста

mogadm device modify storage1.domain.com 1 --status=down

Если надо его вывести

mogadm device modify storage1.domain.com 1 --status=dead

FreeBSD

настройка ssmtp (FreeBSD)

December 9th, 2008

Установим и автоматически заменим системный почтовик:

cd /usr/ports/mail/ssmtp && make install replace clean

В /usr/local/etc/ssmtp/ssmtp.conf

root=admin@domain.ru
mailhub=mail.domain.ru
hostname=this-host.domain.ru
rewritedomain=domain.ru

Таким образом вся почта отправленная на локального root-а уйдет на admin@domain.ru

FreeBSD, почта , ,

PowerDNS

December 9th, 2008

конфиг для pdns – slave

allow-recursion=127.0.0.1
daemon=yes

launch=gmysql
gmysql-host=127.0.0.1
gmysql-user=pdns
gmysql-dbname=pdns
gmysql-password=password
gmysql-socket=/var/lib/mysql/mysql.sock

local-address=1.2.3.1
slave=yes

* при добавлении нового слэйва поправить строчку allow-axfr на мастере
* в таблице supermaster – заполнить!

create table domains (
 id      INT auto_increment,
 name        VARCHAR(255) NOT NULL,
 master      VARCHAR(128) DEFAULT NULL,
 last_check  INT DEFAULT NULL,
 type        VARCHAR(6) NOT NULL,
 notified_serial INT DEFAULT NULL,
 account         VARCHAR(40) DEFAULT NULL,
 primary key (id)
)type=InnoDB;

CREATE UNIQUE INDEX name_index ON domains(name);

CREATE TABLE records (
  id              INT auto_increment,
  domain_id       INT DEFAULT NULL,
  name            VARCHAR(255) DEFAULT NULL,
  type            VARCHAR(6) DEFAULT NULL,
  content         VARCHAR(255) DEFAULT NULL,
  ttl             INT DEFAULT NULL,
  prio            INT DEFAULT NULL,
  change_date     INT DEFAULT NULL,
  primary key(id)
)type=InnoDB;

CREATE INDEX rec_name_index ON records(name);
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);

create table supermasters (
  ip VARCHAR(25) NOT NULL,
  nameserver VARCHAR(255) NOT NULL,
  account VARCHAR(40) DEFAULT NULL
);

GRANT SELECT ON supermasters TO pdns;
GRANT ALL ON domains TO pdns;
GRANT ALL ON records TO pdns;

FreeBSD ,

sysctl.conf (для i386 & amd64)

December 9th, 2008
security.bsd.see_other_uids=0
security.bsd.see_other_gids=0
net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1
net.link.ether.inet.log_arp_movements=1
net.inet.icmp.drop_redirect=1
net.inet.icmp.bmcastecho=0
net.inet.tcp.icmp_may_rst=0
kern.sync_on_panic=1
kern.coredump=0
net.inet.ip.random_id=1
net.inet.icmp.maskrepl=1
kern.ipc.somaxconn=8096
kern.threads.max_threads_per_proc=8096
kern.maxfiles=204800
net.inet.tcp.sendspace=65535
net.inet.udp.recvspace=65535
net.inet.ip.intr_queue_maxlen=100
net.inet.tcp.rfc1323=1
kern.maxvnodes=150000
net.inet.ip.portrange.randomized=0
net.inet.ip.portrange.first=1024
net.inet.ip.portrange.last=65536
net.inet.tcp.nolocaltimewait=1
kern.ipc.maxsockets=204800
kern.ipc.nmbclusters=32768
# 65536 - если кол-во подключений будет очень большое. потребует 144 мб от памяти ядра

Применить:

/etc/rc.d/sysctl restart

FreeBSD ,

rc.conf

December 9th, 2008
fsck_y_enable="YES"
icmp_drop_redirect="YES"
accounting_enable="YES"
syslogd_flags="-ss"
tcp_drop_synfin="YES"
tcp_restrict_rst="YES"

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"

FreeBSD

установка snmpd

December 9th, 2008

если на фре надо поддержку 64-bit счетчиков то компилим так:

make WITHOUT_PERL_EMBEDDED=yes WITH_MFD_REWRITES=yes -DBATCH -C /usr/ports/net-mgmt/net-snmp install clean

snmpd_enable="YES"
snmpd_conffile="/usr/local/etc/snmp/snmpd.conf"
snmpd_pidfile="/var/run/snmpd.pid"

mkdir /usr/local/etc/snmp
/usr/local/etc/rc.d/snmpd start

FreeBSD , ,

tcsh

December 9th, 2008

поменять шелл:

pw usermod egor -s tcsh

в .cshrc

alias ll        /bin/ls -AlFG
alias ls        /bin/ls -FG
alias df    df -h
alias du    du -hс
   
setenv  EDITOR  ee
setenv  PAGER   less
set prompt = '[%n@%B%m%b] %~%# '
set ignoreeof
set nobeep
set autolist

FreeBSD ,

FreeBSD, мониторинг, производительность

December 9th, 2008

top -mio -o total – показать I/O по процессам
top -S – показать системные процессы в топе (по дефолту они не показываются)
gstat – нагрузка на диски
iostat -d -w1 -c7 – нагрузка на диски
systat -io start 1
diskinfo -t da0 – тест на дисковую производительность
tunefs -p /var/ – информация о настройках файловой системы
vmstat -z чего не хватает
vmstat -i прерывания по устройствам
netstat -i ошибки на интерфейсах
systat -ifstat – интенсивность передачи трафика
netstat -inb – передано через интерфейс в байтах
netstat -w1 – количество пакетов/ошибок/байт на интерфейсе
sysctl kern.ipc.numopensockets – количество открытых сокетов
df -H – количество свободного места
df -i – количество свободных инодов

Для детальной информации по расходу памяти:

fetch -o /usr/local/bin/free http://people.freebsd.org/~rse/dist/freebsd-memory
chmod +x /usr/local/bin/free
free

Смотреть top: mem Inact, если меньше RAM/2 то мало памяти под дисковый кеш.

“помеченные как Inact, Cache и Buf – это всё кэшированные данные разных степеней устаревания”

При большой дисковой нагрузке, особенно с большим количеством мелких файлов смотреть на vfs.ufs.dirhash_maxmem. Можно увеличить до 8-16-32 мегов и более. sysctl -a | egrep “kmem|dirhash|shpg” смотреть чтобы vfs.ufs.dirhash_lowmemcount не росло.

+ неплохой обобщающий топик про тюнинг nginx

Выжимка из доклада Сысоева про тюнинг фряхи

Хороший топик про Тюнинг отдачи мелких картинок через nginx на FreeBSD

FreeBSD ,

чтобы собрать порт с параметрами (например вкомпилить модули в апач)

December 9th, 2008
cd /usr/ports/www/apache20
make configure
cd ./work/программа

сказать configure с нужными опциями
вернуться ../../ и сказать

make
make install

FreeBSD

nginx включение сжатия

December 9th, 2008
gzip on;
gzip_disable "MSIE [1-6]";
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain text/css text/xml application/x-javascript;

FreeBSD

find

December 9th, 2008

Вывести все лог-файлы время последнего доступа к которым больше 25 дней:

find /var/log/ -name "*.log" -atime +25d -print

удалить

find /var/log/ -name "*.log" -atime +25d -delete

найти файлы с определенным содержимым

find /home/domains/ -name "*" -exec grep -H "3C696672616D65207" {} \; | awk -F":" '{print $1}'

Найти и заменить во всех файлах определенного типа один текст на другой:
FreeBSD

#!/bin/sh
for i in `find /usr/home/admin -name "*.html" -exec grep -H "first text" {} \; | awk -F":" '{print $1}' | xargs`; do sed -i '' 's/first text/second text/g' $i; done

Linux

#!/bin/sh
for i in `find /usr/home/admin -name "*.html" -exec grep -H "first text" {} \; | awk -F":" '{print $1}' | xargs`; do sed -i  's/first text/second text/g' $i; done

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

find /folder-where-search -name "oldfile.name" -exec cp /newfile.name {} \;

Обнулить определенные файлы:

#!/bin/sh
for FILE in `find /home/LOGS/ERRORS -name "*apache" -print 2> /dev/null`
do
    echo 1 > $FILE
done

Найти все измененные за день PHP файлы и отправить уведомление:

find /usr/local/www/ -name "*.php" -mtime -1 -print |grep -v cache |mail -s "Modified PHP Files" mail@domain.com >/dev/null 2>&1

Найти и удалить все файлы с размером 0:

find /some/path/ -size 0 -delete

FreeBSD

tcpdump с полной записью трафика

December 9th, 2008
tcpdump -i bge0 -p -A -s 0 dst port 110 and src host 1.2.3.4

FreeBSD

как бить разделы

December 9th, 2008

/ – 1Г
swap – 2*размер оперативы
/tmp – 2Г
/usr/ – 10-20Г
/usr/home – остальное
/var – 5-10Г

На /tmp в fstab рекомендуется поставить параметр noexec

FreeBSD ,

антихотлинк

December 9th, 2008

Апач:

.htaccess или Directory
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER}  !^http://.*mydomain.com/.*$ [NC]
RewriteCond %{HTTP_REFERER}  !^http://.*google.*$ [NC]
RewriteRule .*[Jj][Pp][Gg]$|.*[Gg][Ii][Ff]$ http://google.com [R,L]

nginx:

location ~* ^.+\.(jpg|jpeg|gif|mpg)$ {
    valid_referers none blocked server_names ~\.google\. images.yandex.ru ~\.mydomain.com ~\.mydomain2.com;
    if ($invalid_referer) {
    return 404;
    }
}

Проверить, если в конфиге nginx сделано так:

server_name ~^(.*)$;

то пункт “server_names” надо убрать из valid_referers
Естественно если уже сделана прямая отдача статики, то надо конструкцию valid_referes … писать внутри того Location

Если надо заблокировать трафик с определенных рефереров, то в nginx делаем так:

valid_referers baddomain1.com baddomain2.com www.baddomain1.com www.baddomain2.com;
if ($invalid_referer != 1) {
return 404;
}

FreeBSD , ,

тест скорости download

December 9th, 2008

Гигабайтный файл в Голландии на Лизвебе
http://85.17.128.2/1000mb.bin

FreeBSD

настройка bind

December 9th, 2008
echo "named_enable="YES"" >> /etc/rc.conf

прописать зону (взять образцовую)

/etc/rc.d/named forcestart

Образцовая зона:

$TTL 3600
domain.com.    IN    SOA    ns1.domain.com.    root.domain.com.    (
20010610    ; Serial
10800        ; Refresh
3600        ; Retry
604800        ; Expire
86400    )    ; Minimum TTL

@       IN      NS      ns1.domain.com.
@       IN      NS      ns2.domain.com.
ns1     IN      A       1.2.3.1
ns2     IN      A       1.2.3.1
@       IN      A       1.2.3.1
*       IN      A       1.2.3.1
@       IN      MX 10 mail.domain.com.

Можно использовать такой скрипт для добавления доменов (create_dns.sh):

#!/bin/sh

# first param - domain, Second - IP

# Domains base
BASE="/etc/namedb"

sed -e "s/domain.com/$1/g" "$BASE/master/sample" > "$BASE/master/$1.db.tmp"
sed -e "s/1.2.3.1/$2/g" "$BASE/master/$1.db.tmp" > "$BASE/master/$1.db"
echo "zone \"$1\" { type master; file \"$BASE/master/$1.db\"; };" >> $BASE/named.conf
rm "$BASE/master/$1.db.tmp"

service named reload
# /etc/rc.d/named forcerestart

Для массового добавления доменов:

#!/bin/sh

# Domains base
BASE="/etc/namedb"
IP="3.3.3.3"

cat /home/adwedes/dnslist| while read domain; do

    sed -e "s/domain.com/$domain/g" "$BASE/master/sample" > "$BASE/master/$domain.db.tmp"
    sed -e "s/1.2.3.1/$IP/g" "$BASE/master/$domain.db.tmp" > "$BASE/master/$domain.db"
    echo "zone \"$domain\" { type master; file \"$BASE/master/$domain.db\"; };" >> $BASE/named.conf
    rm "$BASE/master/$domain.db.tmp"

done

/etc/rc.d/named forcerestart

dns, FreeBSD , ,

Стулья для ресторана 1000 моделей: итальянские стулья. .
Зарабатывайте дома, узнайте как: партнерская программа. .
RSS-подписка