Простой способ создать туннель от одного локального порта до другого?

Запись Стандарта Иерархии Файловой системы в Википедии помогла мне ответить на тот же вопрос, когда у меня был он, плюс он имеет очень объяснительную таблицу.

Выборка от этого page1:

/bin        Essential command binaries that need to be available in single user mode; for all users, e.g., cat, ls, cp.
/usr/bin    Non-essential command binaries (not needed in single user mode); for all users.
/usr/local  Tertiary hierarchy for local data, specific to this host. Typically has further subdirectories, e.g., bin, lib, share
/usr/sbin   Non-essential system binaries, e.g., daemons for various network-services.
/sbin       Essential system binaries, e.g., fsck, init, route.

1 Полученный 19 июня 2019; постоянная ссылка.

80
08.05.2011, 16:26
8 ответов

Используя ssh самое легкое решение.

ssh-g-L 8001:localhost:8000-f-N user@remote-server.com

Это вперед локальный порт 8001 на Вашей рабочей станции к localhost обращается на порте remote-server.com 8000.
-g средства позволяют другим клиентам в моей сети соединяться с портом 8001 на моей рабочей станции. В других отношениях только локальные клиенты на Вашей рабочей станции могут соединиться с переданным портом.
-N средства все, что я делаю, является портами пересылки, не запускают оболочку.
-f ветвление средств в фон после успешного соединения SSH и входа в систему.
Порт 8001 останется открытым для многих соединений, пока ssh не умрет или будет уничтожен. Если Вы, оказывается, находитесь в Windows, превосходный клиент SSH, PuTTY может сделать это также. Используйте 8001 в качестве локального порта и localhost:8000 и места назначения и добавьте локальное перенаправление портов в настройках. Можно добавить его после успешного подключения с PuTTY.

45
27.01.2020, 19:30
  • 1
    Что делает user@remote-server.com ? Это является определенно ненужным для перенаправления портов, однако ssh мандаты, имеющие этот аргумент, больше законченный, это пытается соединиться там. И после установки этой противной опции к имени хоста это производит …port 22: Connection refused (не, я не использовал 22 порта). Если я не пропускаю что-то, команда явно не работает. –  Hi-Angel 01.12.2016, 15:43
  • 2
    @Hi-Angel user@remote-server.com просто пример, и Вы не должны брать его буквально. Необходимо заменить это названием компьютера, который Вы хотите подключить с и Ваше имя пользователя на этом компьютере. Эта информация необходима для установления соединения SSH. Только после того, как соединение SSH является установленными портами, может быть передан посредством этого соединения. –  Piotr Dobrogost 02.02.2017, 01:45
  • 3
    Если Вы хотите, чтобы порт был доступен от начальной загрузки, затем видят "autossh" в systemd сервисе с помощью вышеупомянутого метода - everythingcli.org/ssh-tunnelling-for-fun-and-profit-autossh –  Richard Hollis 27.10.2017, 16:03
  • 4
    я также получаю "соединение, которому отказывают". И я все еще не понимаю, почему аргумент user@remote-server.com необходим, когда нет никакого включенного соединения SSH (согласно-N). Если просто передачи пакетов. –  Alexander Taylor 10.12.2017, 09:42
  • 5
    @AlexanderTaylor -N не означает, что нет никакого соединения SSH. Это просто означает do not execute a remote command (см. страницу справочника). <user>@<host> аргумент необходим, потому что это действительно открывает соединение SSH для <host> (который для случая OP был бы localhost), и вперед требуемый порт через это туннель SSH. Это - одно решение для проблемы OP, но не самое простое. Для передачи localhost, не используя ssh можно использовать socat или netcat как в StephaneChazelas и ответах не-пользователя –   18.04.2018, 14:35

OpenBSD netcat доступен по умолчанию на Linux и также на OS X.

OSX:

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &

Linux:

mkfifo backpipe
nc -l 12345 0<backpipe | nc www.google.com 80 1>backpipe

Альтернатива, которая работает над ударом OS X, должна использовать двунаправленный канал. Это может работать над другим Unixes:

