LINUX.ORG.RU
ФорумAdmin

SSH тунель и проброс портов

 


0

1

Имеется 1 компьютер на Linux с внешним IP.

Так же имеется другой компьютер, тоже на Linux, сидит на NAT у провайдера, имеет нормальный доступ в интернет, но входящие соединения принимать не может.

На втором компьютер запускается сервер Minetest (работает про протоколу UDP). Теперь необходимо как-то пробросить его 30000-ый порт на первый компьютер. Если бы компьютер был в локальной сети (а первый исполняет функцию роутера), то всё достаточно просто решается правилами iptables.

OpenVPN и прочие не осилил, да и хочется попроще, потому что весь функционал VPN мне не нужен.

Пробовал поднять SSH-тунель с помощью ssh -w0:0 root@my-server. Появляется сетевой интерфейс tun0 и на сервере и на клиенте, задаю им IP. В итоге могу пинговать сервер с клиента и наоборот. Могу получить доступ с роутера к серверу на клиенте, а с клиента к локальным ресурсам роутера. Однако пробросить порт тем же правилом iptables нельзя - как я понимаю minetest в итоге не понимает через какой интерфейс ему вернуть пакеты - ведь шлюз по умолчанию на клиенте отнюдь не tun0.

Можно было бы ходить в интернет через роутер, но я не хочу загружать его интернет-канал, поэтому через тунель должен идти только трафик для minetest.

Что делать?

★★★★★

А зачем вообще в случае туннеля пробрасывать порты? У вас сервер на 2-м компьютере не на 0.0.0.0 слушает?

undertaker ★★
()
Ответ на: комментарий от undertaker

Второй компьютер не может принимать входящие соединения из Интернета, потому что сидит за NAT. А мне нужно сделать доступным сервер на нём для всех желающих через внешний IP 1-ого компьютера.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от KivApple

Аа, я прозевал, что у тебя udp. Про форвард udp чеерз ssh были каие-то грязные извращения, требующие, к тому же, доступа к серверу. Уж лучше в самом деле openvpn.

thesis ★★★★★
()
Ответ на: комментарий от thesis

К обеим машинам имеется root-доступ. Меня заинтересовало, что SSH умеет создавать полноценный сетевой интерфейс-тунель.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от thesis

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

KivApple ★★★★★
() автор топика
Ответ на: комментарий от KivApple

Я чего-то не понимаю.
Вот у тебя торчит одной головой в инет НАТ-шлюз какой-то локалки, на него я снаружи стучусь в 3000й порт, ты хочешь, чтобы я попал не в локалку, а на какую-то левую машину в _другой_ сети, за _другим_ НАТом, правильно?

Для этого ты с этой машины-из-другой-сети наводишь тоннель с чужим шлюзом.

Я спрашиваю: пробовал ли ты ДНАТить на том далеком шлюзосервере трафик 3000го порта на свой конец тоннеля?

thesis ★★★★★
()
Ответ на: комментарий от thesis

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

KivApple ★★★★★
() автор топика
Ответ на: комментарий от thesis

Конкретнее подскажи, пожалуйста. И где это правило делать. Роутер если что ещё раздаёт интернет в локалку и правило MASQURADE там стоит.

Если я правильно понимаю сейчас проблема не в роутере, а в сервере. Происходят следующие события:

1) Роутер получает входящий пакет и перенаправляет его в тунель

2) Сервер получает из тунеля входящий пакет.

3) Сервер хочет ответить на этот пакет. В качестве IP источника указан внешний IP клиента, который пытается подключиться.

4) Сервер отвечает на запрос, но поскольку IP отправителя никак не связанно с тунелем пакет хочет уйти через шлюз по умолчанию, которым является отнюдь не тот, который получил пакет, а шлюз провайдера с NAT. В итоге клиент сервера так и не получит ответа.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от KivApple

Черт, думал мозги отвлечь от своей задачи, а они только тупят.
Мне интересно, будет ли рбаотать твоя связка, если на роутере вписать два правила:

1) PREROUTING: DNAT всего с портом назначения 3000, == IP твоего конца тоннеля;
2) POSTROUTING: SNAT всего с портом назначения 3000, == IP роутерового конца тоннеля

thesis ★★★★★
()
Ответ на: комментарий от thesis

«Твоего конца тоннеля» имеется в виду IP тоннельного адаптера на сервере.
Сами правила не напишу, у меня постоянно их синтаксис из кэша выпадает.

thesis ★★★★★
()
Ответ на: комментарий от KivApple

Либо на роутере делать SNAT для пакетов, уходящих в тунель, либо на сервере поднимать police routing. Легко нагуглить достаточно примеров по «ip rule», по какому признаку роутить пакеты это уж вам решать (connmark, порт или ip-адрес, на который биндить Minetest).

mky ★★★★★
()
Ответ на: комментарий от thesis

Естественно, будет. Как-то так:

iptables -t nat -A PREROUTING -p udp --dport 30000 -j DNAT --to-destination <ip машины за натом>
iptables -t nat -A POSTROUTING -d <ip машины за натом> -p udp -j SNAT --to-source <ip сервера>

generator ★★★
()
Ответ на: комментарий от Suntechnic

В манах не написано ничего. Но по умолчанию -R и -L tcp-порт открывают же.

generator ★★★
()
Ответ на: комментарий от generator

Не работает. Пишу:

iptables -t nat -A PREROUTING -p udp -d 176.100.65.176 --dport 30000 -j DNAT --to-destination 10.0.1.1:30000
iptables -t nat -A POSTROUTING -d 10.0.1.1 -p udp -j SNAT --to-source 176.100.65.176

176.100.65.176 - Внешний IP сервера.

10.0.1.1 - Адрес второго конца тунеля SSH

Сервер игры как бы видит что к нему пытаются подключиться, но ругается на то, что не смог связаться с игроком.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от KivApple

SNAT --to-source 176.100.65.176

Здесь должен быть адрес первого конца SSH. 10.0.1.2, например.

generator ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.