MikroTik (GNS3) guest VM with VirtualBox

С две думи – Как да добавя MikroTik рутер в GNS3.

Новия GNS3 идва с възможността да работи с външни софтуери за виртуализация. (Преди се разчиташе само на QEMU. За съжаление обаче QEMU под Windows е доста крива работа. Затова вече в GNS3 могат да се стартират виртуални машини емулирани с VirtualPC, VMWare Player или VirtualBox)

Инсталацията на микротик-а става по познатия начин, създаваме виртуална машина, диск и инсталираме. Default юзера е admin, в полето password не се въвежда нищо. (Това важи и за cli/tty конзолата)

  1. Създаване на виртуалната машина. (click)
  2. Създаване на виртуален диск. (click)
  3. Зареждане на ISO файла. (click)
  4. Осигуряване на мрежова свързаност. (може и Host-Only Adapter, (click))
  5. Инсталиране на самия RouterOS. (click)
  6. Добавяне на ip address. (click)

В случай, че просто ви мързи/не ви се занимава/не разбирате можете да си свалите директно .ova файла с вече инсталирания MikroTik. Има и други Linux дистрибуции. Директно ги import-вате във VirtualBox, настройките за Serial Console са направени. (click)

Ако всичко в по-горните стъпки мине успешно, както е на картинките може да преминете към свързване на рутера през Winbox софтуера. Това става като в полето ip address въветете адреса който по-рано сложихте на интерефейса. (click)

Влиза се с юзер admin, в полето password не се въвежда нищо. Махнете също и отметката за secure login, неясно защо това не работи при виртуални рутери. Логнете се и би трябвало да видите това, то ви разяснява, че в момента сте без лиценз и вашият рутер ще бъде активен само 24 часа. За да махнете това ограничение можете да си поискате demo ключ (който също е free) от сайта на MikroTik. Как да стане това вижте тук.

След като сте поискали нов ключ и го виждате в сайта на микротик, можете да го apply-нете. Това става като директно го paste-нете в конзолата. (click) Следва да добавим Serial Console поддръжката за MikroTik-a. В противен случай няма да ви работи конзолата в GNS3. Това може да стане като след като сте се логнали в Winbox изберете от полето system/console и добавете serial0. (click)

Време е да дефинираме template в GNS3 и да направим няколко спефицични настройки. След като сте стартирали GNS3 като администратор (нужно е за да може да вижда интерфейсите на машината) избираме New appliance template, VirtualBox, избирам името на машината (в моя случай Mikrotik) и избирам Use as linked base image. Последното ще прави снапшот всеки път когато изберете да ползвате виртуалката в някой проект. Прави снапшот и в него пази промените. Идеята е, че всеки път като стартирате проект ще искате да почвате с чиста конфигурация.

Ето и две снимки на самия template. (click|click) И вече можем да ползваме MikroTik в GNS3 виртуалната среда. (click|click)

unprivileged LXC containers

Защо LXC се смята за несигурно?

Защото въпреки разделянето на т.н. namespaces UID=0 в контейнера е UID=0 в host машината. Т.е. ако някой успее да получи достъп до host машината през /proc, /sys или произволни syscall’s потенциално е възможно да “излезе” от контейнера и да стане root на хост машината.

Тук се намесват user namespaces. В годините доста пачове бяха написани за подобряването на функционалността на въпросните user namespaces и след версия 3.12 на ядрото вече е напълно възможно да се стартира LXC контейнер като обикновен потребител.

Как точно работят тези user namespaces? Към всеки потребител който има право да ги ползва се добавя диапазон от неизползвани UID/GID на системата.
Те могат да се използват със стандартни инструменти като newuidmap/newgidmap с помоща на които могат да се map-нат неизползваните UID/GID към виртуални такива в user namespaces.

Можете да създадете контейнер със следната конфигурация:

lxc.id_map = u 0 100000 65536
lxc.id_map = g 0 100000 65536

Което ще map-не UID/GID от 0 до 65536 на контейнера към 100000 до 165536 на хост машината. T.e. UID 100000 на хост машината ще бъде root в LXC контейнера.

За да е възможно това трябва да се конфигурира изрично позволение на потребителя.

/etc/subgid:stgraber:100000:65536
/etc/subuid:stgraber:100000:65536

В случая името на потребителя е stgraber.

LXC вече разполага и с всички конфигурации в стандарните пътища на обикновения потребител:

/etc/lxc/lxc.conf => ~/.config/lxc/lxc.conf
/etc/lxc/default.conf => ~/.config/lxc/default.conf
/var/lib/lxc => ~/.local/share/lxc
/var/lib/lxcsnaps => ~/.local/share/lxcsnaps
/var/cache/lxc => ~/.cache/lxc

При unpriviliged containers се среща проблем със създаването на мрежовия интерефейс, а именно само root потребителя може да създава/премахва или преконфигурира мрежовите интерфейси.

Тук на помощ идва инструмента нарече lxc-user-nic който е с вдигнат SETUID бит.
Той парсва конфигурационния файл на LXC контейнера, създава мрежов интерфейс и bridge и ги свързва.

За да се избегне некокретно отношение от страна на някои потребители, системния администратор разрешава определен юзер колко максимум устройства може да създаде. Това се указва в по-долния файл /etc/lxc/lxc-usernet:

stgraber veth lxcbr0 10

Което значи, че потребител stgraber ще може да създава максиум 10 мрежови интерефейса които могат да бъдат добавени към lxcbr0.

Ето и няколко предварителни изисквания които трябва да спазите преди да стартирате вашия unpriviliged container:

  • Kernel: 3.13+
  • User namespaces (поддръжка в ядрото)
  • Версия на shadow която поддържа subuid/subgid
  • Per-user cgroups на всички controllers
  • LXC 1.0 beta2 или по-висока
  • Версия на PAM с поддръжка на loginuid

Няколко ограничения с които можете да се сблъскате в unpriviliged containers:

  • Няма да можете да ползвате mknod или да създавате block/character устройтва които да достъпват host машината.
  • Няма да можете да ползвате loop монтиране или да монтирате ext дял, дори и когато можете да достъпите блоковото устройство.

Bacula FD (file daemon) module for puppet (EASY WAY)

Разгледах всички възможни bacula -> puppet модули. За съжаление нито един от тях не работеше както трябва, а някои въобще не работеха. Явно са писани за някакви по-стари версии на puppet.

Реших да “напиша” мой модул за File Daemon-a.

root@puppetmaster:/etc/puppet/environments/production/manifests# puppet module list
/etc/puppet/environments/production/modules
├── bacula (???)
├── nanliu-staging (v1.0.3)
├── preseed (???)
├── puppetlabs-inifile (v1.4.1)
├── puppetlabs-mysql (v3.6.0)
├── puppetlabs-sqlite (v0.0.1)
└── puppetlabs-stdlib (v4.8.0)
/etc/puppet/modules (no modules installed)
/usr/share/puppet/modules (no modules installed)
root@puppetmaster:/etc/puppet/environments/production/manifests#

Кръстил съм модула bacula, първия от горе надолу.
В /etc/puppet/environments/production/modules/bacula/manifests имам само init.pp

# Bacula File Daemon

class bacula::client {
  package { 'bacula-fd':
     ensure => installed,
  }
  file { '/etc/bacula/bacula-fd.conf':
    ensure  => file,
    content => template('bacula/client.erb'),
  }
  service { 'bacula-fd':
    ensure    => running,
    enable    => true,
  }
}

Така написания init.pp се грижи да инсталира bacula-fd пакета, да създаде файл /etc/bacula/bacula-fd.conf със съдържанието на client.erb темплейта и да пусне съответния service.

Ето и самия темплейт client.erb

root@puppetmaster:/etc/puppet/environments/production/modules/bacula/templates# cat client.erb
### MANAGED BY PUPPET ###

Director {
  Name = <%= @director_name %>
  Password = <%= @director_password %>
}

FileDaemon {
  Name = <%= @fqdn %>
  FDport = 9102
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /var/run/bacula
  Maximum Concurrent Jobs = 20
  FDAddress = <%= @ipaddress_eth0 %>
}

