Шукати в цьому блозі

четвер, 25 червня 2009 р.

Как быстро поменять тип таблиц в базе MySQL

Собственно я так и не обнаружил как сказать MySQL чтобы он по умолчанию создавал таблицы типа InnoDB. Поэтому не мудрствуя лукаво быстренько "на коленке" накатал следующий скрипт:
MYSQL='mysql -uusername -ppassword database'
echo "show tables" | \
$MYSQL | \
awk 'BEGIN { n=1}
n==0 { printf("ALTER TABLE %s ENGINE=InnoDB;\n", $1) }
n==1 { n=0 }' | \
$MYSQL
Дёшево и сердито! ;)
Ну и конечно-же всё это можно уместить в одну строчку и даже можно попытаться алиас создать.
alias mysqlmoddb='echo "show tables" | $MYSQL | awk '\''BEGIN { n=1} n==0 { printf("ALTER TABLE %s ENGINE=InnoDB;\n", $1) } n==1 { n=0 }'\'' | $MYSQL'
Тогда достаточно будет лишь менять значение переменной MYSQL, примерно так:
$ MYSQL='mysql -uroot mysql'
$ mysqlmoddb

пʼятницю, 19 червня 2009 р.

nginx - настройка фронтенда к ~username - public_html

Конечно понимаю, что это может быть и не нужно никому, коль не нашел должного решения на просторах Интернета. Однако раньше, когда компьютеры были большими, а мы маленькими, были популярны так называемые домашние странички. У гордого индейца даже модуль под это дело есть - userdir.
Недавно решил индейца загнать в бекенд, а фронтендом настроить nginx. Так вот готового решения для организации фронтенда для nginx'а не обнаружил. Недолго думая, почесал подбородок и накатал следующую конфигурацию к nginx'у. Представьте испытанное мною счастье когда это заработало.
Итак, задача заставить в фронтенде отдавать содержимое из хомдира пользователя - /home/user/public_html. Запрос к которому в браузере выглядит как http://site.name/~user:

location ~ ^/~([^/]*)/(.*\.(bmp|jpg|jpeg|gif|ico|png|css|doc|txt|js|zip|iso|tgz|gz|rar|bz2|7z|xls|exe|pdf|ppt|tar|wav|avi|rtf|mp3|mp4|mov|mpeg|mpg)) {
    access_log          /var/log/nginx/access-frontend.homedir.site.name.log;
    alias               /home/$1/public_html/$2;
    expires             5d;
    limit_rate          50k;
}

location ~ ^/~([^/]*)/(.*) {
    access_log          /var/log/nginx/access-backend.homedir.site.name.log;
    proxy_set_header    Host  $host;
    proxy_set_header    X-Real-IP       $remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass          http://127.0.0.1:60080;
    proxy_redirect      off;
}

location ~* ^.+\.(bmp|jpg|jpeg|gif|ico|png|css|doc|txt|js|zip|iso|tgz|gz|rar|bz2|7z|xls|exe|pdf|ppt|tar|wav|avi|rtf|mp3|mp4|mov|mpeg|mpg)$ {
    access_log          /var/log/nginx/access-frontend.site.name.log;
    expires             5d;
    limit_rate          50k;
    if ($http_user_agent ~ FDM|Download) {
        limit_rate      50k;
    }
}

location = / { rewrite . /index.php last; }

location / {
    access_log          /var/log/nginx/access-backend.site.name.log;
    proxy_set_header    Host  $host;
    proxy_set_header    X-Real-IP       $remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass          http://127.0.0.1:60080;
    proxy_redirect      off;
}


Собственно на этом всё :) Расширения для файлов обрабатываемых в фронтенде
можете придумать и добавить самостоятельно в регулярное выражение.
Естественно, что остальную конфигурацию придумываете самостоятельно - это лишь шаблон на заметку :)

... путешествие продолжается :)

(comp.dcom.sys.cisco) Cisco в качестве PPTP-клиента

service internal
!
no ip gratuitous-arps ! recommended
!
ip multicast-routing
!
vpdn enable
!
vpdn-group 1
request-dialin
protocol pptp
rotary-group 0
initiate-to ip 1.1.1.1 ! target PPTP server address
interface Dialer0
mtu 1450 ! allows for mppe and one PPPoE layer just in case
!== типа фиксированно запрашиваемый ip ==
!ip address 2.2.2.2 255.255.255.252
!== получать ip от pptp-сервера ==
!ip address negotiated
ip pim dense-mode
encapsulation ppp
dialer in-band
dialer idle-timeout 0
dialer string 123 ! required, but value seems to be ignored
dialer vpdn
dialer-group 1
no cdp enable
ppp pfc local request
ppp pfc remote apply
ppp encrypt mppe auto
ppp chap hostname vpnuser
ppp chap password 0 vpnpassword
!
dialer-list 1 protocol ip permit

Ссылки по теме:
  1. groups.google.com/comp.dcom.sys.cisco
  2. www.supporting.ru

вівторок, 16 червня 2009 р.

Установка Nginx + PHP5 (С FastCGI и XCache) + MySQL

Как только вы начинаете чувствовать нагрузку на свой купленный за 5 долларов в месяц сервер, то читая статьи на тему «Когда стоит переходить на VPS», подумывайте о покупке чего-нибудь более серьёзного. И как только это «более серьёзное» находится в вашем распоряжении, перед вами открывается целая вселенная, когда всё зависит только от вас и вариантов развития событий миллионы. Вы – администратор виртуального (или физического) сервера.
Эта статья предназначена в первую очередь начинающим админам, желающим без многочасового поиска по Сети сделать всё быстро и правильно. Поэтому не будем откладывать и начнём.

Для начала несколько допущений, чтобы потом не возникло вопросов.
  • Apache хороший сервер, особенно если вы ставите его только на обработку скриптов и не загружаете отдачей статики. При правильной настройке с ним можно творить чудеса. Но я принципиально отказался от его использования, так как настроить один сервер проще и быстрее чем два, а в случае с Apache нам понадобится ещё один.
  • Я использую Nginx как полноценную замену Apache. Он лёгкий, настраиваемый, мощный. Хорошо работает с Drupal. Но это абсолютно не значит, что вы не можете использовать Lighttpd. Просто поищите тогда другую статью :)
  • Операционная система, на которой производилась инсталляция - Ubuntu Hardy LTS (поддержка до 2013 года). Если вы используете другую – вам не нужно искать другую статью, просто у вас будет немного отличаться синтаксис запуска программ. Например, вместо aptitude будете использовать apt-get, yum, и т.д. Читайте документацию к вашей системе. Однако по большей части на любых Linux системах мой мануал сработает. Любители ./configure, make, make install , порадуются только один раз.
  • Виртуальный сервер куплен у компании Slicehost. Бесподобная поддержка, куча образовательных материалов на все случаи жизни, и очень демократичные цены (20$ за VPS c 256MB оперативы), плюс – идеология Слайсхоста заставит вас забыть о том, что такое Cpanel, Plesk и прочие костыли для управления хостингом. Вы будете делать всё сами, ни от кого не зависеть, тотальная свобода для творчества и работы! В общем, сначала попробуйте, а потом вы останетесь у них навсегда ;) Кстати, зарегистрировавшись по моей реферальной ссылке, вы получите круглосуточную поддержку ещё и от меня.
Итак, помним, что в итоге мы должны получить HTTP сервер Nginx + PHP5 (С Fast-cgi и XCache) + MySQL на Ubuntu Hardy LTS.

Первоначальная настройка сервера

Нет, ребята, так дело не пойдёт, настолько я распыляться не буду. Идём сюда и делаем как написано. Настроить сервер – значит установить файрвол, создать юзеров для доступа по SSH, отключить учётную запись root, раскрасить bash, проапдейтить пакеты до последних версий. Просто следуйте простым инструкциям здесь и здесь. Всё очень доступно.

Установка PHP, MySQL и необходимых пакетов

  • Устанавливаем необходимые пакеты (Build Essentials)
sudo aptitude install build-essential
  • Устанавливаем PHP c клиентом. И без Apache!
sudo aptitude install php5-common php5-dev php5-mysql php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-cgi php5-mcrypt php5-curl php5-gd php5-mhash php5-pspell php5-snmp php5-sqlite libmagick9-dev php5-cl
Возможно, я несколько перебрал с пакетами, но некоторые из них вам могут понадобиться в дальнейшем, они не занимают много места, поэтому абсолютно не помешают.
  • Устанавливаем MySQL сервер
    sudo aptitude install mysql-server mysql-client libmysqlclient15-dev
  • Защищаем его от недоброжелателей
mysql_secure_installation
Конечно, MySQL – вещь сложная в настройке, и какой бы ни был у вас сервер, вам придётся потратить много времени на её оптимизации. Рекомендую после того, как разберётесь с сервером, начать тюнинг MySQL c помощью этого скрипта.

Установка и настройка сервера Nginx

Существуют миллионы инструкций как компилировать программы из исходников, но мне не хочется этим заморачиваться. К тому же Ubuntu позволяет проделывать такие вещи.
sudo aptitude install nginx
Всё, а вы ещё что-то ожидали? Эта строка установит сам сервер и основные зависимости. После этого вам остаётся только запустить его и проверить, всё ли работает.
sudo /etc/init.d/nginx start
Затем наберите в браузере IP (или URL) вашего сервера и насладитесь простым, но очень значимым для нас приветственным экраном Nginx.
nginx_welcome_screen
На этом этапе рекомендуется откинуться на спинку кресла, отдохнуть минут 10, или выпить чаю-кофе. Ваш сервер уже официально в Интернете. В принципе, вы уже можете разместить на нём сайт (только не на PHP, хотя мы его вроде и ставили). Для удовольствия – попробуйте залить туда пару страничек HTML.
Действительно, куда залить?
По умолчанию после установки сервера вышеописанным способам дефолтный хост ведёт в папку на сервере /var/www/nginx-default. Мы это сможем легко поменять уже через несколько минут.
Помните, что контролируется Nginx тремя командами:
sudo /etc/init.d/nginx start

