- SSH. подключение, ключи, туннели.
- Как пробросить ssh-соединение на внутренний IP-адрес?
- Как использовать аутентификация по ключам в ssh?
- Как использовать ssh в скриптах?
- Организация SSH Layer 3 туннеля
- SSH-туннели
сети. маршрутизация, раздача интернета. dhcp, dns, iptables. - Как настроить шейпер на локальную сеть, с корректным/справедливым делением входящего и исходящего трафика?
- Функционал QoS
- [howto]Шейпим трафик, используя hash фильтры tc"
- [статья]Недоступны некоторые сайты. Вечное ожидание ответа.
- [обсуждение] Подсчёт трафика.
- [обсуждение][howto]Два провайдера, балансировка нагрузки.
- [обсуждение]iproute2.
- [обсуждение]домашний роутер "самопал" vs аппаратный.
диски. фс, raid, lvm, iscsi, aoe. - Изменение размера раздела.
- [howto][обсуждение]Замена сбойного диска mdadm. Обсуждение идентичности дисков, загрузчика.
мониторинг. zabbix, nagios, cacti, mrtg, systat. - [обсуждение]Системы мониторинга.
email. smtp, pop3, imap. - [howto]Postfix+cyrus-saslauthd+dovecot+openldap
- [faq]faq по электронной почте для начинающих
admin cheatsheet. разнообразные советы россыпью. - Курсор в mcedit не виден в gnome-terminal. Как \"вылечить\"?
- [howto]Печать текста в кодировке CP866
FAQ aka Оглавление. обновляется.
Модераторы: SLEDopit, Модераторы разделов
-
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
FAQ aka Оглавление. обновляется.
-
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: FAQ aka Оглавление. обновляется.
Самым правильным и безопасным решением будет перенаправление соединений на внутренний IP-адрес при помощи iptables:
Код: Выделить всё
# iptables -t nat -A PREROUTING -i <ВНЕШНИЙ_ИНТЕРФЕЙС> -p tcp --dport 12322 -j DNAT --to-destination <ВНУТРЕННИЙ_ХОСТ>:22
Обсуждение:
Решено:"транзитный" пользователь
-
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: FAQ aka Оглавление. обновляется.
Как использовать ssh в скриптах?
Используйте аутентификацию по ключам.
Для этого в настройках sshd должна быть разрешена аутентификация по ключам:
Код: Выделить всё
PubkeyAuthentication yes
(по умолчанию -- она разрешена)
Далее создаёте ключи:
Код: Выделить всё
$ ssh-keygen
Содержимое ~/.ssh/id_rsa.pub добавляете в ~/.ssh/authorized_keys сервера.
В скриптах запускайте:
Код: Выделить всё
$ ssh -T
Обсуждение:
Решено: ssh соединение из script.sh
-
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: FAQ aka Оглавление. обновляется.
Скорее всего, этого происходит из-за того, что iptables пытается резолвить и выводить имена хостов, сетей или сервисов. Используйте -n, чтобы всё выводилось в численном формате:
Код: Выделить всё
# iptables -n -L
Обсуждение:
iptables тормозит
-
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: FAQ aka Оглавление. обновляется.
При загрузке в строке kernel(загрузчик -- GRUB) добавляете:
Код: Выделить всё
init=/bin/sh
После загрузки меняете пароль на новый при помощи passwd и перезагружаетесь.
Обсуждение:
еще раз о забытом пароле root-а
-
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: FAQ aka Оглавление. обновляется.
Ни один из способов не гарантирует сохранности данных -- делайте резервные копии
Вы можете сделать это при помощи gparted.
Поддерживаемые gparted файловые системы на данный момент:
ext2, ext3 – ограничение: нельзя перемещать начало раздела
fat16, fat32
hfs, hfs+, hfsx – ограничение: нельзя перемещать начало раздела, а также изменять размер можно только в сторону уменьшения
linux-swap
reiserfs (только с установленной libreiserfs)
Взято с: http://www.gnu.org/software/parted/manual/parted.html#resize
Обсуждение:
Увеличение размера linux разделов
-
- Сообщения: 365
- Статус: RAP22-RIPE
- ОС: Debian GNU/Linux Wheezy
Re: FAQ aka Оглавление. обновляется.
Вместо предисловия.
Задача, для простых конфигураций, состоит из двух этапов решения.
В качестве препроцессора для формирования 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
Дальше, рисуем скрипт для 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 -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 -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 можно/нужно рисовать свои условия - они индивидуальны для каждого.
Этот пример носят лишь характер "для справки" и способствуют систематизации некоторых знаний
-
- Сообщения: 365
- Статус: RAP22-RIPE
- ОС: Debian GNU/Linux Wheezy
Re: FAQ aka Оглавление. обновляется.
Если оборудование в Вашей сети поддерживает функционал QoS, то его можно попытаться задействовать А иначе зачем нам такое умное оборудование?
Реализуем этот функционал переопределив значения поля DSCP, через iptables в таблице mangle:
Код: Выделить всё
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
[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 необходимо описывать раньше, чем частные решения.
О параметрах QoS. Значения dscp.
Подводя итоги к статье "Implementing Quality of Service Policies with DSCP" и скрещивая "ёжика с бегемотом", т.е. Linux с Cisco, хочу облегчить (?) труд последующим поколениям (да и себе, на случай "если забуду").
Вот некоторые сводные таблицы по терминам и значениям.
ToS Byte
Код: Выделить всё
┌────┬────┬────┬────┬────┬────┬─────┬─────┐
│ 1 │ 0 │ 1 │ T2 │ T1 │ T0 │ CU2 │ CU0 │
└────┴────┴────┴────┴────┴────┴─────┴─────┘
Код: Выделить всё
┌────┬────┬────┬────┬────┬────┬─────┬─────┐
│ 1 │ 0 │ 1 │ 0 │ 0 │ 0 │ ECN │ ECN │
└────┴────┴────┴────┴────┴────┴─────┴─────┘
Код: Выделить всё
┌────────────┬────────────────────────────────┐
│ 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
--set-dscp-class af13 Match packets with AF13 dscp (001110), --set-dscp 0x0e
--set-dscp-class af21 Match packets with AF21 dscp (010010), --set-dscp 0x12
--set-dscp-class af22 Match packets with AF22 dscp (010100), --set-dscp 0x14
--set-dscp-class af23 Match packets with AF23 dscp (010110), --set-dscp 0x16
--set-dscp-class af31 Match packets with AF31 dscp (011010), --set-dscp 0x1a
--set-dscp-class af32 Match packets with AF32 dscp (011100), --set-dscp 0x1c
--set-dscp-class af33 Match packets with AF33 dscp (011110), --set-dscp 0x1e
--set-dscp-class af41 Match packets with AF41 dscp (100010), --set-dscp 0x22
--set-dscp-class af42 Match packets with AF42 dscp (100100), --set-dscp 0x24
--set-dscp-class af43 Match packets with AF43 dscp (100110), --set-dscp 0x26
--set-dscp-class cs0 Match packets with default dscp (000000), --set-dscp 0x00
--set-dscp-class cs1 Match packets with CS1(precedence 1) dscp (001000), --set-dscp 0x08
--set-dscp-class cs2 Match packets with CS2(precedence 2) dscp (010000), --set-dscp 0x10
--set-dscp-class cs3 Match packets with CS3(precedence 3) dscp (011000), --set-dscp 0x18
--set-dscp-class cs4 Match packets with CS4(precedence 4) dscp (100000), --set-dscp 0x20
--set-dscp-class cs5 Match packets with CS5(precedence 5) dscp (101000), --set-dscp 0x28
--set-dscp-class cs6 Match packets with CS6(precedence 6) dscp (110000), --set-dscp 0x30
--set-dscp-class cs7 Match packets with CS7(precedence 7) dscp (111000), --set-dscp 0x38
--set-dscp-class ef Match packets with EF dscp (101110), --set-dscp 0x2e
-
- Сообщения: 365
- Статус: RAP22-RIPE
- ОС: Debian GNU/Linux Wheezy
Re: FAQ aka Оглавление. обновляется.
Организация 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
Код: Выделить всё
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.
Далее прописываем на стороне клиента сам интерфейс в /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
Собственно на этом этапе все подготовительные работы закончены. Пробуем поднять наш туннель со стороны клиента:
Код: Выделить всё
$ sudo ifup tun0
$ ip a l dev tun0
9: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,10000> 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
Код: Выделить всё
$ 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 и т.д. Маршрутизировать трафик через них, настраивать правила фильтрации и т.д. и т.п. Полёт мысли ограничивается лишь фантазией Однако не забываем, что туннель всё-таки построен на третьем уровне поэтому маркирование пакетов 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 - это номер туннеля на стороне сервера
(15.03.2009)
Вот, чуть не забыл.
Есть ещё один неприятный момент. Соединение, периодически может "отваливаться". Посему неплохо будет озаботиться где нидудь в 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
Вот теперь, наверное, действительно всё!
-
- Сообщения: 365
- Статус: RAP22-RIPE
- ОС: Debian GNU/Linux Wheezy
Re: FAQ aka Оглавление. обновляется.
Продолжим тему туннелей. Не всегда есть возможность, да и не всегда надо, строить полноценный туннель с интерфейсной парой адресов. Иногда нам нужно лишь "прокинуть" вполне определённые порты.
Тут важно понимать, что туннель можно организовать как изнутри сети, к ресурсам которой вы хотите получить доступ, на внешний ssh-сервер. Также можно организовать туннель с хоста в Интернете на пограничный ssh-сервер сети, чтобы получить доступ к внутренним ресурсам.
Итак. По-порядку.
Строим туннель из сети в мир.
Код: Выделить всё
$ ssh -f -N -R 2222:10.11.12.13:22 username@99.88.77.66
Код: Выделить всё
$ ssh -p2222 localhost
Таким-же образом можно получить доступ к любому другому ресурсу, например:
Код: Выделить всё
$ ssh -f -N -R 2080:10.11.12.14:80 username@99.88.77.66
Введя на хосте 99.88.77.66:
Код: Выделить всё
$ w3m -dump http://localhost:2080
Строим туннель из мира в сеть.
Код: Выделить всё
$ ssh -f -N -L 4080:192.168.0.10:80 nameuser@88.77.66.55
Аналогично, вводим на своём хосте:
Код: Выделить всё
$ w3m -dump http://localhost:4080
Поддерживаем туннели в поднятом состоянии
Ни для кого не секрет, что связь иногда обрывается, туннели при этом будут отваливаться по таймауту.
Чтобы не утруждать себя дополнительным монотонным вбиванием команды на поднятие туннеля и мониторингом этого процесса, автоматизируем его. Смело вводим:
Код: Выделить всё
$ 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
Собственно на этом всё
Замечания от sash-kan'а
По практическому опыту — cron-задания на перезапуск абсолютно недостаточно.
Разве что соединение абсолютно стабильно. В реальной жизни встречается в 0% случаев.
Даже соединённые напрямую кабелем две сетевые карты легко могут потерять n-ное количество пакетов и tcp-соединение «упадёт».
Клиент и сервер будут пребывать в святой уверенности, что всё в порядке, просто вторая сторона ничего не передаёт.
Нужен keepalive.
Примерно так:
Код: Выделить всё
TCPKeepAlive yes
ServerAliveInterval 300
ServerAliveCountMax 3
Добавлять их надо либо в /etc/ssh_config, либо в ~/.ssh/config, либо прямо в команде через опцию -o.
В принципе, судя по man ssh_config, первую из опций можно и опустить. но, на всякий случай, пусть будет.
-
- Сообщения: 365
- Статус: RAP22-RIPE
- ОС: Debian GNU/Linux Wheezy
Re: FAQ aka Оглавление. обновляется.
Собственно, как "вылечить" чтобы курсор отображался при включённой опции отображения табуляции и пробелов (отображается как "<------>" и "....") я не нашёл, но вот как отключить это отображение - рецепт смотрим ниже:
Код: Выделить всё
$ 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".