Messages {
  Name = Standard
  director = <%= @director_name %> = all, !skipped, !restored
}

root@puppetmaster:/etc/puppet/environments/production/modules/bacula/templates#

От тук само остава да извикам съответния модул в node манифеста

root@puppetmaster:/etc/puppet/environments/production/manifests# cat puppetclient.lab.local.pp
node 'puppetclient.lab.local' {

# Setup Bacula Client Daemon

$director_password = 'mySecretPassword'
$director_name = 'director.lab.local'
include bacula::client
}
root@puppetmaster:/etc/puppet/environments/production/manifests#

Променете director_password и director_name спрямо вашия случай.

Per user environments with .profile on CentOS

Не знам защо, но CentOS не чете съдържанието на .profile файла намиращ се в home директорията на потребителите.
При Debian базирани дистрибуции това не е така.

Ползвам puppet за да разпостранявам съдържанието на .profile на всичките си машини. При Debian и Ubuntu съдържанието се прочита, добавят се alias-и и т.н.
/etc/profile е system wide файл който не може да се променя от обикновения потребител, за целта се използват тези .profile файлове които променят environment спрямо конкретния юзер.
Apache също имат подобна практика, с помоща на .htaccess директно в директорията могат да се правят per directory settings.

Отворете /etc/profile и накрая на файла добавете следните редове:

# Read user .profile to set per user environments
if [ -f $HOME/.profile ]; then
. $HOME/.profile
fi

Това е от мен ;-)

(GNS3) qemu vm fail with cable connected

Инсталирах си новата версия на GNS3 с идеята да си тествам разни неща.
Имам два Linux-а емулирани с QEMU и една ASA 8.0(2). Понеже ASA-та е доста стара и си мислех, че просто има проблем с новия GNS3, освен това се вижда, че когато тръгнеш да създаваш ASA профил, се поддържа само 8.4.2

По подразбиране QEMU VM configuration се ползва:

C:\Program Files\GNS3\qemu-0.13.0\qemu.exe

което на моята машина (Windows 7 Enterprise x64) не работи в момента в който свържа кабела към който и да е от интерфейсите.
Опитах да сложа и други мрежови карти, ефекта е същия.

Във форума на gns3 попаднах на подобно питане и реших да видя дали проблема не е в QEMU-то, там хората говореха за други версии, за патчове и т.н.
Влязах в настройките и смених QEMU изпълнимия файл на:

C:\Program Files\GNS3\qemu-2.1.0\qemu-system-x86_64w.exe

и всичко тръгна без проблем.

Лошото е, че оправих проблема с налучкване и както винаги при Windows нещата стават много непрозрачно за крайния потребител и никъде не можах да видя логове, конкретна грещка или нещо което би ме насочило.

Надявам се да съм бил полезен.

VIM basic usage

Movement:

  • shift + h (go to the top of screen)
  • shift + m (go to the middle of screen)
  • shift + l (go to the end of screen)
  • gg (go to the top of document)
  • shift + g (go to the end of document)
  • ctrl + f (go forward, to next page/screen)
  • ctrl + b (go backward, to previous page/screen)
  • w (move forward to the beginning of a word)
  • shift + w (move forward to next word)
  • b (move backward to the beginning of a word)
  • shift + b (move backward to next word)
  • 0 (zero, move to the beginning of the line)
  • $ (move to the end of line)

Cut/Copy/Paste

  • x (cut current character/delete to the right from the cursor)
  • X (cut current character/delete to the left from the cursor)
  • xw (cut next word/delete next word)
  • y (copy current character)
  • yy (copy the whole line when cursor is at the beginning of the line)
  • yw (copy the word after the cursor)
  • pp (paste the whole line at bottom of the cursor)
  • shift + pp (paste the whole line at the top of the cursor)

