FAQ aka Оглавление. обновляется.

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модератор: SLEDopit

Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

FAQ aka Оглавление. обновляется.

Сообщение KiWi »

Спасибо сказали:

Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: FAQ aka Оглавление. обновляется.

Сообщение KiWi »

Как пробросить ssh-соединение на внутренний IP-адрес?

Самым правильным и безопасным решением будет перенаправление соединений на внутренний IP-адрес при помощи iptables:

Код: Выделить всё

# iptables -t nat -A PREROUTING -i <ВНЕШНИЙ_ИНТЕРФЕЙС> -p tcp --dport 12322 -j DNAT --to-destination <ВНУТРЕННИЙ_ХОСТ>:22


Обсуждение:
Решено:"транзитный" пользователь
Спасибо сказали:

Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: FAQ aka Оглавление. обновляется.

Сообщение KiWi »

Как использовать аутентификация по ключам в ssh?
Как использовать ssh в скриптах?

Используйте аутентификацию по ключам.
Для этого в настройках sshd должна быть разрешена аутентификация по ключам:

Код: Выделить всё

PubkeyAuthentication yes

(по умолчанию -- она разрешена)
Далее создаёте ключи:

Код: Выделить всё

$ ssh-keygen

Содержимое ~/.ssh/id_rsa.pub добавляете в ~/.ssh/authorized_keys сервера.

В скриптах запускайте:

Код: Выделить всё

$ ssh -T


Обсуждение:
Решено: ssh соединение из script.sh
Спасибо сказали:

Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: FAQ aka Оглавление. обновляется.

Сообщение KiWi »

iptables тормозит при просмотре правил. Что делать?

Скорее всего, этого происходит из-за того, что iptables пытается резолвить и выводить имена хостов, сетей или сервисов. Используйте -n, чтобы всё выводилось в численном формате:

Код: Выделить всё

# iptables -n -L


Обсуждение:
iptables тормозит
Спасибо сказали:

Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: FAQ aka Оглавление. обновляется.

Сообщение KiWi »

Я забыл пароль root'а. Как мне его изменить на новый?

При загрузке в строке kernel(загрузчик -- GRUB) добавляете:

Код: Выделить всё

init=/bin/sh

После загрузки меняете пароль на новый при помощи passwd и перезагружаетесь.

Обсуждение:
еще раз о забытом пароле root-а
Спасибо сказали:

Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: FAQ aka Оглавление. обновляется.

Сообщение KiWi »

Как изменить размер раздела?

Ни один из способов не гарантирует сохранности данных -- делайте резервные копии

Вы можете сделать это при помощи gparted.
Поддерживаемые gparted файловые системы на данный момент:
ext2, ext3 – ограничение: нельзя перемещать начало раздела
fat16, fat32
hfs, hfs+, hfsx – ограничение: нельзя перемещать начало раздела, а также изменять размер можно только в сторону уменьшения
linux-swap
reiserfs (только с установленной libreiserfs)
Взято с: http://www.gnu.org/software/parted/manual/parted.html#resize

Обсуждение:
Увеличение размера linux разделов
Спасибо сказали:

Аватара пользователя
Olden Gremlin
Сообщения: 365
Статус: RAP22-RIPE
ОС: Debian GNU/Linux Wheezy

Re: FAQ aka Оглавление. обновляется.

Сообщение Olden Gremlin »

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

Вместо предисловия.
Задача, для простых конфигураций, состоит из двух этапов решения.
В качестве препроцессора для формирования 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 можно/нужно рисовать свои условия - они индивидуальны для каждого.
Этот пример носят лишь характер "для справки" и способствуют систематизации некоторых знаний :)
«Когда у общества нет цветовой дифференциации штанов — то нет цели!»
nic-hdl: RAP22-RIPE
Спасибо сказали:

Аватара пользователя
Olden Gremlin
Сообщения: 365
Статус: RAP22-RIPE
ОС: Debian GNU/Linux Wheezy

Re: FAQ aka Оглавление. обновляется.

Сообщение Olden Gremlin »

Задействуем функционал QoS.

Если оборудование в Вашей сети поддерживает функционал 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 │
└────┴────┴────┴────┴────┴────┴─────┴─────┘
DiffServ Field

Код: Выделить всё

┌────┬────┬────┬────┬────┬────┬─────┬─────┐
│ 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
«Когда у общества нет цветовой дифференциации штанов — то нет цели!»
nic-hdl: RAP22-RIPE
Спасибо сказали:

Аватара пользователя
Olden Gremlin
Сообщения: 365
Статус: RAP22-RIPE
ОС: Debian GNU/Linux Wheezy

Re: FAQ aka Оглавление. обновляется.

Сообщение Olden Gremlin »

(10.03.2009)
Организация 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: <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
И наблюдаем 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 и т.д. Маршрутизировать трафик через них, настраивать правила фильтрации и т.д. и т.п. Полёт мысли ограничивается лишь фантазией ;) Однако не забываем, что туннель всё-таки построен на третьем уровне поэтому маркирование пакетов 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


Вот теперь, наверное, действительно всё! :)
«Когда у общества нет цветовой дифференциации штанов — то нет цели!»
nic-hdl: RAP22-RIPE
Спасибо сказали:

Аватара пользователя
Olden Gremlin
Сообщения: 365
Статус: RAP22-RIPE
ОС: Debian GNU/Linux Wheezy

Re: FAQ aka Оглавление. обновляется.

Сообщение Olden Gremlin »

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

Собственно на этом всё :)


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

Код: Выделить всё

TCPKeepAlive yes
ServerAliveInterval 300
ServerAliveCountMax 3
Интервал и счётчик — по вкусу.
Добавлять их надо либо в /etc/ssh_config, либо в ~/.ssh/config, либо прямо в команде через опцию -o.
В принципе, судя по man ssh_config, первую из опций можно и опустить. но, на всякий случай, пусть будет.
«Когда у общества нет цветовой дифференциации штанов — то нет цели!»
nic-hdl: RAP22-RIPE
Спасибо сказали:

Аватара пользователя
Olden Gremlin
Сообщения: 365
Статус: RAP22-RIPE
ОС: Debian GNU/Linux Wheezy

Re: FAQ aka Оглавление. обновляется.

Сообщение Olden Gremlin »

Курсор в 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".
«Когда у общества нет цветовой дифференциации штанов — то нет цели!»
nic-hdl: RAP22-RIPE
Спасибо сказали: