LINUX.ORG.RU

выключить/включить Интернет для процесса?


6

4

требуется - для определенного процесса (ессно с его всеми потоками) полностью сымитировать действия «сетевой шнур вынули»/«сетевой шнур воткнули» одной (понятно что двумя - на «вкл/выкл» соотв.) командами в консоли

АПД. варианты с виртуалками/песочницами/прочим не катят, ибо процесс запускается как вполне себе гуевое приложение из ярлыка, работает со своими данными (каталогами) и т.д.

Нельзя вроде. Даже отснифать трафик единичного процесса нельзя, ЕМНИП. Хотя из меня гуру - как из шиндошса пуля.

NeverLoved ★★★★★ ()

вроде как современный iptables [не умеет] это делать (кроме случая когда программа запускается от другого пользователя).

но что тебе мешает например просто не запускать программу, если уж тебе не равится как она работает? :-)

или например ты можешь написать разработчику bugreport — если видишь какаи-то явные недостатки.

user_id_68054 ★★★★★ ()
Последнее исправление: user_id_68054 (всего исправлений: 1)
Ответ на: комментарий от user_id_68054

...или написать в спортлото, да

нет просто смешно какбы
супергибкая система линукс «настрой все-все-все» не может тупо зарубить сеть для процесса
смех и грех

MinasFilm ()

AppArmor умеет закрывать или ограничивать интернет для отдельного процесса.

Но вот менять на лету правила, чтобы имитировать «сетевой кабель воткнули» — увы, нельзя, насколько я знаю. Можно, однако, наворотить что-то такое: дать этому приложению доступ к интернету только через прокси, который, может быть, стоит на том же компьютере, а прокси будет уже открывать и закрывать доступ к сайтам.

proud_anon ★★★★★ ()

- cgroups+namespaces (надо делать до запуска процесса, но на запуск «ярлыком» вполне потянет)

- selinux/tomoyo/smack

- LD_PRELOAD если бинарь не статический

sergej ★★★★★ ()

С помощью unshare ты можешь запустить процесс (и всех его потомков) в отдельном сетевом неймспейсе и издеваться над ним как хочешь. Пример (запускать от рута):

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: em1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 3c:97:0e:bd:a8:0c brd ff:ff:ff:ff:ff:ff
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 52:54:00:dc:a2:22 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 500
    link/ether 52:54:00:dc:a2:22 brd ff:ff:ff:ff:ff:ff
... и далее куча всякой хрени ...

# unshare -n /bin/bash

# ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
... и это всё! девственно чистый сетевой стек, даже lo не настроен =)

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от MinasFilm

супергибкая система линукс «настрой все-все-все» не может тупо зарубить сеть для процесса

Может.

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

супергибкая система линукс «настрой все-все-все» не может тупо зарубить сеть для процесса
смех и грех

прости, но ты же сам себя поставил в эти ограничительные рамки:

варианты с виртуалками/песочницами/прочим не катят, ибо процесс запускается как вполне себе гуевое приложение из ярлыка

:-)

user_id_68054 ★★★★★ ()
Последнее исправление: user_id_68054 (всего исправлений: 1)
Ответ на: комментарий от Deleted

пока не разбирался, но по диагонали так понял - что сети тогда для приложения не будет вообще (в см. не «управляемый» вариант включить-выключить)?

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

пока не разбирался, но по диагонали так понял - что сети тогда для приложения не будет вообще (в см. не «управляемый» вариант включить-выключить)?

Нет. Ты можешь перенести внутрь неймспейса любой существующий интерфейс (ip link set ... netns $PID_ПРОЦЕССА_В_НЕЙМСПЕЙСЕ), в том числе - один интерфейс из пары veth. Да, внутри неймспейса придётся запускать какой-нибудь простенький скрипт, который настроит нужные адреса и маршруты перед запуском твоей программы, но это не сильно сложно. Дальше можно будет снаружи опускать/поднимать второй интерфейс из пары veth и внутри неймспейса у тебя будет пропадать/появляться доступ к сети.

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

когда оно успело там появится?

