Можно ли использовать сервер со статическим IP-адресом для прямого соединения между двумя клиентами, каждый из которых находится за NAT?
Я использовал autossh и переадресацию портов, чтобы установить соединение через сервер, но я считать это означает, что любое взаимодействие между клиентами потребляет ресурсы сервера (вычислительные затраты на пересылку пакетов и пропускную способность). Я не могу проверить себя, потому что в данный момент у меня нет доступа к одному из клиентов.
То, что я представляю себе схематично (У меня есть A, B и сервер, поэтому какой бы клиент ни подключился первым, может просто дождаться подключения другого):
client A -----> server <----- client B
Я думаю, что метод обратного туннелирования делает это:
A sends packet -----> server,
server receives packet,
server sends packet -----> B,
B receives packet
и наоборот. Я бы хотел:
A connects -----> server (connection stays open until B connects)
B connects -----> server (server tells B about A)
A and B can communicate bidirectionally while the connection stays open
(если есть разъединения, A и B могут повторить шаг подключения)
Я думаю, что это должно быть возможно (разве не так работают протоколы P2P?), Но я не знаю, как это настроить.
Я использовал autossh и переадресацию портов для установки соединения через сервер, но я думаю, что это означает, что любое взаимодействие между клиентами потребляет ресурсы сервера (вычислительные накладные расходы на пересылку пакетов и пропускную способность).
Ты прав
Есть два инструмента от Сами Камкар позволяя двум хостам за NAT общаться друг с другом, pwnat и Chownat. На сайте есть описания уловок / техники, если вы хотите реализовать свое решение с помощью этого метода, или вы можете использовать инструменты, опубликованные Сэми.
В широком смысле chownat
для общения A <-> B, когда оба соглашаются, что они хотели бы общаться; и pwnat
для связи A-> B, которую B не ожидает. Вы можете использовать первые, если они разделяют состояние на сервере, чтобы согласовать, когда открывать chownat
туннель; или иным образом использовать pwnat
и вообще не нужен сервер.