Insert/Replace/Delete

  • i (insert before the cursor)
  • shift + i (insert at the beginning of the line)
  • a (insert after the cursor)
  • shift + a (append at the end of the line)
  • o – (open blank line below current line)
  • O – (open blank line above current line)
  • cw (replace word at the beginning of the cursor)
  • c$ (change the whole line)
  • cc (change the whole line)
  • shift + c (change the whole line)
  • s (delete character at cursor and substitute text)
  • S (delete line at cursor and substitute text)
  • r (replace single character)
  • rw (replace next word)
  • shift + r (go to the replace mode, write what you want and press esc key)
  • u (undo)
  • shift + u (undo whole line, only when cursor is not moved to another line)
  • dw (delete next word)
  • dd (delete whole line)
  • d + up key (delete the current line & line at the top)
  • d + down key (delete the current line & line at the bottom)
  • > (move text to right)
  • < (move text to left)
  • ~ (switch case, uppercase/lowercase)

Marking (Visual mode)

  • v (start the visual mode)
  • shift + v (start linewise visual mode)
  • ctrl + v (start visual block mode)
  • aw (mark a word, after entering in visual mode)
  • esc (exit vistual mode)

Search & Substitute

  • /pattern (search for pattern, regexp)
  • ?pattern (search backward for pattern, regexp)
  • n (repeat search in same direction)
  • shift + n (repeat search in opposite direction)
  • :%s/old/new/g (replace all old with new throughout file)
  • :%s/old/new/gc (replace all old with new throughout file with confirmations)

Working with multiple files

  • :e filename (edit a file in a new buffer)
  • :bn (go to next buffer)
  • :bp (go to previous buffer)
  • :bd (delete a buffer/close a file)
  • :sp filename (open a file in a new buffer and split window)
  • ctrl + ws (split windows)
  • ctrl + ww (switch between windows)
  • ctrl + wq (quit a window)
  • ctrl + wv (split windows vertically)

External commands

  • :!uptime (show uptime of the machine)
  • :sh (start interactive shell, type exit to return vi)
  • :r! filename (insert the output from external command into a file, immediately after the cursor)
  • :!bash myScript.sh (run myScript.sh, press enter to return in vi)

 

How to find the process start time

При стандартния ps ax се вижда само процесорното време. Реално аз искам да разбера колко време работи (кога точно е стартиран този процес) а не колко процесорно време е израходил.

root@filesrv:/proc# ps ax |grep -E 'xz$'
 7798 pts/1    R+   1453:09 xz
root@filesrv:/proc#

Сещам се за два начина, първия е като видя кога е създадена директорията с PID в /proc:

root@filesrv:/proc# ls -la |grep 7798
dr-xr-xr-x   9 root       root                     0 Jan 14 15:05 7798
root@filesrv:/proc#

А втория начин е с custom ps синтакс:

root@filesrv:/proc# ps -eo pid,lstart,cmd |grep 7798
 7798 Wed Jan 14 15:04:18 2015 xz
32443 Thu Jan 15 15:16:06 2015 grep --color=auto 7798
root@filesrv:/proc#

И в двата случая се вижда 14 Jan 15:05.

Restrict VPN users with per user access-list with Cisco ASA

Вероятно има не един начин да бъде направено това, но аз ще се спра на възможно най-лесният такъв. Става дума за user attributes и по-конкретно vpn-filter.
За целта, предварително дефинирам access-list-a с която match-вам интересният за мен трафик след което я apply-вам в user attributes.

hellhound(config)# access-list Deny_KpuCko_to_WebServer extended deny ip any host 192.168.0.5
hellhound(config)# access-list Deny_KpuCko_to_WebServer line 2 extended permit ip any any
hellhound(config)#
hellhound(config)# show running-config access-list Deny_KpuCko_to_WebServer
access-list Deny_KpuCko_to_WebServer extended deny ip any host 192.168.0.5
access-list Deny_KpuCko_to_WebServer extended permit ip any any
hellhound(config)#

След като създадох access-list следва да я добавя към user attributes.

hellhound(config)# username KpuCko attributes
hellhound(config-username)# vpn-filter value Deny_KpuCko_to_WebServer
hellhound(config-username)#

За да влезе в сила тази промяна трябва да си reconnect VPN сесията.

C:\>ping archon.home.lan