sudo /etc/init.d/nginx stop

sudo /etc/init.d/nginx restart
Однако последнюю (рестарт) использовать не рекомендую, это не Apache. Получите больше головной боли. Поэтому для перезапуска сервера сначала останавливаем его, а потом запускаем. Если не запускается – значит отлаживаем конфигурацию – обычно он довольно понятно говорит, где ошибка.
Также важной частью является первоначальная настройка сервера, откройте файл /etc/nginx/nginx.conf и вставьте в него всё, что находится здесь:

user www-data www-data;
worker_processes 2;

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

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

access_log /var/log/nginx/access.log;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 3;
tcp_nodelay off;

gzip on;
gzip_comp_level 2;
gzip_proxied any;
gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml
application/xml+rss text/javascript;

include /etc/nginx/sites-enabled/*;

}

Таким образом мы сразу настроили сжатие сервером данных, выключили некоторые функции и включили некоторые важные. Потом вы сможете настроить его под свои нужды более точно, но пока нам нужна лишь работающая конфигурация.
А сейчас создадим грамотный лэйаут для наших будущих сайтов. В принципе – абсолютно не важно, где будет лежать ваш сайт, но более-менее стандартным является размещение сайтов в каталоге /home/user/public_html, где user – это пользователь системы с необходимыми правами. (как создать юзера и назначить права почитайте по ссылкам в начале мануала, если вы этого ещё не сделали)
Если же юзер только один (а зачастую это только вы), то можно сделать просто
sudo mkdir /home/public_html


sudo mkdir -p /home/public_html/mydomain.com/{public,private,log,backup}

Таким образом мы создали структуру папок для нашего будущего сайта mydomain.com. Файлы, доступные из Сети будут лежать в папке /public, логи в папке /log, остальное понятно.
Создаём виртуальный хост – файл, который будет указывать домену, где лежит наш сайт.
sudo nano /etc/nginx/sites-available/mydomain.com
Затем вставляем в него следующий текст конфига, естественно, заменяя структуру папок и название домена на ваши.
Внимание! Этот конфиг учитывает некоторые особенности Drupal, например, файловую структуру, крон, а также наличие модулей Imagecache, Fckeditor, Backup and Migrate. Если вы используете другие системы, просто удалите или закомментируйте ненужные части конфига, они подписаны. Если же вы ищете в сети решение проблем работы Drupal c Imagecache или Fckeditor, то вы его уже нашли :)

server {
listen 80;
server_name mydomain.com www.mydomain.com;
access_log /home/public_html/mydomain.com/log/access.log;
error_log /home/public_html/mydomain.com/log/error.log;

root /home/public_html/mydomain.com/public;

charset utf-8;

location = / { rewrite . /index.php last; }
location / { rewrite ^(.*)$ /index.php?q=$1 last; }
location = /index.php {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /home/public_html/mydomain.com/public$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
# To retrieve this script periodically use: curl -sH "Host: my.host.tld" http://localhost/cron.php
location = /cron.php {
allow 127.0.0.1;
deny all;
fastcgi_pass 127.0.0.1:8521;
include /etc/nginx/fastcgi_params;
}
# Static content
location = /robots.txt { if (-f $document_root/sites/default/robots.txt) { rewrite . /sites/default/robots.txt$
location ~ ^(/sites/all)?/(modules|themes)/.*.(css|js|png|gif|jpg)$ { break; }
location /misc/ { break; }
location /sites/all/modules/fckeditor { break; }
location /files/ { break; } # Depending on Drupal configuration (Administer -> File system)

# Imagecache (http://drupal.org/project/imagecache)
location /files/imagecache/ {
if (-f $request_filename) { break; }
rewrite ^(.*)$ /index.php?q=$1 last;
}

# **** Comment out this location after installing/updating Drupal ****
# location ~ ^/(install|update).php$ {
# allow 172.22.11.2;
# deny all;
# fastcgi_pass 127.0.0.1:8521;
# include /etc/nginx/fastcgi_params;
# }
# ********************************************************************

# hide protected files
location ~* .(engine|inc|info|install|module|profile|po|sh|.*sql|theme|tpl(.php)?|xtmpl)$|^(code-style.pl|Entri$
deny all;
}

# hide backup_migrate files
location ~* ^/files/backup_migrate {
deny all;
}

}

И активизируем сайт:
sudo ln -s /etc/nginx/sites-available/mydomain.com /etc/nginx/sites-enabled/mydomain.com
А сейчас внимание! В конфиг включены правила для создания чистых ссылок (clean urls) для системы Drupal, если вы используете Wordpress или другие системы, вам необходимо поискать на сайтах поддержки правила создания чистых ссылок для nginx. Это займёт лишних 5 минут, особенно если ваша система популярная. Впрочем, она может работать и с моим конфигом :)
Помните, файл .htaccess под Nginx не работает! Все директивы вставляются в конфигурацию сервера или виртуального хоста!
Таким образом, спорная часть это
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?q=$1 last;
}
Остальные части конфига необходимы!
В конфиге мы попросили Nginx слушать FastCGI на 9000 порту, поэтому – если у вас стоит файрвол, не забудьте открыть этому порту доступ (как и порту 3306 для MySQL)

Запуск PHP как FastCGI процесса

Я не профессиональный администратор, поэтому ищите в Гугле подробные объяснения тому, что мы сейчас будем делать.
Дело в том, что нам необходимо заставить наш сервер работать с PHP, чего он по умолчанию делать вовсе не обязан (в настоящее время в Nginx анонсирована только тестовая поддержка Perl). Поэтому для взаимодействия сервера с языком программирования мы используем специальный протокол, или интерфейс – FastCGI. Это своеобразный мостик для обеспечения взаимопонимания между Nginx и PHP. И сейчас мы будем “учить” их работать вместе.
Мы уже устанавливали php5-cgi, если вы помните, теперь нам нужно каким-то образом запускать FastCGI процесс. Есть несколько способов сделать это. Мы будем использовать специальную программку spawn-fcgi, которая до недавнего времени шла в комплекте с другим сервером – Lighttpd. Сейчас она идёт как отдельный проект и расположена по адресу http://redmine.lighttpd.net/projects/spawn-fcgi
Мы же используем старый проверенный вариант “выдирания” её из Lighttpd. Это даст мне уверенность в том, что это точно будет работать у вас. Чуть позже я изменю эту часть статьи, но только когда сам всё сделаю на практике.
Итак
mkdir ~/sources

cd ~/sources


wget http://www.lighttpd.net/download/lighttpd-1.4.19.tar.bz2

tar jxvf lighttpd-1.4.19.tar.bz2
Не знаю, необходимы или нет эти зависимости, но установочный скрипт ругается, поэтому давайте лучше их установим:
sudo aptitude install libpcre3-dev libbz2-dev
Далее – скомпилируем Lighttpd, но не будем его устанавливать, нам нужна только одна программка. Поэтому делаем следующее:
cd lighttpd-1.4.19

./configure

make
Потом идём пить кофе, потому что на экране будет много всего, производящего впечатление на девушек :) Безобразие на экране будет длиться минуты 3-4.
Затем берём исходники spawn-fcgi, и кладём их в то место, где им и полагается быть:
sudo cp src/spawn-fcgi /usr/bin/spawn-fcgi
Далее, если это программа, то нам нужен скрипт, чтобы запускать её:
sudo nano /usr/bin/php-fastcgi
Затем копируем в скрипт следующие строки:

#!/bin/sh
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi
А теперь внимание! В Интернете, насколько мне известно, вы можете найти другие варианты синтаксиса этой строки, где www-data присутствует только один раз. Настоятельно рекомендую вам воспользоваться именно моим вариантом, так как это позволит вам в будущем избежать неприятностей и ошибки PHP – No input file specified. Отличие моего варианта от распространённого в том, что мы указываем не только пользователя, но и группу. Если они у вас отличаются, то просто замените на ваши данные. Самое интересное, что на одном сервере у меня сработало только с юзером, а на другом – нет. Поэтому будьте внимательны!
Строка, которую мы ввели, означает, что каждый раз, когда скрипт будет вызываться, процесс fcgi будет запущен на порту 9000 для пользователя www-data в группе www-data (это дефолтные пользователь и группа, устанавливаемые при первоначальной настройке системы).
Нам осталось только разобраться, как запускать этот скрипт при запуске FastCGI.
sudo nano /etc/init.d/init-fastcgi
Получаем пустой экран, и вставляем в него:

#!/bin/bash
PHP_SCRIPT=/usr/bin/php-fastcgi
RETVAL=0
case "$1" in
start)
$PHP_SCRIPT
RETVAL=$?
;;
stop)
killall -9 php5-cgi
RETVAL=$?
;;
restart)
killall -9 php5-cgi
$PHP_SCRIPT
RETVAL=$?
;;
*)
echo "Usage: php-fastcgi {start|stop|restart}"
exit 1
;;
esac
exit $RETVAL
Опять же внимание! В Сети вы найдёте слегка изменённый вариант скрипта управления запуском FastCGI, где будет killall -9 php, вместо killall -9 php5-cgi. В моём случае работал только последний вариант, то есть в скрипт надо вставлять точное название процесса, который мы запускаем. Честно говоря, я вообще удивляюсь, как у людей работает без этого. Но мы же делаем всё правильно, не так ли!
Дальше – у нас ничего не будет работать, пока мы не сделаем два предущие скрипта исполняемыми. Для этого вводим следующее:
sudo chmod 755 /usr/bin/php-fastcgi

sudo chmod 755 /etc/init.d/init-fastcgi
Ну что ж, сейчас можно смело запускать наш FastCGI:
sudo /etc/init.d/init-fastcgi start
Вы должны получить что-то вроде информации о том, что spawn-fcgi успешно запустился как процесс.
А для того, чтобы всё работало после перезагрузки набираем:
sudo update-rc.d init-fastcgi defaults
И, я надеюсь, вы не забыли запустить Nginx :) С этого момента вам придётся постоянно помнить, что сейчас вам нужно запускать и сервер и FastCGI.
В принципе, это всё!

Тестирование, отладка. Установка XCache.

Так, давайте проверим, работает ли PHP как fast-cgi процесс:
ps ax | grep php
Если появился список запущенных процессов, значит всё ОК.
А чтобы проверить, подключён ли PHP к Nginx, создайте файл info.php в веб-директории вашего домена mydomain.com, вставьте туда:
< ? echo phpinfo(); ?>
А затем запустите его из браузера. Получите исчерпывающую информацию о том, как работает ваш PHP, какие модули загружены.
А сейчас давайте ускорим исполнение PHP скриптов путём кэширования бинарного кода. Вы можете установить любой акселератор, но я выбираю XCache.
Установка XCache:
sudo aptitude php5-xcache
Особенностью этого акселератора является то, что его надо вручную подключать к php.ini, и там же конфигурировать под свои нужды.
Открываем:
sudo nano /etc/php5/cgi/php.ini
Проматываем этот длиннющий файл до самого конца, попутно настраивая его под себя. Например, вы можете изменить значение memory_limit на большее (хотя бы до 64MB, особенно если работаете с Drupal). Для прокрутки используете Ctrl+V.
В конце файла вставляем:

[xcache-common]
extension = xcache.so
[xcache.admin]
xcache.admin.user = "mOo"
; xcache.admin.pass = md5($your_password)
xcache.admin.pass = ""
[xcache]
; ini only settings, all the values here is default unless explained
; select low level shm/allocator scheme implemenation
xcache.shm_scheme = "mmap"
; to disable: xcache.size=0
; to enable : xcache.size=64M etc (any size > 0) and your system mmap allows
xcache.size = 64M
; set to cpu count (cat /proc/cpuinfo |grep -c processor)
xcache.count = 4
; just a hash hints, you can always store count(items) > slots
xcache.slots = 8K
; ttl of the cache item, 0=forever
xcache.ttl = 0
; interval of gc scanning expired items, 0=no scan, other values is in seconds
xcache.gc_interval = 0
; same as aboves but for variable cache
xcache.var_size = 64M
xcache.var_count = 1
xcache.var_slots = 8K
; default ttl
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 300
xcache.test = Off
; N/A for /dev/zero
xcache.readonly_protection = Off
; for *nix, xcache.mmap_path is a file path, not directory.
; Use something like "/tmp/xcache" if you want to turn on ReadonlyProtection
; 2 group of php won't share the same /tmp/xcache
; for win32, xcache.mmap_path=anonymous map name, not file path
xcache.mmap_path = "/dev/zero"
; leave it blank(disabled) or "/tmp/phpcore/"
; make sure it's writable by php (without checking open_basedir)
xcache.coredump_directory = ""
; per request settings
xcache.cacher = On
xcache.stat = On
xcache.optimizer = On
[xcache.coverager]
; per request settings
; enable coverage data collecting for xcache.coveragedump_directory and xcache_coverager_start/stop/get/clean() functions (will hurt executing performance)
xcache.coverager = Off
; ini only settings
; make sure it's readable (care open_basedir) by coverage viewer script
; requires xcache.coverager=On
xcache.coveragedump_directory = ""

Обратите внимание на строку, где надо указать количество ядер в вашем процессоре. У меня их 4. Там же написано как это узнать, если не уверены.
Также здесь вы можете установить логин и пароль для управления скриптом. Если с логином всё понятно, то пароль должен быть зашифрован с помощью md5. Чтобы правильно установить пароль, создайте в веб-директории файл test.php, и поместите в него следующую строку:
< ?php echo md5("вашпароль"); ?>
Запустив его, вы получите ваш пароль в зашифрованном виде, его то и надо вставлять в php.ini. Не вставляйте в php.ini “человеческий пароль”!
Чтобы получить доступ к веб-интерфейсу XCache, нам придётся скачать исходники отсюда и достать из них папку xcache/admin/ (всю папку), затем загрузить её в веб-директорию, и зайти в неё со своим логином и паролем, установленным в php.ini.
Затем можете наслаждаться тем, как будет летать ваш сервер после установки акселератора.

четвер, 11 червня 2009 р.

Курсор в mcedit не виден в gnome-terminal. Как "вылечить"?

Собственно, как "вылечить" чтобы курсор отображался при включённой опции отображения табуляции и пробелов (отображается как "<------>" и "....") я не нашёл, но вот как отключить это отображение - рецепт смотрим ниже:

Код
$ export S="editor_visible_tabs="; if grep -q ${S}1 .mc/ini; then  sed -i s/${S}1/${S}0/ .mc/ini;  A=off; else sed -i s/${S}0/${S}1/ .mc/ini; A=on; fi; echo visible tabs $A
$ export S="editor_visible_spaces="; if grep -q ${S}1 .mc/ini; then  sed -i s/${S}1/${S}0/ .mc/ini;  A=off; else sed -i s/${S}0/${S}1/ .mc/ini; A=on; fi; echo visible tabs $A
или просто установите в файле .mc/ini значения для editor_visible_tabs и editor_visible_spaces в "0".

SSH-туннели

Продолжим тему туннелей. Не всегда есть возможность, да и не всегда надо, строить полноценный туннель с интерфейсной парой адресов. Иногда нам нужно лишь "прокинуть" вполне определённые порты.

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

Итак. По-порядку.

Строим туннель из сети в мир.

$ ssh -f -N -R 2222:10.11.12.13:22 username@99.88.77.66
теперь введя на хосте 99.88.77.66:
$ ssh -p2222 localhost
мы попадём на хост 10.11.12.13.

Таким-же образом можно получить доступ к любому другому ресурсу, например:

$ ssh -f -N -R 2080:10.11.12.14:80 username@99.88.77.66

Введя на хосте 99.88.77.66:

$ w3m -dump http://localhost:2080
получим дамп web-ресурса на 10.11.12.14.

Строим туннель из мира в сеть.

$ ssh -f -N -L 4080:192.168.0.10:80 nameuser@88.77.66.55

Аналогично, вводим на своём хосте:

$ w3m -dump http://localhost:4080
и получаем доступ к web-ресурсу узла 192.168.0.10, который находится за хостом 88.77.66.55.

Поддерживаем туннели в поднятом состоянии
Ни для кого не секрет, что связь иногда обрывается, туннели при этом будут отваливаться по таймауту.
Чтобы не утруждать себя дополнительным монотонным вбиванием команды на поднятие туннеля и мониторингом этого процесса, автоматизируем его. Смело вводим:

$ crontab -e
и создаём расписание примерно следующего вида:
TUNCMD1='ssh -f -N -R 2222:10.11.12.13:22 username@99.88.77.66'
TUNCMD2='ssh -f -N -R 2080:10.11.12.14:80 username@99.88.77.66'

*/5 * * * * pgrep -f "$TUNCMD1" &>/dev/null || $TUNCMD1
*/5 * * * * pgrep -f "$TUNCMD2" &>/dev/null || $TUNCMD2