Не знаю точно. Думаю, что примерно тогда же, когда поддержку этого запилили в ядре. В ubuntu 10.04 и RHEL 6.* уже была утилита unshare.

Deleted ()
Ответ на: комментарий от deep-purple

ВЫКЛЮЧАТОР СКАЙПА!!1

#!/bin/sh

set -e -u -x

TARGET="skype"
TARGET_USER="ivan.mironov"

OUTER_VETH="vethskype0"
SANDBOX_VETH="vethskype1"
OUTER_IP="192.168.42.1"
SANDBOX_IP="192.168.42.2"
PREFIX="30"
INET_INTERFACE="wlp3s0"

die()
{
    echo "${1}" >&2
    exit 1
}

uid=$(( $( id -u ) )) || die "Can't get current UID"
[ $uid -eq 0 ] || die "You are not root!"

if [ $# -eq 0 ]; then
    # Run program inside network sandbox.

    # Create pair of veth interfaces.
    ip link add dev "${OUTER_VETH}" type veth peer name "${SANDBOX_VETH}"
    ip addr add "${OUTER_IP}/${PREFIX}" dev "${OUTER_VETH}"
    ip link set dev "${OUTER_VETH}" down
    ip link set dev "${SANDBOX_VETH}" down

    # Enable forwarding and configure NAT.
    sysctl -w net.ipv4.ip_forward=1
    iptables -t nat -A POSTROUTING -s "${OUTER_IP}/${PREFIX}" -o "${INET_INTERFACE}" -j MASQUERADE
    iptables -t filter -A FORWARD -i "${OUTER_VETH}" -s "${OUTER_IP}/${PREFIX}" -o "${INET_INTERFACE}" -j ACCEPT

    # Run this script again in different network namespace.
    unshare -n "${0}" "inside-sandbox" &
    child_pid=$!
    ip link set dev "${SANDBOX_VETH}" netns "${child_pid}"
    wait "${child_pid}"

    # Disable NAT.
    iptables -t nat -D POSTROUTING -s "${OUTER_IP}/${PREFIX}" -o "${INET_INTERFACE}" -j MASQUERADE || true
    iptables -t filter -D FORWARD -i "${OUTER_VETH}" -s "${OUTER_IP}/${PREFIX}" -o "${INET_INTERFACE}" -j ACCEPT || true

    # Cleanup veth.
    ip link del "${OUTER_VETH}" || true
elif [ "${1}" = "inside-sandbox" ]; then
    # Configure loopback interface.
    ip addr add local "127.0.0.1/8" dev "lo"
    ip addr add local "::1/128" dev "lo"
    ip link set dev "lo" up

    # Wait for veth interface.
    until ip link show dev "${SANDBOX_VETH}"; do
        sleep 1
    done
    # Configure veth.
    ip addr add "${SANDBOX_IP}/${PREFIX}" dev "${SANDBOX_VETH}"
    ip link set dev "${SANDBOX_VETH}" up
    ip route add default via "${OUTER_IP}" dev "${SANDBOX_VETH}"

    # Run program.
    exec sudo -u "${TARGET_USER}" "${TARGET}"
elif [ "${1}" = "up" ]; then
    ip link set dev "${OUTER_VETH}" up
elif [ "${1}" = "down" ]; then
    ip link set dev "${OUTER_VETH}" down
fi
Deleted ()
Ответ на: комментарий от unanimous

Бубунта 12.04

man unshare

ладна не парься -n только от рута или судоерса

deep-purple ★★★★★ ()
Ответ на: комментарий от MinasFilm

не может тупо зарубить сеть для процесса

Зато может зарубить для группы процессов. Просто запускай процесс в определённой группе (через suid bit) и рули как хочешь.

no-such-file ★★★★★ ()

rfkill? Вроде по описанию оно.

DeadEye ★★★★★ ()
Ответ на: комментарий от Deleted

зачётнее в шебанге это прописать #!/bin/sh -e

anonymous ()

cgroups
или как droidwall - глянь его сырцы

ubuntuawp ★★ ()

а можно же по юзер айди фильтровать по-моему?

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