В офисе мы получаем доступ в Интернет через сервер 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-адрес назначения?
РЕДАКТИРОВАТЬ2:
Еще одна идея, которая приходит мне в голову, есть ли какая-то команда-оболочка, которая заставляет другую команду связываться с данным IP?
Протокол 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
чтобы получить больше информации.