Pinging archon.home.lan [192.168.0.5] with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 192.168.0.5:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

C:\>ping muttley.home.lan

Pinging muttley.home.lan [192.168.0.7] with 32 bytes of data:
Reply from 192.168.0.7: bytes=32 time=3ms TTL=64
Reply from 192.168.0.7: bytes=32 time=3ms TTL=64
Reply from 192.168.0.7: bytes=32 time=3ms TTL=64
Reply from 192.168.0.7: bytes=32 time=3ms TTL=64

Ping statistics for 192.168.0.7:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 3ms, Maximum = 3ms, Average = 3ms

C:\>

VIM multiple file editing

Много хора избягват vi защото е сложен. Да сложен е.
Създавам два файла за тестови цели.

root@nighthawk:~# echo file1 > file1
root@nighthawk:~# echo file2 > file2
root@nighthawk:~# cat file1
file1
root@nighthawk:~# cat file2
file2
root@nighthawk:~#

Сега мога едновременно да отворя и двата файла за преглед или редакция.
Това може да стане така.

root@nighthawk:~# vi file1 file2
2 files to edit
file1

Интересно е, че единственото което виждам на екрана в момента е съдържанието от file1.
Можете да се убедите в това тук.

С изпълнение на клавишна комбинация “ESC + :” и напишем ls ще видим, че реално отворени са два файла.
Можете да се убедите в това тук.

От тук ситуацията е проста с напишете “:” и ако искате да продължите да редактирате file1 напишете “b1”, ако искате да редактирате другият файл напишете “b2” и т.н. като 2,3,4,5,6,7 e индекса с който vim ви изкарва отворените файлове.
Принципно можете да прехвърляте различните файлове с “:b пълният-път-до-файла”

Обърнете внимание, че ако правите промени в някои от файловете vim няма да ви даде да видите другият файл преди да сте решили какво да направите с промените – да ги запишете или да ги откажете.
Клавишна комбинация от “ESC + x” или “ESC + w!” ще запази направените промени и ще ви върне в bash shell-a. (Това ще затвори и двата файла)

Ако искате пък да виждате двата файла едновременно, можете да “разцепите” екрана на vim хоризонтално или вертикално.
Това става с клавишна комбинация “ESC + W v” – вертикално и “ESC + W s” – хоризонтално.

В момента на “разцепване” на екрана ще виждате и на двата екрана един и същ файл, прехвърлянето между екраните става с комбинация “ESC + W w” или “ESC + W стрелка нагоре/надолу/наляво/надясно”.
Ако искате в долната част да видите file2 трябва да отидете в долният екран (с някоя от изброените по-горе комбинации) и след това с “ESC + :” напишете “ls” и след това с “b2” да изберете индекса на file2.
Можете да разцепвате вече разцепен екран на други такива по-малки, не знам колко е ограничението.

Сега вече ако реша, че не искам вече да работя с file2 и изляза с “ESC + q!” vim ще махне разделянето на екрана и ще виждам вече само file1, но няма да изляза изцяло от vim.

Същият сценарии ще покажа и при варианта за работа с tab-ове.

Просто отварям vi без аргументи, след което с клавишна комбинация “ESC + :” изписвам tabnew file1, което ще ми отвори за работа първият файл.
Правя същото за file2 след което с комбинация “gt” прехвърлям между tab-овете.

User2 homedir part of user1 homedir

Целта на упражнението е да се направят два потребителя с достъп за писане в домашните си директории (като разбира се бъдат chroot-нати в тях) и ако user1 иска да покаже нещо на user2 да има права да създва и трие файлове от home директорията на user2.
Т.е. user1 има права за да създава и трие файлове и директории в домашната си директория, също така може да създва и трие файлове и директории в домашната директоиря на user2. User2 от своя страна има права само да създава и изтрива файлове и директории само в собствената си директория, без значение дали файловете или директори са негова собственост или собственост на user1.

root@ftp:~# grep user /etc/passwd
user1:x:1002:1002::/home/proftpd/user1:/bin/false
user2:x:1003:1003::/home/proftpd/user1/user2:/bin/false
root@ftp:~#

