LINUX.ORG.RU

21й порт

 , ,


0

0

пишу код на c++ необходимо написать простейший ftp сервер

serv->listen(QHostAddress::LocalHost,21) - не запускает сервер с правами обычного пользователя

что нужно сделать что бы получить доступ к 21му порту с правами обычного пользователя?



Последнее исправление: ymn (всего исправлений: 2)

Ответ на: комментарий от Sonsee

он запускается только под рутом..неудобно каждый раз лезть в консоль

redpunk
() автор топика

ничего нельзя сделать. порты до 1024 - привилегированные - только рут их может слушать. правда, адекватные программы сбрасывают привилегии после того, как сделают сокет.

hatefu1_dead
()

Идея навскидку:

iptables -t nat -A PREROUTING -p tcp --dport 21 -j REDIRECT --to-ports 2121

Еще вариант - запускать программу через sudo, предварительно настроив /etc/sudoers.

observer ★★★
()

man capabilities

а именно cap_net_bind_service

beka
()

Так как у меня не создаются новые темы, задам вопрос в этой теме.

Вопрос-1.
Я написал простой FTP-сервер на СИ.
Есть два режима создания дата-канала:
1. Пассивный - сервер выдает ip-port, клиент коннектится;
2. Активный - клиент выдает ip-port, сервер коннектится;

В активном режиме, если коннект идет не с 20-го порта, то почему-то
не работает ни встроенный UNIX-клиент, ни тотал-командер.
При работе на высоких портах, например 4020 и 4021, работает.

Для работы на 20, 21 портах применил такую схему:
Сервер запускаю под root-ом.
Мастер-процесс и пул рабочих процессов всегда работают под root-ом.
Дата-канал на 20-ом порте создает рабочий процесс.
Обработку всех команд, требующих создания дата-канала и не требующих,
делает дополнительный fork-процесс с дерутизацией (контроль прав user-ов
возложен на систему). На каждую команду новый fork, а для команд смены
директории пришлось написать специальную СИ-функцию-перминатор.

Можно ли при запуске сервера как-то застолбить 20-ый порт, чтоб потом
из не root-процессов через него коннектиться?
Тогда бы при подключении клиента сразу дерутизировать рабочий процесс
на user-а и обойтось без дополнительных fork-ов.

Вопрос-2.
У процесса есть список групп «текущего» пользователя.
Я умею опустошать этот список, но не умею менять его. Даже не менять,
а как из root-процесса узнать, что туда вписать?
Если я просто опустошаю этот список, то от этого возможности доступа
увеличиваются, или уменьшаются?
Вот функция:

//---------------- deroot_ftp ----------------------------

int deroot_ftp(struct ftp *ftp)
{
    int k;
    uid_t  uid;
    gid_t  gr_list[2];

    if(ftp->user[0]==0) return(-1);
    uid=getuid();
    if(uid == 0){

        //--- "дерутизация" ---

        //--- группа ---
        k=setgroups(0, gr_list);
        if(k<0) return(-1);

        k=setgid(ftp->gid);
        if(k<0) return(-1);

        //--- пользователь ---
        k=setuid(ftp->uid);
        if(k<0) return(-1);
    }
    else{
        if(ftp->uid != uid) return(-1);
    }
    return(0);
}
oleg_2
()
Ответ на: комментарий от beastie

«слушать на них можно только от root'а.»

Не правда.
Биндить (bind) под root-ом.
А слушать под user-ом.
HTTP-сервер на 80-ом порту так и работает.

oleg_2
()
Ответ на: комментарий от oleg_2

О списке групп пользователя.
Я читал о группах, но не понял. Особенно важно, чтоб с опустошенным списком
не повысился доступ, а если понизится так не страшно.

oleg_2
()
Ответ на: комментарий от beastie

setresgid
setresuid
Эти прочитал, но надо получше разобраться и поэксперементировать для закрепления.

Но всё же вопрос о том, как правильно сделать «дерутизацию».
Когда пользователь состоит в нескольких группах, то на что это влияет?
Я читал о списке групп пользователя. Пробовал переключаться на другую группу
в ручном режиме. А вот для чего процессу, СИ-программе, нужен этот список - не понял.
Или бы пример, когда к файлу можно добраться со списком, но нельзя без списка, или
наоборот. И не вручную, а в программе.
Или так спросить: функция, которую я привел, не позволит ли плохому пользователю
добираться туда, куда не следует. Это не только для FTP, но и в других случаях.

oleg_2
()
Ответ на: комментарий от oleg_2

Я наверно сейчас спать пойду, засиделся.
Спасибо за ответы, не ожидал в этот час.

oleg_2
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.