nc 127.0.0.1 8000 <&1 | nc -l 8001 >&0
25
27.01.2020, 19:30
  • 1
    я не заметил сначала, что Вы использовали openbsd netcat. Это лучше, чем необходимость установить другой netcat от пакета Ubuntu. –  RobertR 26.02.2015, 17:24
  • 2
    OpenBSD перестал работать на Ubuntu 15.04. С перенаправлениями оболочки netcat не удается открыть порт для слушания, как замечено ss -tan или netstat -tan. –  Justin C 03.09.2015, 03:12
  • 3
     v. FTR: альтернативным путем работы над Ubuntu –  Hi-Angel 30.11.2016, 12:41
  • 4
    я не понимаю Вашего решения. Можно ли объяснить это? слова благодарности –  Trismegistos 19.09.2017, 11:21
  • 5
    @trismegistos В этих примерах netcat вход перенаправления слушателя и клиента в некоторые совместно используемые файлы (mkfifo каналы.. метод "первым пришел - первым вышел"), и использование те совместно используемые файлы как их источник/место назначения ввода/вывода, эффективно создавая туннель. Обычно клиент/слушатель используется, но некоторые методы используют client+client/listener+listener-wiki.securityweekly.com / …, и slideshare.net/amiable_indian/secrets-of-top-pentesters, должен чтения. –  Info5ek 04.10.2017, 21:02

Используя традиционное nc самое легкое решение:

nc -l -p 8001 -c "nc 127.0.0.1 8000"

Эта версия nc находится в netcat-traditional пакет на Ubuntu. (Вы имеете к update-alternatives или назовите его nc.traditional.)

Обратите внимание, что в отличие от ssh это не шифруется. Имейте это в виду при использовании его вне одного хоста.

47
27.01.2020, 19:30

С socat на сервере:

socat tcp-listen:8001,reuseaddr,fork tcp:localhost:8000

По умолчанию socat будет прослушивать TCP-порт 8001 на любом IPv4- или IPv6-адресе (если поддерживается) на аппарате. Вы можете ограничить его IPv4 / 6, заменив tcp-listen на tcp4-listen или tcp6-listen , либо конкретным локальным адресом, добавив , привязка = тот-адрес .

То же самое для соединительного сокета, к которому вы проксируете, вы можете использовать любой адрес вместо localhost и заменить tcp на tcp4 или ] tcp6 , если вы хотите ограничить разрешение адресов IPv4 или IPv6 адресами.

Обратите внимание, что для сервера, прослушивающего порт 8000, соединение будет отображаться как исходящее от прокси (в случае localhost , это будет localhost ), а не исходное. клиент. Вам нужно будет использовать подходы DNAT (но для этого требуются привилегии суперпользователя), чтобы сервер мог определить, кто является клиентом.

102
27.01.2020, 19:30
iptables -t nat -A PREROUTING -p tcp --dport <origin-port> -j REDIRECT --to-port <destination-port>

service iptables save
service iptables restart
3
27.01.2020, 19:30

Цитирование ответа Дэвида Спиллета на ServerFault

rinetd should do the job, and a Windows binary for it can be had from http://www.boutell.com/rinetd/ (for anyone looking for the same thing under Linux, rinetd is in the standard repositories of just about every distro so can be installed with "apt-get install rinetd" or "yum install rinetd" or similar)

Это простой двоичный файл, который принимает файл конфигурации в формате

bindaddress bindport connectaddress connectport

Например:

192.168.1.1 8001 127.0.0.1 8000

или

0.0.0.0 8001 127.0.0.1 8000

если вы хотите привязать входящий порт ко всем интерфейсам.

5
27.01.2020, 19:30

Это новый способ туннелирования двух портов udp на сервере :https://github.com/9crk/udpeer

udpeer 8001 8002

Для проверки:

nc -u xxxx.com 8001
nc -u xxxx.com 8002
0
27.01.2020, 19:30

Основываясь на ответе Марка А. , мне пришлось внести небольшую поправку, чтобы заставить его работать на моем Mac (, по крайней мере, на macOS Mojave Version 10.14.4)

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &
printf "" > a

Этот оператор printf кажется решающим. В противном случае команда netcat для подключения к порту 8000 никогда не будет пытаться подключиться, а команда netcat для прослушивания порта 8001 никогда не будет фактически прослушивать порт 8001. Без printf каждый раз, когда я пытался бы подключиться к порту 8001, я бы получал В соединении отказано.

Я предполагаю, что netcat должен каким-то образом блокировать стандартный ввод (, возможно, по какой-то причине он пытается его прочитать )перед выполнением каких-либо операций с сокетами. Таким образом, без записи оператора printf в fifo a команда netcat никогда не начнет прослушивать порт 8001.

Примечание. :Я бы оставил ответ на пост Марка, но у меня пока нет репутации.

2
27.01.2020, 19:30

Теги

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