Така ако user1 иска да скрие някакви файлове и директории от user2 той може да си ги сложи в домашната директория (защото user2 е chroot-нат в /home/proftpd/user1/user2), т.е. той вижда тази директория като / и не може да се качи по-нагоре в дървовидната структура.

Важно уточнение е тук заигравката с правата, т.е. за да могат двата юзера да четат пишат в директориите ги правя members на групата на другия и след това сетвам подходящата umask.

root@ftp:~# id user1
uid=1002(user1) gid=1002(user1) groups=1002(user1),1003(user2)
root@ftp:~# id user2
uid=1003(user2) gid=1003(user2) groups=1003(user2),1002(user1)
root@ftp:~#

Unix правата изглеждат така:

root@ftp:/home/proftpd# ls -l |grep user1
drwxrwx--- 4 user1 user1 4096 Jul 31 10:53 user1
root@ftp:/home/proftpd#

И домашната директория на user2.

root@ftp:/home/proftpd/user1# ls -l |grep user2
drwxrwx--- 4 user2 user2 4096 Jul 31 10:54 user2
root@ftp:/home/proftpd/user1#

Ето и малко спецификации в самия конфигурационен файл на proftpd.

root@ftp:/home/proftpd/user1# tail -n6 /etc/proftpd/proftpd.conf
<Directory /home/proftpd/user1>
Umask 007 007
<Limit ALL>
AllowUser user1
</Limit>
</Directory>

root@ftp:/home/proftpd/user1#

Тук общо взето указвам маската…
Разгледайте по-долу тестовете тъй като не ми се обяснява отново всичко кое от къде идва, пък и съм оставил коментари.

root@ftp:~# ftp 127.0.0.1
Connected to 127.0.0.1.
220 ProFTPD 1.3.4a Server (ftp.mydomain.local) [127.0.0.1]
Name (127.0.0.1:root): user1
331 Password required for user1
Password:
230 User user1 logged in -> user1 sucessfully logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -la
200 PORT command successful
150 Opening ASCII mode data connection for file list
drwxrwx--- 3 user1 user1 4096 Jul 31 07:51 .
drwxrwx--- 3 user1 user1 4096 Jul 31 07:51 ..
-rw-r--r-- 1 user1 user1 220 Apr 19 2010 .bash_logout
-rw-r--r-- 1 user1 user1 3486 Mar 28 2013 .bashrc
-rw-r--r-- 1 user1 user1 675 Apr 19 2010 .profile
drwxrwx--- 2 user2 user2 4096 Jul 31 07:52 user2 -> user2 home directory is placed in user1 home directory.
226 Transfer complete
ftp> mkdir SHPEK -> user1 successfully created directory SHPEK.
257 "/SHPEK" - Directory successfully created
ftp> pwd
257 "/" is the current directory
ftp> cd user2 -> user1 successfully opened user2 home directory.
250 CWD command successful
ftp> ls -la
200 PORT command successful
150 Opening ASCII mode data connection for file list
drwxrwx--- 2 user2 user2 4096 Jul 31 07:52 .
drwxrwx--- 4 user1 user1 4096 Jul 31 07:53 ..
226 Transfer complete
ftp> mkdir SALAM -> user1 successfully created directory SALAM in user2 home directory.
257 "/user2/SALAM" - Directory successfully created
ftp> ls -la
200 PORT command successful
150 Opening ASCII mode data connection for file list
drwxrwx--- 3 user2 user2 4096 Jul 31 07:54 .
drwxrwx--- 4 user1 user1 4096 Jul 31 07:53 ..
drwxrwx--- 2 user1 user1 4096 Jul 31 07:54 SALAM
226 Transfer complete
ftp> exit
221 Goodbye.
root@ftp:~# ftp 127.0.0.1
Connected to 127.0.0.1.
220 ProFTPD 1.3.4a Server (ftp.mydomain.local) [127.0.0.1]
Name (127.0.0.1:root): user2
331 Password required for user2
Password:
230 User user2 logged in -> user2 sucessfully logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/" is the current directory -> user2 can't see user1 home directory. Directort SHPEK is not listed.
ftp> ls -la
200 PORT command successful
150 Opening ASCII mode data connection for file list
drwxrwx--- 3 user2 user2 4096 Jul 31 07:54 .
drwxrwx--- 3 user2 user2 4096 Jul 31 07:54 ..
drwxrwx--- 2 user1 user1 4096 Jul 31 07:54 SALAM
226 Transfer complete
ftp> mkdir PLESKAVICA -> user2 created directory PLESKAVICA in his home directory.
257 "/PLESKAVICA" - Directory successfully created
ftp> cd SALAM
250 CWD command successful -> user2 is able to open directory previously created by user1.
ftp> mkdir TARATOR
257 "/SALAM/TARATOR" - Directory successfully created -> user2 is able to create new directory in directory previously created by user1.
ftp> ls -la
200 PORT command successful
150 Opening ASCII mode data connection for file list
drwxrwx--- 3 user1 user1 4096 Jul 31 07:55 .
drwxrwx--- 4 user2 user2 4096 Jul 31 07:54 ..
drwxrwx--- 2 user2 user2 4096 Jul 31 07:55 TARATOR
226 Transfer complete
ftp> pwd
257 "/SALAM" is the current directory
ftp> cd ..
250 CWD command successful
ftp> ls -l
200 PORT command successful
150 Opening ASCII mode data connection for file list
drwxrwx--- 2 user2 user2 4096 Jul 31 07:54 PLESKAVICA
drwxrwx--- 3 user1 user1 4096 Jul 31 07:55 SALAM
226 Transfer complete
ftp> cd PLESKAVICA
250 CWD command successful
ftp> mkdir PASTET
257 "/PLESKAVICA/PASTET" - Directory successfully created
ftp> ls -la
200 PORT command successful
150 Opening ASCII mode data connection for file list
drwxrwx--- 3 user2 user2 4096 Jul 31 07:56 .
drwxrwx--- 4 user2 user2 4096 Jul 31 07:54 ..
drwxrwx--- 2 user2 user2 4096 Jul 31 07:56 PASTET
226 Transfer complete
ftp> exit
221 Goodbye.
root@ftp:~# ftp 127.0.0.1
Connected to 127.0.0.1.
220 ProFTPD 1.3.4a Server (ftp.mydomain.local) [127.0.0.1]
Name (127.0.0.1:root): user1
331 Password required for user1
Password:
230 User user1 logged in -> user1 sucessfully logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd user2
250 CWD command successful
ftp> ls -la
200 PORT command successful
150 Opening ASCII mode data connection for file list
drwxrwx--- 4 user2 user2 4096 Jul 31 07:54 .
drwxrwx--- 4 user1 user1 4096 Jul 31 07:53 ..
drwxrwx--- 3 user2 user2 4096 Jul 31 07:56 PLESKAVICA
drwxrwx--- 3 user1 user1 4096 Jul 31 07:55 SALAM
226 Transfer complete
ftp> cd PLESKAVICA
250 CWD command successful
ftp> ls -la
200 PORT command successful
150 Opening ASCII mode data connection for file list
drwxrwx--- 3 user2 user2 4096 Jul 31 07:56 .
drwxrwx--- 4 user2 user2 4096 Jul 31 07:54 ..
drwxrwx--- 2 user2 user2 4096 Jul 31 07:56 PASTET
226 Transfer complete
ftp> mkdir BANICA
257 "/user2/PLESKAVICA/BANICA" - Directory successfully created -> user1 sucessfully created directory BANICA in user2 previously created directory PLESKAVICA.
ftp> ls -la
200 PORT command successful
150 Opening ASCII mode data connection for file list
drwxrwx--- 4 user2 user2 4096 Jul 31 07:57 .
drwxrwx--- 4 user2 user2 4096 Jul 31 07:54 ..
drwxrwx--- 2 user1 user1 4096 Jul 31 07:57 BANICA
drwxrwx--- 2 user2 user2 4096 Jul 31 07:56 PASTET
226 Transfer complete
ftp> exit
221 Goodbye.
root@ftp:~#