Сохраняемся. Проверяем по

$ crontab -l
что расписание принято.

Это лишь ещё один момент особой админской магии... Надеюсь, что лишних вопросов не должно водникнуть. С дополнительными опциями ssh можно ознакомиться в

$ man 1 ssh

Собственно на этом всё smile.gif

Замечания от sash-kan'а
По практическому опыту — cron-задания на перезапуск абсолютно недостаточно.
Разве что соединение абсолютно стабильно. В реальной жизни встречается в 0% случаев.
Даже соединённые напрямую кабелем две сетевые карты легко могут потерять n-ное количество пакетов и tcp-соединение «упадёт».
Клиент и сервер будут пребывать в святой уверенности, что всё в порядке, просто вторая сторона ничего не передаёт.
Нужен keepalive.
Примерно так:

CODE
TCPKeepAlive yes
ServerAliveInterval 300
ServerAliveCountMax 3
Интервал и счётчик — по вкусу.
Добавлять их надо либо в /etc/ssh_config, либо в ~/.ssh/config, либо прямо в команде через опцию -o.
В принципе, судя по man ssh_config, первую из опций можно и опустить. но, на всякий случай, пусть будет.

Организация SSH Layer 3 туннеля

Достаточно свободная интерпретация статьи "Setting up a Layer 3 tunneling VPN with using OpenSSH".

В данном разделе постараемся описать как использовать возможности появившиеся в OpenSSH v4.3 для создания туннелей, применительно к OS Debian GNU/Linux (наверняка без особых проблем заработает и в Ubuntu).

SSH v4.3 включает layer-2 и layer-3 туннелирование для простой организации VPN, используя механизм аутентификации SSH.

Примерно так выглядит схема, которую мы построим:

----------        /\_/-\/\/-\       -----------------
| Клиент |~~~~~~~/ Интернет /~~~~~~~|    Сервер     |
----------       \_/-\/\_/\/      / -----------------
||\                           \          ||\
|| {tun0}                      {vlan8}   || {tun1}
||                                       ||
\-================= tunnel ==============-/
  • vlan8 - 212.90.160.1/27
  • tun0 - 10.254.254.2/30
  • tun1 - 10.254.254.1/30
Подготовительные работы на клиентской стороне.

В нашей схеме будем использовать аутентификацию по ключу, для этого сначала сгенерируем сам ключ (тип ключа rsa, размер 4Кбита) и скопируем его в учётную запись root'а на сервере (на сервере, при этом, придётся на время открыть возможность логиниться root'ом - PermitRootLogin yes):

# sudo ssh-keygen -t rsa -b 4096
# ssh-copy-id -i .ssh/id_rsa.pub root@212.90.160.1
На этом этапе мы уже будем иметь сохранённый ключ ssh в .ssh/known_hosts, дав ответ "yes" примерно на такой вопрос:
The authenticity of host '212.90.160.1 (212.90.160.1)' can't be established.
RSA key fingerprint is aa:fe:a0:38:7d:11:78:60:01:b0:80:78:90:ab:6a:d2.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '212.90.160.1' (RSA) to the list of known hosts.
и уже скопированный в .ssh/authorized_keys на стороне сервера ключ авторизации клиента.

Далее прописываем на стороне клиента сам интерфейс в /etc/network/interfaces:

auto tun0
iface tun0 inet static
pre-up ssh -S /var/run/ssh-myvpn-tunnel-control -M -f -w 0:1 212.90.160.1 true
pre-up sleep 5
post-up ip l s tun0 mtu 1300
address 10.254.254.2
netmask 255.255.255.252
pointopoint 10.254.254.1
post-down ssh -S /var/run/ssh-myvpn-tunnel-control -O exit 212.90.160.1
На этом этапе прекратим работы с клиентом и приступим к серверу.

Подготовительные работы на стороне сервера.

На стороне сервера перво-наперво вносим следующие изменения в /etc/ssh/sshd_config:

PermitTunnel point-to-point
PermitRootLogin forced-commands-only

Теперь отредактируем /root/.ssh/authorized_keys, добавив в него команду на организацию туннеля:

tunnel="1",command="/sbin/ifdown tun1;/sbin/ifup tun1" ssh-rsa AAAA......X9vc= root@ipclub

После этого отредактируем /etc/network/interfaces:

auto vlan8
iface vlan8 inet static
address 212.90.160.1
netmask 255.255.255.224
network 212.90.160.0
broadcast 212.90.160.31
gateway 212.90.160.30
vlan_raw_device eth0
mtu 1400

iface tun1 inet static
address 10.254.254.1
netmask 255.255.255.252
pointopoint 10.254.254.2
post-up ip l s tun0 mtu 1300

Не забываем определить в /etc/sysctl.conf состояние net.ipv4.conf.default.forwarding:

Код
net.ipv4.conf.default.forwarding=1
ну или перед использование туннеля:
$ sudo sysctl net.ipv4.conf.default.forwarding=1
Важно! Если не устанавливать net.ipv4.conf.default.forwarding в значение 1, то туннели подниматься не будут!

Собственно на этом этапе все подготовительные работы закончены. Пробуем поднять наш туннель со стороны клиента:

$ sudo ifup tun0
$ ip a l dev tun0
9: tun0:  mtu 1300 qdisc pfifo_fast qlen 500
link/[65534]
inet 10.254.254.2 peer 10.254.254.1/30 scope global tun0
$ ping -c2 10.254.254.1
PING 10.254.254.1 (10.254.254.1): 56 data bytes
64 bytes from 10.254.254.1: icmp_seq=0 ttl=64 time=15.116 ms
64 bytes from 10.254.254.1: icmp_seq=1 ttl=64 time=16.454 ms
--- 10.254.254.1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 15.116/15.785/16.454/0.669 ms
И наблюдаем icmp трафик на стороне сервера:
$ sudo tshark -tad -pni tun1
Running as user "root" and group "root". This could be dangerous.
Capturing on tun1
2009-03-10 11:25:53.927598 10.254.254.2 -> 10.254.254.1 ICMP Echo (ping) request
2009-03-10 11:25:53.927649 10.254.254.1 -> 10.254.254.2 ICMP Echo (ping) reply
2009-03-10 11:25:54.567857 10.254.254.2 -> 10.254.254.1 ICMP Echo (ping) request
2009-03-10 11:25:54.567910 10.254.254.1 -> 10.254.254.2 ICMP Echo (ping) reply

Дальше можете работать с этими интерфейсами как с обычными eth, vlan, gre и т.д. Маршрутизировать трафик через них, настраивать правила фильтрации и т.д. и т.п. Полёт мысли ограничивается лишь фантазией wink.gif Однако не забываем, что туннель всё-таки построен на третьем уровне поэтому маркирование пакетов QoS вряд-ли даст тот результат который хотелось бы ожидать.

Собственно на этом можно было бы и закончить, но хочется обратить внимание на один "скользкий" момент, для тех кто хочет поднимать несколько SSH Layer 3 туннелей.
Клиент:
pre-up ssh -S /var/run/ssh-myvpn-tunnel-control -M -f -w 0:1 212.90.160.1 true
Сервер:
tunnel="1",command="/sbin/ifdown tun1;/sbin/ifup tun1" ssh-rsa AAAA......X9vc= root@ipclub
0 - это номер туннеля на стороне клиента
1 - это номер туннеля на стороне сервера

Вот, чуть не забыл.
Есть ещё один неприятный момент. Соединение, периодически может "отваливаться". Посему неплохо будет озаботиться где нидудь в cron'е выполнить примерно такой сценарий, на стороне клиента:

$ cat /etc/cron.d/tun0
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
*/5 *     * * *     root   fping -c4 10.254.254.1 || ( /sbin/ifdown tun0; sleep 5; /sbin/ifup tun0 )
$ sudo /etc/init.d/cron restart


Вот теперь, наверное, действительно всё! smile.gif

четвер, 4 червня 2009 р.

Как восстановить сетевой стек протокола TCP/IP в Windows? (В частности, после "убиения" оного всякими вирусами)

Пуск - Выполнить
Код:
netsh winsock reset
и после этого перегрузиться.
после этого, на всякий случай, можно так-же сделать

Код:
netsh interface ip reset
после этого перенастроить свое сетевое подключение. глядишь и поможет. ;) если поможет, то проблема может крыться глубже, чем Вы думаете :( у нас на конторе давеча какого-то червячка поймали, которого ни одна антивирь не ловила, а вот полная переинициализация сетевого стека народу помогала :)

Как настроить шейпер на локальную сеть, с корректным/справедливым делением входящего и исходящего трафика?

Вместо предисловия.
Задача, для простых конфигураций, состоит из двух этапов решения.
В качестве препроцессора для формирования tc будем использовать tcng. Категорически советую общественности наконец обратить внимание на этот замечательный инструментарий.
Как правило задача ограничить ширину канала из Интернета к локальным хостам не вызывает особых проблем, ведь этот трафик для сервера, по отношению к клиентским хостам, определяется как egress. В основном "мучения" наступают когда надо ограничить ширину канала из локалки в Интернет. Ниже мы постараемся решить и эту небольшую проблему.

Вводные данные.
Пусть ISP на eth0 - 100Мбит/с, и на нём поднимается ppp0. Пропускная способность ppp0 - 1Мбит/с . Локалка eth1 - 100Мбит/с.
Предположим, что ip адрес выданный провайдером на ppp0 - 100.100.100.100, а на eth1 поднят адрес 10.100.1.1/24. В локальной сети есть четыре привилегированных адреса (10.100.1.254, 10.100.1.253, 10.100.1.252 и 10.100.1.251) на которых поровну делится половина канала в Интернет (512Кбит/с по 128Кбит/с на каждый хост), остальные хосты в сети работают на второй половине канала (512Кбит/с) и нас особо не интересует как они между собой поделят эту скорость.

Первый этап решения.
Описываем правила iptables для трафика приходящего к нам из локалки и уходящий в Интернет:
Код:
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
[0:0] -A PREROUTING -s 10.100.1.254/32 -j MARK --set-xmark 1001
[0:0] -A PREROUTING -s 10.100.1.254/32 -j RETURN
[0:0] -A PREROUTING -s 10.100.1.253/32 -j MARK --set-xmark 2002
[0:0] -A PREROUTING -s 10.100.1.253/32 -j RETURN
[0:0] -A PREROUTING -s 10.100.1.252/32 -j MARK --set-xmark 3003
[0:0] -A PREROUTING -s 10.100.1.252/32 -j RETURN
[0:0] -A PREROUTING -s 10.100.1.251/32 -j MARK --set-xmark 4004
[0:0] -A PREROUTING -s 10.100.1.251/32 -j RETURN
COMMIT
В приведенном примере трафик маркируется в PREROUTING, хотя это транзитный трафик и его с таким же успехом можно промаркировать в цепочке FORWARD таблицы mangle.

Дальше, рисуем скрипт для tcng:
Код:
#define IFACE0  ppp0
#define LOCALRT 102400
#define RATE    1024
#define R2Q     7

