Запретить приложению использовать все IP-адреса на порту (0.0.0.0:34964)

Хэш и функция поиска могут выглядеть примерно так:

#!/usr/bin/env bash

declare -A proggies

# "aliases" and then the path said should expand to
proggies[foo]=/some/big/long/stupid/path/foo
proggies[bar]=/some/big/long/stupid/path/bar

function qrunner {
    local exe
    exe=${proggies[$1]}
    if [[ -z "$exe" ]]; then
        echo >&2 "no mapping for '$1'"
        return 1
    fi
    # echo here is for debugging, remove when ready to
    # really break things
    echo qsub job.sh "$exe" "$2"
}

# positive test
qrunner bar filename
echo $?

# and also a negative one
qrunner nope filename
echo $?
1
06.04.2017, 15:05
1 ответ

У вас есть несколько вариантов.

LD _ПРЕДНАГРУЗКА

Вы можете использовать библиотеку LD_PRELOADдля перехвата системного вызова bind()для принудительной привязки к определенному адресу. Одним из примеров этого является этот , который вы компилируете следующим образом:

gcc -nostartfiles -fpic -shared bind.c -o bind.so -ldl -D_GNU_SOURCE

И использовать вот так:

BIND_ADDR=127.0.0.1 LD_PRELOAD=./bind.so /path/to/myprogram

Сетевые пространства имен с Docker

Вы также можете запустить свою программу в собственном сетевом пространстве имен. Самый простой способ сделать это — создать образ Docker для вашего приложения, а затем запустить его в Docker и использовать возможности сопоставления портов Docker для предоставления службы на выбранном вами IP-адресе хоста.

Здесь водятся драконы

Я настоятельно рекомендую одно из приведенных выше решений. Я включил только следующее, потому что вы спросили о сетевых пространствах имен.

Сетевые пространства имен с macvlan

Если вы хотите сделать это без Docker, это возможно, но немного больше работы. Сначала создайте новое сетевое пространство имен :

.
# ip netns add myns

Затем создайте macvlanинтерфейс, связанный с одним из ваших хост-интерфейсов, и поместите его в пространство имен:

# ip link add myiface link eth0 type macvlan mode bridge
# ip link set myiface netns myns

И назначьте ему адрес в вашей локальной сети:

# ip netns exec myns \
  ip addr add 192.168.0.4/24 dev myiface
# ip netns exec myns \
  ip link set myiface up

И создайте соответствующие правила маршрутизации внутри пространства имен (, заменив фактический адрес шлюза на192.168.0.1):

# ip netns exec myns \
  ip route add default via 192.168.0.1

Теперь запустите вашу программу в сетевом пространстве имен:

# ip netns exec myns \
  /path/to/myprogram

Теперь ваша программа работает и будет привязана только к 192.168.0.4, потому что это единственный адрес, видимый внутри пространства имен. Но! Помните об ограничении mavclanинтерфейсов :, в то время как другие хосты в вашей сети смогут подключаться к службе, вы не сможете подключиться к этому адресу с хоста, на котором она работает (, если только вы создаете еще один интерфейс macvlanна хосте и маршрутизируете соединения с 192.168.0.4через этот интерфейс ).

Сетевые пространства имен с интерфейсами

Вместо использования интерфейсов macvlanвы можете создать пару интерфейсов veth, один конец которой находится внутри сетевого пространства имен, а другой — на вашем хосте. Вы будете использовать ip-masquerading для передачи пакетов из пространства имен в вашу локальную сеть.

Создать сетевое пространство имен:

# ip netns add myns

Создать интерфейсную пару:

# ip link add myiface-in type veth peer name myiface-out

Назначьте один конец пары вашему сетевому пространству имен:

# ip link setns myiface-in myns

Настройте адрес на каждом конце пары и активируйте ссылки:

# ip addr add 192.168.99.1/24 dev myiface-out
# ip link set myiface-out up
# ip netns exec myns ip addr add 192.168.99.2/24 dev myiface-in
# ip netns exec myns ip link set myiface-in up

Настройте маскировку IP-адресов на своем хосте. Это перенаправит входящие пакеты на 192.168.0.4в ваше пространство имен :

.
# iptables -t nat -A PREROUTING -d 192.168.0.4 -p tcp --dport 34964 -j DNAT --to-destination 192.168.99.2
# iptables -t nat -A OUTPUT -d 192.168.0.4 -p tcp --dport 34964 -j DNAT --to-destination 192.168.99.2

И это будет маскировать исходящие пакеты:

# iptables -t nat -A POSTROUTING -s 192.168.99.2 -j MASQUERADE

Вам необходимо убедиться, что на вашем хосте включена переадресация IP-адресов(sysctl -w net.ipv4.ip_forward=1)и что ваша цепочка iptables FORWARDразрешает переадресацию соединения (iptables -A FORWARD -d 192.168.99.2 -j ACCEPT, имея в виду, что правила обрабатываются последовательно, поэтому правило отклонения перед этот будет иметь приоритет ).

2
27.01.2020, 23:34

Теги

Похожие вопросы