Вопрос: Связывание исходящего трафика SOCKS-сервера с определенным IP-адресом


В офисе мы получаем доступ к сети через сервер SOCKS, который запускается с помощью команды:
ssh localhost -f -N -D *:8888,

Этот сервер имеет 2 IP-адреса (но только одну сетевую карту):
eth0 xx.yy.zz.1
eth0: 1 xx.yy.zz.2

Таким образом, браузеры настроены на использование прокси-сервера socks xx.yy.zz.2:8888

Когда я проверяю, что такое IP, который видит веб-сайт, он дает мне xx.yy.zz.1 (IP-адрес сервера по умолчанию).
Но я хочу, чтобы он был другим (xx.yy.zz.2).

Как связать исходящие соединения со вторым IP-адресом?

РЕДАКТИРОВАТЬ:
Это можно решить с помощью iptables?
Может быть, есть способ определить, какие пакеты происходят из данного SSH-туннеля, а затем изменить их IP-адрес назначения?

EDIT2:
Другая идея, которая приходит мне в голову, есть какая-то команда-оболочка, которая заставляет другую команду связываться с данным IP-адресом?


6
2018-03-29 01:13


Источник




Ответы:


В протоколе SSH нет возможности для клиентов сообщать серверу привязываться к определенному адресу при выполнении динамической переадресации портов, поэтому нет, вы не можете сообщить своему клиенту SSH об этом. Вы также не можете сказать серверу OpenSSH. Он будет слепо использовать getaddrinfo для подключения к удаленному хосту.

Единственный способ исправить - настроить ваш сервер так, чтобы он делал то, что вы хотите. К сожалению, вы не можете сказать из маршрутизации или iptables соединение которого было выполнено сервером OpenSSH. Проблема сложная: OpenSSH может открывать соединение, но может также порождать оболочку, которая может порождать другой процесс, который также может открывать соединения. Отличие от двух случаев трудно. Было бы намного проще, если OpenSSH просто установил отметку или что-то еще, но это не так.

Таким образом, ваши решения ограничены:

  • Используйте отдельный сервер SOCKS, который позволяет вам настроить адрес привязки.

  • Настройте свое ядро ​​так, чтобы он использовал xx.yy.zz.2 по умолчанию для всего исходящего соединения или для фактических IP-адресов назначения, которые используются, если они известны заранее.

    Чтобы назначить адрес источника, когда его нет, ядро ​​просматривает используемую запись маршрута для вашего целевого адреса, и если у него есть предпочтительный адрес источника, он будет использовать его. Иначе он выберет какой-то адрес, который лучше всего подходит для задачи. Независимо от того, что он выбирает, можно проверить ip route get (destination) после src маркер:

    $ ip route get 8.8.8.8 8.8.8.8 via (maybe your gateway) dev eth0 src xx.yy.zz.1 [...]

    Вы можете изменить таблицу маршрутизации с помощью ip route для добавления предпочтительных исходных адресов с помощью ip route change [...] src xx.yy.zz.2 Вы даже можете добавить более конкретный маршрут, идущий через один и тот же шлюз, но с другим предпочтительным адресом источника.

  • Поместите OpenSSH в пространство имен в сети, которое обрабатывает только адрес xx.yy.zz.2. Это решение является излишним и может изменить конфигурацию многих сервисов на вашем сервере, поскольку он по существу изолирует ваши два адреса. Это решение будет включать в себя множество изменений в вашей системе, особенно в отношении того, как запускается демон sshd и ваш socks-сервер.


Не относится ко всему этому: «интерфейсные псевдонимы» (например, eth0:1) устарели в Linux. Они по-прежнему работают как обратная совместимость для исторических инструментов, таких как ifconfig, но вы должны действительно избавиться от них и использовать встроенную функциональность ядра для получения нескольких адресов на интерфейсы. Прекратить использование ifconfig, route и использовать ip addr а также ip route вместо.

использование ip addr add ... dev eth0 добавить адрес в eth0 интерфейс. Вы можете добавить столько адресов, сколько захотите. использование ip addr чтобы перечислить их все. См. Страницу руководства ip addr а также ip route для получения дополнительной информации.


4
2018-04-02 19:57



Можно ли использовать трюк LD_PRELOAD для перезаписывания getaddrinfo функция с пользовательской? - GetFree
Да, но это ничего не изменит. getaddrinfo только возвращает параметр для использования при создании вашего сокета, и он не возвращает параметр привязки. То, что вам нужно перехватить, - это socket() или connect() вызов, привязать сокет к тому, что вы хотите, или установить метку брандмауэра, чтобы ядро ​​могло выбрать предпочтительный адрес источника, который вы хотите. - BatchyX
Я нашел эту страницу daniel-lange.com/archives/... где они указывают на два рабочих примера этого. Я попробовал один из них (тот, который поддерживает x86_64), но он, похоже, не работает. Я попробую добавить некоторые отладочные сообщения в код, чтобы узнать, что происходит. - GetFree
Я понял, что трюк LD_PRELOAD никогда не будет работать, поскольку SSH-команда - это просто клиентская программа, которая делает соединение с SSH-сервером. И это сервер, который пересылает пакеты. Поэтому принуждение клиента к привязке к данному IP-адресу не будет иметь никакого значения. - GetFree