$rate01 = (RATE/2)/4;
$rate02 = (RATE/2)/4;
$rate03 = (RATE/2)/4;
$rate04 = (RATE/2)/4;
$rate_other = RATE/2;

dev IFACE0 {
egress {
class (<$mark01>)       if meta_nfmark==1001;
class (<$mark02>)       if meta_nfmark==2002;
class (<$mark03>)       if meta_nfmark==3003;
class (<$mark04>)       if meta_nfmark==4004;
class (<$low>)          if 1;
htb ( rate LOCALRT kbps, r2q R2Q ) {
class ( rate RATE kbps ) {
$mark01 = class ( rate $rate01 kbps ) { sfq(); }
$mark02 = class ( rate $rate02 kbps ) { sfq(); }
$mark03 = class ( rate $rate03 kbps ) { sfq(); }
$mark04 = class ( rate $rate04 kbps ) { sfq(); }
$low = class ( rate $rate_other kbps ) { sfq(); }
}
}
}
}
Преобразуем скрипт tcng в правила tc:
Код:
$ tcng -r linuxforum.ru-topic-79544.ppp0.tcc
tc qdisc del dev ppp0 root
tc qdisc del dev ppp0 ingress

# ================================ Device ppp0 ================================

tc qdisc add dev ppp0 handle 1:0 root dsmark indices 8 default_index 0
tc qdisc add dev ppp0 handle 2:0 parent 1:0 htb r2q 7
tc class add dev ppp0 parent 2:0 classid 2:1 htb rate 128000bps
tc class add dev ppp0 parent 2:1 classid 2:2 htb rate 16000bps
tc qdisc add dev ppp0 handle 3:0 parent 2:2 sfq
tc class add dev ppp0 parent 2:1 classid 2:3 htb rate 16000bps
tc qdisc add dev ppp0 handle 4:0 parent 2:3 sfq
tc class add dev ppp0 parent 2:1 classid 2:4 htb rate 16000bps
tc qdisc add dev ppp0 handle 5:0 parent 2:4 sfq
tc class add dev ppp0 parent 2:1 classid 2:5 htb rate 16000bps
tc qdisc add dev ppp0 handle 6:0 parent 2:5 sfq
tc class add dev ppp0 parent 2:1 classid 2:6 htb rate 64000bps
tc qdisc add dev ppp0 handle 7:0 parent 2:6 sfq
tc filter add dev ppp0 parent 2:0 protocol all prio 1 tcindex mask 0x7 shift 0
tc filter add dev ppp0 parent 2:0 protocol all prio 1 handle 5 tcindex classid 2:6
tc filter add dev ppp0 parent 2:0 protocol all prio 1 handle 4 tcindex classid 2:5
tc filter add dev ppp0 parent 2:0 protocol all prio 1 handle 3 tcindex classid 2:4
tc filter add dev ppp0 parent 2:0 protocol all prio 1 handle 2 tcindex classid 2:3
tc filter add dev ppp0 parent 2:0 protocol all prio 1 handle 1 tcindex classid 2:2
tc filter add dev ppp0 parent 1:0 protocol all prio 1 handle 1001 fw classid 1:1
tc filter add dev ppp0 parent 1:0 protocol all prio 1 handle 2002 fw classid 1:2
tc filter add dev ppp0 parent 1:0 protocol all prio 1 handle 3003 fw classid 1:3
tc filter add dev ppp0 parent 1:0 protocol all prio 1 handle 4004 fw classid 1:4
tc filter add dev ppp0 parent 1:0 protocol all prio 2 u32 match u32 0x0 0x0 at 0 classid 1:5
Что имеем на данном этапе? Спроектированный egress для интерфейса ppp0. Жёсткие ограничения в скорости установленные для наших локальных адресов 10.100.1.254, 10.100.1.253, 10.100.1.252 и 10.100.1.251. Все остальные хосты нашей сети используют остаток канала, который останется после распределения нагрузки этих хостов.

Второй этап решения.
Рисуем скрипт tcng для eth1:
Код:
#define IFACE0  eth1
#define LOCALRT 102400
#define RATE    1024
#define R2Q     7
#define MY_IP   10.100.1.1

$rate01 = (RATE/2)/4;
$rate02 = (RATE/2)/4;
$rate03 = (RATE/2)/4;
$rate04 = (RATE/2)/4;
$rate_other = RATE/2;

$localrate = LOCALRT-RATE;

dev IFACE0 {
egress {
class (<$local>)        if ip_src == MY_IP && ip_dst/24 == 10.100.1.0;
class (<$mark01>)       if ip_dst == 10.100.1.254;
class (<$mark02>)       if ip_dst == 10.100.1.253;
class (<$mark03>)       if ip_dst == 10.100.1.252;
class (<$mark04>)       if ip_dst == 10.100.1.251;
class (<$low>)          if ip_dst/24 == 10.100.1.0;
htb ( rate LOCALRT kbps, r2q R2Q ) {
class ( rate $localrate kbps ) {
$local = class ( rate $localrate kbps ) { sfq(); }
}
class ( rate RATE kbps ) {
$mark01 = class ( rate $rate01 kbps ) { sfq(); }
$mark02 = class ( rate $rate02 kbps ) { sfq(); }
$mark03 = class ( rate $rate03 kbps ) { sfq(); }
$mark04 = class ( rate $rate04 kbps ) { sfq(); }
$low = class ( rate $rate_other kbps ) { sfq(); }
}
}
}
}
Преобразуем скрипт tcng в правила tc:
Код:
$ tcng -r linuxforum.ru-topic-79544.eth1.tcc
tc qdisc del dev eth1 root
tc qdisc del dev eth1 ingress

# ================================ Device eth1 ================================

tc qdisc add dev eth1 handle 1:0 root dsmark indices 8 default_index 0
tc qdisc add dev eth1 handle 2:0 parent 1:0 htb r2q 7
tc class add dev eth1 parent 2:0 classid 2:1 htb rate 12672000bps
tc class add dev eth1 parent 2:1 classid 2:2 htb rate 12672000bps
tc qdisc add dev eth1 handle 3:0 parent 2:2 sfq
tc class add dev eth1 parent 2:0 classid 2:3 htb rate 128000bps
tc class add dev eth1 parent 2:3 classid 2:4 htb rate 16000bps
tc qdisc add dev eth1 handle 4:0 parent 2:4 sfq
tc class add dev eth1 parent 2:3 classid 2:5 htb rate 16000bps
tc qdisc add dev eth1 handle 5:0 parent 2:5 sfq
tc class add dev eth1 parent 2:3 classid 2:6 htb rate 16000bps
tc qdisc add dev eth1 handle 6:0 parent 2:6 sfq
tc class add dev eth1 parent 2:3 classid 2:7 htb rate 16000bps
tc qdisc add dev eth1 handle 7:0 parent 2:7 sfq
tc class add dev eth1 parent 2:3 classid 2:8 htb rate 64000bps
tc qdisc add dev eth1 handle 8:0 parent 2:8 sfq
tc filter add dev eth1 parent 2:0 protocol all prio 1 tcindex mask 0x7 shift 0
tc filter add dev eth1 parent 2:0 protocol all prio 1 handle 6 tcindex classid 2:8
tc filter add dev eth1 parent 2:0 protocol all prio 1 handle 5 tcindex classid 2:7
tc filter add dev eth1 parent 2:0 protocol all prio 1 handle 4 tcindex classid 2:6
tc filter add dev eth1 parent 2:0 protocol all prio 1 handle 3 tcindex classid 2:5
tc filter add dev eth1 parent 2:0 protocol all prio 1 handle 2 tcindex classid 2:4
tc filter add dev eth1 parent 2:0 protocol all prio 1 handle 1 tcindex classid 2:2
tc filter add dev eth1 parent 1:0 protocol all prio 1 u32 match u32 0xa640101 0xffffffff at 12 match u32 0xa640100 0xffffff00 at 16 classid 1:1
tc filter add dev eth1 parent 1:0 protocol all prio 1 u32 match u32 0xa6401fe 0xffffffff at 16 classid 1:2
tc filter add dev eth1 parent 1:0 protocol all prio 1 u32 match u32 0xa6401fd 0xffffffff at 16 classid 1:3
tc filter add dev eth1 parent 1:0 protocol all prio 1 u32 match u32 0xa6401fc 0xffffffff at 16 classid 1:4
tc filter add dev eth1 parent 1:0 protocol all prio 1 u32 match u32 0xa6401fb 0xffffffff at 16 classid 1:5
tc filter add dev eth1 parent 1:0 protocol all prio 1 u32 match u32 0xa640100 0xffffff00 at 16 classid 1:6
Собственно все. Не мудрствуя лукаво мы решили поставленную задачу.

Послесловие.
Естественно, что правила в tcng можно/нужно рисовать свои условия - они индивидуальны для каждого.
Этот пример носят лишь характер "для справки" и способствуют систематизации некоторых знаний :)

Правим реестр на предмет сетевых настроек или "работа с напильником"

Раньше мы уже говорили: "отключить тут", "подкрутить здесь", "отвинтить там"...
Теперь ещё немного рецептов от лучших аптекарей города :)
На этот раз в качестве капельницы нам будет служить rededit. Кто не в курсе, что это за программа - лучше оставьте этот фрагмент топика и надейтесь на то, что этот функционал Вам реализуют в Датапаке. (Или как там это чудо обзывается? Посмотреть бы на него хоть краем глаза, а то как-то даже неудобно... Вроде бы клиент сети... ;))
И так. По порядку.

