LINUX.ORG.RU
ФорумAdmin

Проксить ssh с реальным ip клиента через nginx

 ,


0

2

Есть два хоста: один с белым ip и доменом, на другом хостится гитлаб – на первом стоит nginx для реверс прокси, оба хоста сидят в впн. Проблема заключается в git over ssh, я спроксировал ssh от первого сервера ко второму:

# Proxy ssh for gitlab
stream {
    upstream gitlab_ssh {
        server v.v.v.v:22;
    }
    server {
        listen 22;
        proxy_pass gitlab_ssh;
    }
}

На первом сервере 22 порт свободный, а на втором висит sshd. Но в логах подключения вижу ip сервера, который проксирует трафик, а я хотел еще fail2ban поставить, а в такой ситуации он мне прокси сервер будет блокировать. Нашел такое решение. Но оно не работает, во-первых если добавить proxy_protocol on;, то ssh на конечном хосте пожалуется:

kex_exchange_identification: client sent invalid protocol identifier "PROXY TCP4 x.x.x.x y.y.y.y 59742 22" ## Вот тут четко вижу ip клиента (x.x.x.x) и ip прокси (y.y.y.y)

А на строку set_real_ip_from $proxy_protocol_addr; ругается сам nginx:

host not found in set_real_ip_from "$proxy_protocol_addr" in /etc/nginx/nginx.conf:72

Еще пробовал добавлять proxy_bind $remote_addr;, но тут опять

bind(x.x.x.x) failed (99: Cannot assign requested address) while connecting to upstream, client: x.x.x.x, server: 0.0.0.0:22, upstream: "v.v.v.v:22", bytes from/to client:0/0, bytes from/to upstream:0/0

Добавил net.ipv4.ip_nonlocal_bind=1, но теперь сеть недостижима

[error] 1019147#1019147: *1687228 connect() to v.v.v.v:22 failed (101: Network is unreachable) while connecting to upstream, client: x.x.x.x, server: 0.0.0.0:22, upstream: "v.v.v.v:22", bytes from/to client:0/0, bytes from/to upstream:0/0

Подскажите, пожалуйста, что я делаю не так?

★★

Последнее исправление: snake266 (всего исправлений: 1)

Варианта три:

  1. Ставь fail2ban на проксю.

  2. На хосте с ssh надо установить какие-то читы, чтобы они сами принимали проксированное соединение и пробрасывали его к sshd с поддельного исходного айпи-адреса (того, который прокси прислало). Не уверен что такой софт есть готовый.

  3. Сделай на первом хосте NAT (без nginx-а), а на втором настрой исходящий маршрут с 22 порта через первый хост.

Напрямую соединить какое бы то ни было прокси и sshd так, чтобы второй видел настоящий айпи клиента, невозможно.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 3)