Linux: Есть ли удобный способ выполнить программу, связывающую ее с выбранным IP-адресом?

11

В FreeBSD 4.9 это было очень легко выполнить с помощью одной команды, такой как

jail [-u username]  path hostname ip-number command

если путь был, /то у вас была запущена та же программа, что и обычно, но все ее сетевое взаимодействие было ограничено использованием только указанного IP-адреса в качестве источника. Иногда это очень удобно.

Сейчас в Linux есть LXC, который очень похож на FreeBSD jail(или зоны Solaris) - можете ли вы придумать подобный способ выполнения программы?

poige
источник
С какой программой вы пытаетесь это сделать? Многие программы достаточно настраиваемы, чтобы им можно было сказать, к какому IP привязать.
Уоррен Янг
@WarrenYoung, спасибо нокауту, но "многие"! = "Все"
poige
Хорошим вариантом использования для «заключения в тюрьму» исполняемого файла для использования определенного IP-адреса является запуск нескольких игровых серверов на одном компьютере в локальной сети. Например, игры Valve транслируются только через порты 27015-27020, поэтому для каждого IP-адреса вы можете иметь только 6 серверов. Таким образом, вы добавляете виртуальные IP-адреса на сетевую карту, но затем вам необходимо указать «+ ip <адрес>» в командной строке игрового сервера, который прекращает передачу своего присутствия клиентам => серверы не видны в браузере локальной сети. Так что "+ ip" не будет работать. Поэтому нам нужно заключить в тюрьму каждый сервер в среде, где он может найти только 1 IP-адрес. Результат: без ограничений в #servers + клиенты видят все серверы.
Тиммос

Ответы:

12

Запуск процесса внутри сетевого пространства имен, в котором виден только нужный IP-адрес, может привести к чему-то похожему. Например, предположил, что я хотел, чтобы localhost был доступен только для определенной программы.

Сначала я создаю пространство имен сети:

ip netns add limitednet

Пространства имен по умолчанию имеют петлевой интерфейс, так что теперь мне просто нужно поднять его:

sudo ip netns exec limitednet ip link set lo up

Теперь я могу запустить программу с помощью, ip netns exec limitednetи она сможет видеть только петлевой интерфейс:

sudo ip netns exec limitednet ip addr show
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

Если бы я хотел ограничить его адресом, отличным от localhost, я мог бы добавить другие интерфейсы в пространство имен, используя:

ip link set DEVICE_NAME netns NAMESPACE

Мне пришлось бы немного поэкспериментировать, чтобы понять, как добавить один IP-адрес в пространство имен в случае, если интерфейс может иметь более одного IP-адреса.

LWN статья о пространствах имен также полезно.

Стивен Д
источник
Но стоит упомянуть, что это потребовало бы гораздо больше подготовки, поскольку сетевое пространство имен имеет свою собственную таблицу маршрутизации и так далее. Если кто-то придумает более простой способ подражать jail, я воспользуюсь им. ;)
Пой