Мы очень не любим открытых ресурсов по-умолчанию и анонимных пользователей, которые ломятся к нам!
;Полностью отключить общие ресурсы ADMIN$, C$ и т.д.
Код:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters]
"AutoShareWks"=dword:00000000 (0)
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters]
"AutoShareServer"=dword:00000000 (0)
;Запретить анонимным пользователям просматривать ресурсы
Код:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]
"RestrictAnonymous"=dword:00000001 (1)
Ограничим значение MTU. Рецепт нахождения значения MTU читаем выше.
;Установить значение MTU
Код:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"MTU"=dword:00000578 (1400)
или попросим наши "форточки" находить его автоматически? ;)
;Автоматически определять MTU
Код:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"EnablePMTUDiscovery"=dword:00000001 (1)
Включим поддержку больших окон в кадре TCP. Используйте осторожно. Теоретически хуже не станет, но мало ли...
;Включить поддержку TCP окон больше 64Кб
Код:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"Tcp1323Opts"=dword:00000001 (1)
А вот следующий параметр позволит снизить лишнюю нагрузку на сеть, при передаче "повреждённых" данных.
;Выборочная передача поврежденных данных
;Данная опция включает поддержку Selective Asknowledgement (SACK). Если пакет или ряд пакетов TCP потеряны, то получатель может сообщить отправителю, какие данные были получена, а какие нет.
Код:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"SackOpts"=dword:00000001 (1)
Данные параметры не влияют на быстродействие работы в сети, но несколько влияют на скорость загрузки компьютера под управлением Windows XP, подключенного к сети.
;Не сканировать сеть на наличие сетевых принтеров
Код:
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RemoteComputer\NameSpace\{2227A280-3AEA-1069-A2DE-08002B30309D}]
;Не сканировать сеть на наличие заданий (Sheduled Tasks)
Код:
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RemoteComputer\NameSpace\{D6277990-4C6A-11CF-8D87-00AA0060F5BF}]
А вот чего нам и даром не надо, так это Messenger'а!!! :)
;Отключить службу Messenger (останавливает спам(?). не влияет на MSN or Windows Messenger)
Код:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Messenger]
"Start"=dword:00000004
А какой Вы используете поисковик, если, ни дай Бог, запустите и начнёте пользоваться Internet Explorer'ом?
;Поиск в Google из строки адреса
Код:
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\SearchUrl\G]
@="http://www.google.com/search?q=%s"
;Запретить Active Desktop
Код:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoActiveDesktop"=dword:00000001 (1)
Запретим "ишаку" обновляться автоматически. А то мало ли... Всякие там лицензии и прочая лабуда - а оно нам надо? ;)
;Запретить автоматическое обновление IE
Код:
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main]
"NoUpdateCheck"=dword:00000001 (1)
К приведённым выше "таблеткам", аспирин прилагается по требованию больного.
Спасибо за внимание :)

PS: Чуть было не забыл. Для полного счастья, на всякий случай, после внесения изменений - перезагрузите свой компьютер.

О параметрах QoS. Значения dscp. (практически для Linux)

Подводя итоги к статье "Implementing Quality of Service Policies with DSCP" и скрещивая "ёжика с бегемотом", т.е. Linux с Cisco, хочу облегчить (?) труд последующим поколениям (да и себе, на случай "если забуду").

Вот некоторые сводные таблицы по терминам и значениям.
ToS Byte
Код:
┌────┬────┬────┬────┬────┬────┬─────┬─────┐
│ 1  │ 0  │ 1  │ T2 │ T1 │ T0 │ CU2 │ CU0 │
└────┴────┴────┴────┴────┴────┴─────┴─────┘
IP precedence—three bits (P2 to P0)
Delay, Throughput and Reliability—three bits (T2 to T0)
CU (Currently Unused)—two bits(CU1-CU0)
DiffServ Field
Код:
┌────┬────┬────┬────┬────┬────┬─────┬─────┐
│DS5 │DS4 │DS3 │DS2 │DS1 │DS0 │ ECN │ ECN │
└────┴────┴────┴────┴────┴────┴─────┴─────┘
DSCP—six bits (DS5-DS0)
ECN—two bits
Код:
┌────────────┬────────────────────────────────┐
│ Precedence │          Description           │
│   Level    │                                │
├────────────┼────────────────────────────────┤
│ 7          │ Stays the same (link layer and │
│            │ routing protocol keep alive)   │
├────────────┼────────────────────────────────┤
│ 6          │ Stays the same (used for IP    │
│            │ routing protocols)             │
├────────────┼────────────────────────────────┤
│ 5          │ Express Forwarding (EF)        │
├────────────┼────────────────────────────────┤
│ 4          │ Class 4                        │
├────────────┼────────────────────────────────┤
│ 3          │ Class 3                        │
├────────────┼────────────────────────────────┤
│ 2          │ Class 2                        │
├────────────┼────────────────────────────────┤
│ 1          │ Class 1                        │
├────────────┼────────────────────────────────┤
│ 0          │ Best effort                    │
└────────────┴────────────────────────────────┘
Код:
┌────────┬────────┬────────┬────────┬────────┐
│  Drop  │ Class 1│ Class 2│ Class 3│ Class 4│
│        │  CS1   │  CS2   │  CS3   │  CS4   │
├────────┼────────┼────────┼────────┼────────┤
│ Low    │ AF11   │ AF21   │ AF31   │ AF41   │
│        │ DSCP 10│ DSCP 18│ DSCP 26│ DSCP 34│
│        │ 001010 │ 010010 │ 011010 │ 100010 │
│        │ 0x0a   │ 0x12   │ 0x1a   │ 0x22   │
├────────┼────────┼────────┼────────┼────────┤
│ Medium │ AF12   │ AF 22  │ AF32   │ AF42   │
│        │ DSCP 12│ DSCP 20│ DSCP 28│ DSCP 36│
│        │ 001100 │ 010100 │ 011100 │ 100100 │
│        │ 0x0c   │ 0x14   │ 0x1c   │ 0x24   │
├────────┼────────┼────────┼────────┼────────┤
│ High   │ AF13   │ AF23   │ AF33   │ AF43   │
│        │ DSCP 14│ DSCP 22│ DSCP 30│ DSCP 38│
│        │ 001110 │ 010110 │ 011110 │ 100110 │
│        │ 0x0e   │ 0x16   │ 0x1e   │ 0x26   │
└────────┴────────┴────────┴────────┴────────┘
Подводя итог всему вышесказанному:
Код:
--set-dscp-class af11     Match packets with AF11 dscp              (001010), --set-dscp 0x0a
--set-dscp-class af12     Match packets with AF12 dscp              (001100), --set-dscp 0x0c (dec 12)
--set-dscp-class af13     Match packets with AF13 dscp              (001110), --set-dscp 0x0e (dec 14)
--set-dscp-class af21     Match packets with AF21 dscp              (010010), --set-dscp 0x12 (dec 18)
--set-dscp-class af22     Match packets with AF22 dscp              (010100), --set-dscp 0x14 (dec 20)
--set-dscp-class af23     Match packets with AF23 dscp              (010110), --set-dscp 0x16 (dec 22)
--set-dscp-class af31     Match packets with AF31 dscp              (011010), --set-dscp 0x1a (dec 26)
--set-dscp-class af32     Match packets with AF32 dscp              (011100), --set-dscp 0x1c (dec 28)
--set-dscp-class af33     Match packets with AF33 dscp              (011110), --set-dscp 0x1e (dec 30)
--set-dscp-class af41     Match packets with AF41 dscp              (100010), --set-dscp 0x22 (dec 34)
--set-dscp-class af42     Match packets with AF42 dscp              (100100), --set-dscp 0x24 (dec 36)
--set-dscp-class af43     Match packets with AF43 dscp              (100110), --set-dscp 0x26 (dec 38)
--set-dscp-class cs0      Match packets with default dscp           (000000), --set-dscp 0x00 (dec 00)
--set-dscp-class cs1      Match packets with CS1(precedence 1) dscp (001000), --set-dscp 0x08 (dec 08)
--set-dscp-class cs2      Match packets with CS2(precedence 2) dscp (010000), --set-dscp 0x10 (dec 16)
--set-dscp-class cs3      Match packets with CS3(precedence 3) dscp (011000), --set-dscp 0x18 (dec 24)
--set-dscp-class cs4      Match packets with CS4(precedence 4) dscp (100000), --set-dscp 0x20 (dec 32)
--set-dscp-class cs5      Match packets with CS5(precedence 5) dscp (101000), --set-dscp 0x28 (dec 40)
--set-dscp-class cs6      Match packets with CS6(precedence 6) dscp (110000), --set-dscp 0x30 (dec 48)
--set-dscp-class cs7      Match packets with CS7(precedence 7) dscp (111000), --set-dscp 0x38 (dec 56)
--set-dscp-class ef       Match packets with EF dscp                (101110), --set-dscp 0x2e (dec 46)

Задействуем функционал QoS (ToS) (решение для Linux)

Собственно, в связи с тем, что сеть Датасвит поддерживает функционал QoS:
Цитата:
Сообщение от Fire Посмотреть сообщение
DSCP to 802.1p
IP TOS Precedence to Priority Queue Mapping
802.1P Priority to Priority Queue Mapping
TOS/Differentiated Service Enable
Flow Control
Port Priority
Попытаться реализовать "под себя" этот функционал можно переопределив значения поля DSCP, через iptables в таблице mangle:
Код:
*mangle
:PREROUTING ACCEPT [178941:94642599]
:INPUT ACCEPT [121227:85510027]
:FORWARD ACCEPT [18238:2053107]
:OUTPUT ACCEPT [126752:85537218]
:POSTROUTING ACCEPT [133655:86846914]
[0:0] -A INPUT -j DSCP --set-dscp 0x0a
[0:0] -A INPUT -p gre -j DSCP --set-dscp 0x2e
[0:0] -A INPUT -p icmp -m icmp --icmp-type any -j DSCP --set-dscp 0x1a
[0:0] -A INPUT -p tcp -m tcp --dport 80 -j DSCP --set-dscp 0x22
[0:0] -A INPUT -p tcp -m tcp --dport 22 -j DSCP --set-dscp 0x24
[0:0] -A FORWARD -j DSCP --set-dscp 0x0a
[0:0] -A FORWARD -j DSCP --set-dscp 0x0a
[0:0] -A FORWARD -p gre -j DSCP --set-dscp 0x2e
[0:0] -A FORWARD -p gre -j DSCP --set-dscp 0x2e
[0:0] -A FORWARD -p icmp -m icmp --icmp-type any -j DSCP --set-dscp 0x1a
[0:0] -A FORWARD -p icmp -m icmp --icmp-type any -j DSCP --set-dscp 0x1a
[0:0] -A FORWARD -p tcp -m tcp --dport 80 -j DSCP --set-dscp 0x22
[0:0] -A FORWARD -p tcp -m tcp --sport 80 -j DSCP --set-dscp 0x22
[0:0] -A FORWARD -p tcp -m tcp --dport 8085 -j DSCP --set-dscp 0x2e
[0:0] -A FORWARD -p tcp -m tcp --sport 8085 -j DSCP --set-dscp 0x2e
[0:0] -A FORWARD -p tcp -m tcp --dport 22 -j DSCP --set-dscp 0x24
[0:0] -A FORWARD -p tcp -m tcp --sport 22 -j DSCP --set-dscp 0x24
[0:0] -A OUTPUT -j DSCP --set-dscp 0x0a
[0:0] -A OUTPUT -p gre -j DSCP --set-dscp 0x2e
[0:0] -A OUTPUT -p icmp -m icmp --icmp-type any -j DSCP --set-dscp 0x1a
[0:0] -A OUTPUT -p tcp -m tcp --sport 80 -j DSCP --set-dscp 0x22
[0:0] -A OUTPUT -p tcp -m tcp --sport 22 -j DSCP --set-dscp 0x24
[0:0] -A OUTPUT -p udp -m udp --sport 4569 -j DSCP --set-dscp 0x2e
[0:0] -A OUTPUT -p udp -m udp --sport 10000:20000 -j DSCP --set-dscp 0x2e
[0:0] -A OUTPUT -p udp -m udp --sport 5060 -j DSCP --set-dscp 0x18
Если у Вас всего один компьютер, то определять цепочку FORWARD не нужно.
Ну и, естественно, что значения поля dscp и условия для его установки могут отличаться от предложенных выше. На вкус и цвет, как говориться... ;) Только помните, что если весь Ваш поток "закинуть" в EF, то он перестанет быть "гарантированным", надеюсь понимаете почему? ;)
Отдельно хочется отметить, что инструкция -j DSCP --set-dscp не является терминирующей, как DROP, ACCEPT или REJECT, поэтому наиболее общие условия для установки DSCP необходимо описывать раньше, чем частные решения.

PS: Ну и опять таки - это не панацея от всех бед, а лишь один из кирпичиков в Вашем тетрисе :)

Ограничить скорость своего исходящего трафика (рецепт для Linux)

Есть ещё один неприятный момент при работе в Интернете, когда у Вас есть ограничение по скорости. Я не даром приводил задачу для начальных классов школы о втекающей и вытекающей в бассейн воде. Дело в том, что такая-же "петрушка" происходит и с тем трафиком которых является исходящим от Вас.

Предположим, что Вы покупаете канал в Интернет 256Кбит/с, а Ваша сетевая карта настроена в режиме 100Мбит/с (ну или 10Мбит/с - тут это не принципиально). Т.е. Вы будете отдавать на шлюз трафик со скоростью заведомо большей (и во много раз большей!) чем от Вас ожидают. Что при этом произойдёт? Ответ: ванная (стек ip) очень быстро заполнится и вода начнёт выливаться за края (трафик начнёт просто теряться. "лишний" трафик просто перестанет обрабатываться). Безусловно, что в механизме ip существуют механизмы которые контролируют передачу и если что-то где-то потерялось, то потерянный пакет будет отправлен заново - продублируется. Если пакет будет продублирован - это вызовет ненужную нагрузку на Ваш канал, так как этот трафик Вам реально не нужен, он-же был отправлен раньше и т.д. Пока все данные не будут отправлены этот "снежный ком" будет "катиться" и иногда приобретать лавинообразный характер.

Ну не знаю как там в "форточках" (Windows) но в Linux одно из решений этой "проблемы" - ограничить свой исходящий (egress) трафик самостоятельно, в пределах оговорённого Вашим тарифным пакетом, тем согласовав скорость с той, которую ожидает провайдер (оператор услуги):
Код:
# $1 - интерфейс, на котором ограничиваем пропускную способность
# удаляем дисциплины обработки очередей с интерфейса - переводим в состояние pfifo
tc qdisc del dev $1 root
# устанавливаем значение ds
tc qdisc add dev $1 handle 1:0 root dsmark indices 1 default_index 0
# ограничиваем исходящую скорость дисциплиной tbf на 1024Кбит/с (1Мбит/с)
tc qdisc add dev $1 handle 2:0 parent 1:0 tbf burst 3072 limit 20480 mtu 1408 rate 125000bps
Этот код надо вставить куда нибудь, где он будет выполняться после "подъема" интерфейса смотрящего в сторону оператора связи. Безусловно, что вместо $1 необходимо прописать свой реальный интерфейс :)

Кстати оригинальный вариант для tcng выглядит так:
Код:
#define IFACE0  eth3
#define MTU     1408B
#define RATE    1Mbps
#define BURST   3kB
#define LIMIT   20kB

dev IFACE0 {
egress {
tbf (mtu MTU,limit LIMIT,rate RATE,burst BURST);
}
}
Сохраняем в какой нибудь файл. Затем говорим:
Код:
~$ tcng filename.tcng
и получаем результат приведённый выше.

Конечно-же при помощи tcng и tc можно "нарисовать" более сложные политики/решения с дисциплинами htb и т.п., но данный топик для такого рода обсуждений не предназначен ;)

О! Чуть не забыл. Посмотреть какими дисциплинами в данный момент обрабатывается Ваша очередь можно так:
Код:
~$ sudo tc -s qdisc ls dev eth3
qdisc dsmark 1: indices 0x0001 default_index 0x0000
Sent 2040274 bytes 4253 pkt (dropped 10, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc tbf 2: parent 1: rate 1000Kbit burst 3Kb lat 136.0ms
Sent 2039684 bytes 4250 pkt (dropped 10, overlimits 1942 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
~$ sudo tc -s -d qdisc ls dev eth1
qdisc pfifo_fast 0: root bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
Sent 119707 bytes 1087 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
Обратите внимание на dropped - это тот трафик которого от нас, в общем-то, не ждали и мы его не дали в сеть. Тем самым мы снизили нагрузку на оборудование сети, за что, наверное получили виртуальную "спасибу" от администраторов :)

Как полностью отключить службу QoS?

По умолчанию QoS (Quality of Service) резервирует для своих нужд 20 % от пропускной способности канала.
Причём, даже если удалить службу Планировщик пакетов QoS из свойств соединения, этот канал не освобождается. Освободить канал, или просто настроить QoS, можно таким образом. Запускаем апплет Групповая политика (gpedit.msc).
В Групповой политике находим Конфигурация компьютера и нажимаем на Административные шаблоны. Выбираем пункт Сеть -- Диспетчер пакетов QoS. Выбираем Ограничить резервируемую пропускную способность.
Теперь уменьшаем Ограничение пропускной способности с 20% до 0, или просто отключаем его.
При желании в Диспетчере пакетов QoS можно настроить и другие параметры QoS. Для активации произведённых изменений остаётся только перезагрузиться.



PS: Для справки, в Windows XP Home Edition нет gpedit.msc, так что по-умолчанию пользователям этой ОС данный рецепт не подходит... Для любопытствующих - может попробовать скопировать gpedit.msc из Windows XP Professional и попробовать таки реализовать этот сценарий. Сам я такого не пробовал, но мало ли... ;)


Информация к размышлению: "В некоторых публикациях и группах новостей заявлялось, что Windows XP всегда резервирует под нужды механизма QoS 20 % доступной полосы пропускания. Данное утверждение неверно."
Верить или не верить в данном случае Микрософту? Отсылаю к оригинальной статье, а решение принимайте самостоятельно - никто ни к чему не обязывает.

Почему скорость инета меньше, чем заявленная в договоре?

Скорость входящего трафика зависит не только от провайдера, а также еще и от нагруженности на сервер, с которого идет закачка и ограничения скорости сессии скачивания самим сервером.
Хочется также отметить, что указанная скорость "ДО некоторого значения" означает, что больше этого значения не будет, а ниже вполне вероятно. Т.е. скорость скачивания ЛЮБОЙ информации из Интернета в один и тот же момент времени, но с разных серверов может кардинально отличаться.
Попытаться более-менее объективно оценить скорость Вашего соединения могут помочь тесты.


Теперь, что касается ping-ов.

Эхо-реквесты (читай ping'и) предназначены для того чтобы определить доступность удалённого хоста, а также промониторить потери на третьем уровне модели OSI. Помимо этого они позволяют получить время отклика удалённого хоста, то есть это промежуток времени, за который пакет, отосланный от вашего компьютера, проходит до другого компьютера в сети и возвращается обратно. И хотя есть алгоритмы которые при помощи ping-ов помогают ориентировочно оценить пропускную способность канала, но полагаться на них как на "отче наш" имхо было бы глупой затеей.

Рассмотрим к примеру какой-нибудь сервер в Нью-Йорке.
Скорость света в вакууме составляет ~ 300 000 км/сек. В искусственной оптической среде это будет гораздо меньше. 1 секунда это 1000 миллисекунд. (ms). Расстояние от Киева до Нью-Йорка по прямой - 7530 км. Задержка светового сигнала для преодоления такого расстояния будет где-то 30ms. Но это теория.
Теперь практика - передаваемый или получаемый ip-пакет в сети Интернет это не просто сигнал, это цифровой поток данных который обрабатывается на L3-L4 уровнях, маршрутизируется, проходит большую цепочку автономных систем и пограничных устройств, и только потом попадает туда, куда нам нужно. Таким образом на практике мы получаем реальную в два или в три раза большую задержку на далекие и более менее развитые зарубежные ресурсы. Дальше уже на все влияет производительность автономных систем, и самих ресурсов.

Это всё к тому, что никакие тесты "скорости Интернета", особенно к географически удалённым системам, не могут дать объективных данных по максимальной пропускной способности канала клиента. И погрешность тем более чем больше ширина канала которую покупает клиент.

Слабый сигнал сетевой карты. Как 100 Мбит перевести в 10 Мбит?

  1. Находим на рабочем столе "Мой компьютер", жмем по нему правой клавишей мыши и выбираем "Свойства";
  2. Открываем закладку "Оборудование";
  3. Нажимаем кнопку "Диспетчер устройств";
  4. Находим категорию "Сетевые платы" (обычно где-то внизу списка), кликаем двойным щелчком по категории, появляется чуть ниже строчка, содержащая название Вашей сетевой платы. кликаем по ней правой клавишей мыши, выбираем "Свойства";
  5. Открываем закладку "Дополнительно";
  6. Находим в окошке "Свойство:" "Скорость линии или режим дуплекса" либо "Тип носителя" (в зависимости от производителя платы может быть указано что-то иное). Выбираем нужное нам свойство. Правее находится выпадающий список, именуемый "Значение:" Кликнув по нему, выберете 10 Мбит. Поля "Свйоство:" и "Значение:" взаимосвязаны, поэтому если слева выберете что-то не то, справа будет выпадающий список уже с другими значениями.
Выбрать надо именно 10Мбит. Или Вы реально, для работы в Интернете, используете 100Мбит? "Так зачем платить больше?"

Из положительных моментов, снижение скорости до 10Мбит/с:
  1. Снизит нагрузку на коммутатор (свич).
  2. Улучшит характеристики соотношения сигнал/шум в кабеле, на длинном плече.
Я не говорю, что этот момент сразу-же поможет и настанет райская жизнь. Но если скорость сначала снизите Вы, потом Ваш сосед, потом сосед соседа, потом... Так рано или поздно можно снизить нагрузку на коммутаторы сети. Другой вопрос, что никто этого делать не собирается, а жаль.... :(

Как полностью отключить NetBIOS на сетевом интерфейсе?

Панель управления -> Сетевые подключения. Дальше выбираем Вашу сетевую карту. Правая кнопка мышки, жмем Свойства -> Протокол Интернета TCP/IP (Свойства) -> Дополнительно -> WINS -> Параметры NetBIOS...
Где там у Вас отметочка-то стоит? Если у Вас не отмечено "Отключить NetBIOS через TCP/IP", то это значит, что NetBIOS у Вас все-таки включён. Выбираем "Отключить NetBIOS через TCP/IP" и применяем изменения.

Ну и конечно-же, удалите из свойств сетевой карты "Клиент для сетей Microsoft" и "Служба доступа к файлам и принтерам сетей Microsoft" - для работы в Интернет они совсем не нужны.

Рекомендации по диагностике. Определение значения MTU.

Кнопка Пуск->пункт Выполнить->набрать cmd->нажать Enter

В открывшемся окне пишем:
Код:
C:\>ipconfig

Windows IP Configuration


Ethernet adapter Local Area Connection:

Connection-specific DNS Suffix  . :
IP Address. . . . . . . . . . . . : 10.100.1.150
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 10.100.1.254
Определяем "Default Gateway" (в русскоязычной версии Windows - "Шлюз по-умолчанию").
Дальше посылаем на шлюз - эхореквест:
Код:
ping 10.100.1.254 -n 100
Данный вариант ping'а пошлет 100 пакетов и выведет статистику по своей работе. Тут есть одна рекомендация:
  • Если первые несколько ping'ов не прошли и выдали "Request timed out." (в русскоязычной версии Windows - "Превышен интервал ожидания для запроса."), останавливаем выполнение (Ctrl+C) и запускаем заново. Потеря первой пары-тройки ping'ов может отзначать задержку по резолву в обратной зоне службы DNS, так что не есть факт, что это потери именно по layer 3. Конечно-же если потеряно больше чем пара-тройка первых пакетов, то тут уже проблемы другого рода.
После того как вышеприведенная команда закончит свою работу, не надо отсылать всь "простыню", достаточно выделить несколько первых ping'ов, а потом последний и суммарную статистику:
Код:
C:\>ping 10.100.1.254 -l 1500 -n 100

Pinging 10.100.1.254 with 32 bytes of data:

Reply from 10.100.1.254: bytes=32 time=1ms TTL=255
Reply from 10.100.1.254: bytes=32 time=1ms TTL=255
...
Reply from 10.100.1.254: bytes=32 time=1ms TTL=255

Ping statistics for 10.100.1.254:
Packets: Sent = 100, Received = 100, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 1ms, Average = 0ms
Поверьте, что для диагностики эта информация будет иметь большую ценность, нежели киллометровые расппечатки пингов.
Собственно это была проверка Вашего шлюза в сеть, но при этом она проводилась маленьгими пакетами - всего 32 байта.
Дальше было бы неплохо выяснить размер MTU который пропускает шлюз по умолчанию. Для этого займёмся несколько нетривиальной, для рядового пользователя, задачей. Доведём размер эхо-реквест пакета до максимального, который может пропустить шлюз.
Код:
C:\> ping 10.100.1.254 -n 100 -l 1500 -f
Опция -f указывает на то, чтобы отослынне пакеты не фрагментировались по MTU. Объяснение физики этого процесса выходит за рамки этого очерка. Опция -l 1500 указывает на то, что мы будем отсылать пакеты размером 1500 байт. Итак Enter. Если пакеты прошли - ура! Значит все хорошо и мы выделяем ту-же статистику, что и в первом варианте (см.выше).
Но так-же вы можете увидеть в ответ "Packet needs to be fragmented but DF set". В этом случае укоротите размер пакета в опции -l. Если опять пакеты не прошли, сделайте это ещё раз. В определённй момент времени покеты начнут идти! У себя я экспериментально установил, что максимальный не фрагментируемый размер пакета - 1472 байт. Запомните это значение (не 1472, а то которое Вы найдёте для себя). Это важно! Можете записать его маркером на своём мониторе (шутка;)), но не забудьте его, чтобы не мучатся в следующий раз. Ну теперь опять пускаем ping:
Код:
C:\>ping 10.100.1.254 -n 100 -l 1472 -f

Pinging 10.100.1.254 with 1472 bytes of data:

Reply from 10.100.1.254: bytes=1472 time=1ms TTL=255
...
Reply from 10.100.1.254: bytes=1472 time=1ms TTL=255

Ping statistics for 10.100.1.254:
Packets: Sent = 100, Received = 100, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 1ms, Average = 0ms
Теперь пустите ping на хост 10.100.100.1, сначала стандартные для Windows 32 байта, а затем найденным размером с опцией -f, и отошлите собранную статистику.

Потом можете попробовать пропинговать таким-же образом сайты в Интернете (например google.com, ya.ru).

В случае проблем с доступом на сайты желательно проверить его доступность с помощью программы WinMTR. В строке Host пишем адрес сайта и жмем Start.

"Момент истины". Зачастую для ethernet карточек размер MTU устанавливается в 1500 байт. Но, как видим выше, в моём случае маршрутизатор не пропустил не фрагментируемые пакеты размером больше чем 1472 байта. Т.е. имеет смысл снизить для сетевой карты размер MTU для 1472 байт, так как маршрутизатор все равно не пропускает целиком пакеты больше этого значения, и фрагментирует их на несколько частей, после чего отсылает. Естественно, что это создает лишнюю нагрузку на маршрутизатор, и плюс к этому, в случае реальных потерь, никому ненужную нагрузку на сеть.

Для установки MTU можно либо вручную подправить реестр (страшно, да? ;)) либо воспользоваться утилитами сторонних разработчиков, например DrTCP. Кстати, определить размер MTU можно и не вручную, как описано выше, а опять таки с помощью специализированых утилит, например mturoute.

И ещё. Чуть было не забыл. Если удалённый хоть не отвечает на ping'и (не шлет Ech-Reply), то это не всегда означает, что этот ресурс недоступен. Иногда, для снижения нагрузки на сервер, или ещё по каким либо религиозным причинам, ответы на Echo-Requiest'ы просто отклучаются администраторами, либо просто заблокированы запросы из нашей/вашей сети. Так что критически анализируйте так называемую "недоступность хоста" :)
__________________