What is NAT Loopback?
Define a feature in many SOHO routers that permit the access of a service via the public IP address or domain name from inside the local network. This eliminates the need for using separate domain name resolution for hosts inside the network than for the public network for a website.
Example:
Public address: 202.96.128.5. This is the address of the WAN interface on the router.
Internal address of the router: 192.168.2.1
Address of the server: 192.168.2.10 external port : 80
Address of a local computer: 192.168.2.3

If a packet is sent to the public address by a computer at 192.168.2.3, the packet would normally be routed to the default gateway (the router), unless an explicit route is set in the computer’s routing tables. A router with the NAT loopback feature detects that 202.96.128.5 is the address of its WAN interface, and treats the packet as if coming from that interface. It determines the destination for that packet, based on DNAT (port forwarding) rules for the destination. If the data were sent to port 80 and a DNAT rule exists for port 80 directed to 192.168.2.10, then the host at that address receives the packet.
If no applicable DNAT rule is available, the router drops the packet. An ICMP Destination Unreachable reply may be sent. If any DNAT rules were present, address translation is still in effect; the router still rewrites the source IP address in the packet. The local computer (192.168.2.3) sends the packet as coming from 192.168.2.3, but the server (192.168.2.10) receives it as coming from 202.96.128.5. When the server replies, the process is identical to for an external sender. Thus, two-way communication is possible between hosts inside the LAN network via the public IP address.
Troubleshooting:
1. Check and ensure the server is accessible inside the local network. Access the server from a host inside the network using LAN IP + Port
2. Check whether the server is blocked by the firewall or the port forwarding is invalid
> Access the server from a host outside the network using WAN IP + Port
> Turn off the firewall on the server and try again if fail to access the server
> Try to enable DMZ and try again
3. Check whether the NAT loopback is working properly
> Access the server from a host inside the network using WAN domain name + Port
> Access the server from a host inside the network using WAN IP + Port
> If failed to access the server via domain name but successful to access the server via WAN IP, use the ping command to check whether the IP address resolved by the server domain name is correct
>If failed to access the server via both domain name and WAN IP, check if the port forwarding is valid to refer to this FAQ
Case Sharing:
A customer has an FTP server and a Mail server, LAN IP is 192.168.1.100, he is able to connect through the WAN address away from the network.
However, if he tries to connect to the server while on the local network it doesn’t seem to work.
The FTP server working well after changing the External port from 21 to 2121 . We find that the external port 21 conflicts with the FTP service port 21 of the router. After modifying the external port to 2121, the customer can access the server.
Особенности установления соединения между участниками сетевой игры типа «равный к равному»
Это сборник информации, которая мне понадобилась, чтобы реализовать этап установления соединения между участниками сетевой игры типа «равный к равному» (peer-to-peer) с использованием протокола UDP.
Статья расчитана на начинающих разработчиков игр. Попытался написать такую статью, которую я сам хотел бы прочитать в то время, когда только начал разбираться в этой теме: чтобы все нужные ньюансы были собраны в одном месте, но при этом ничего лишнего, простым языком, и с наглядными картинками. Возможно кому-то пригодится.
Опытные геймдевелоперы вряд ли найдут тут для себя что-то новое. Но буду благодарен за замечания и комментарии.

Сетевая игра с архитектурой «равный к равному» (peer-to-peer)
- Каждый игрок хранит всё состояние игрового мира и обрабатывает его синхронно с другими игроками. Каждый игрок передаёт действия пользователя всем другим игрокам. Ведущий игрок, который собирает других игроков, называется сервером, а остальные клиентами. Сервер является главным только на этапе сбора игроков. А во время игры нет главного компьютера.
- Этот подход имеет следующие особенности:
- Трафик не зависит от сложности игрового мира, а только от количества игроков. В этом режиме обычно работают стратегии в реальном времени, где нужно обрабатывать тысячи юнитов.
- Объём трафика имеет порядок N², где N количество игроков. Поэтому этот подход применим только для игр с небольшим количеством игроков.
- Так как данные передаются напрямую между игроками без промежуточного сервера, то задержки передачи (лаги) минимальные. Но если хотя бы один из игроков имеет проблемы со связью, то это повлияет на всех игроков.
- Необходимо установить каналы связи между всеми игроками. Но если игроки находятся в разных локальных сетях, то это не всегда возможно.
-
обеспечивает надежную доставку потока байтов. Это упрощает реализацию игры, но нет контроля над задержками передачи данных.
это простой протокол передачи пакетов без гарантии их доставки. Но благодаря его простоте UDP используют в системах реального времени, когда неприемлемо ждать задержавшиеся или потерянные пакеты. Использование UDP позволяет уменьшить задержки в игре, но усложняет реализацию игры.
Установление соединения в локальной сети
-
Чтобы установить соединение между игроками клиенту нужно знать IP-адрес сервера и порт, который слушает программа игры.

- Например, компьютер игрока A имеет в локальной сети IP-адрес 192.168.1.2. Игрок A запускает программу игры на своём компьютере в режиме сервера, и программа слушает порт 50120. Игрок A каким-либо образом сообщает эту информацию игроку B.
- Компьютер игрока B имеет в локальной сети IP-адрес 192.168.1.5. Игрок B запускает программу игры на своём компьютере в режиме клиента, и программа занимает порт 50150. Игрок B вводит в программе игры адрес сервера 192.168.1.2:50120, и программа отправляет запрос к серверу по заданному адресу.
- Сервер находится в режиме ожидания, и получив запрос от игрока B узнаёт его адрес 192.168.1.5:50150. Таким образом клиент и сервер установили соединение и могут начать игру.

- [0, 1023] общеизвестные (системные).
- [1024, 49151] зарегистрированные (пользовательские). Порт для сервера нужно выбрать в этом диапазоне.
- [49152, 65535] динамические (частные). Тут ОС выделяет временные порты для программ.
Например, если адрес сети равен 192.168.1.0, маска подсети 255.255.255.0, то широковещательный IP-адрес будет 192.168.1.255.

Установление соединения из локальной сети к серверу в Интернет
-
Как правило, компьютеры подключены к Интернет не напрямую, а через роутер. И, как правило, на роутере выполняется преобразование сетевых адресов (NAT, Network Address Translation).
Например, клиент C находится в локальной сети, и имеет доступ к Интернет через роутер B, а сервер A имеет публичный IP-адрес в Интернет. Пусть они имеют следующие адреса:

- Адрес сервера A в Интернет 203.0.113.2. Программа сервера слушает порт 49094.
- Адрес роутера B в Интернет 203.0.113.5. Адрес роутера B в локальной сети 192.168.1.1.
- Адрес клиента C в локальной сети 192.168.1.5. Программа клиента занимает порт 50150, и посылает пакет к серверу по адресу 203.0.113.2:49094.
- Роутер B является шлюзом по умолчанию (default gateway) в своей локальной сети. То есть на него отправляются все пакеты с адресами не из текущей локальной сети.
- Роутер имеет таблицу преобразования адресов: (внутренний адрес: внутренний порт) (внешний адрес: внешний порт). Получив от клиента пакет к серверу 203.0.113.2:49094, роутер выделяет любой свободный внешний порт, например 52050, и создаёт запись в таблице преобразования адресов: 192.168.1.5:50150 203.0.113.5:52050.
- Роутер заменяет в пакете внутренний адрес отправителя 192.168.1.5:50150 на внешний адрес 203.0.113.5:52050, и передаёт изменённый пакет серверу.
- Сервер получает пакет с адресом отправителя 203.0.113.5:52050, и посылает ответ на этот адрес, то есть роутеру.
- Получив пакет от сервера, роутер ищет адрес получателя в своей таблице преобразования адресов, выполняет обратную замену внешнего адреса получателя 203.0.113.5:52050 на внутренний адрес 192.168.1.5:50150, и передаёт пакет по этому адресу, то есть клиенту.
- Если клиент отправляет серверу последующие пакеты, то роутер ищет по адресу отправителя есть ли уже в таблице такая запись, и если есть, то использует ранее выделенный внешний порт, в данном случае 52050.
- Таким образом клиент и сервер установили соединение через NAT, и могут начать игру. Но сервер не знает внутренний адрес клиента в его локальной сети, и считает что клиентом является роутер.
- Запись в таблице преобразования адресов действует определенный промежуток времени, как правило, 1-3 минуты. Поэтому клиенту и серверу нужно периодически обмениваться пакетами, чтобы связывающая их запись не была удалена. Если клиент пошлёт серверу новый пакет после удаления записи, то для новой записи на роутере может быть выделен другой внешний порт, и для сервера это будет уже другой клиент с другим адресом.

-
Полный конус (Full cone NAT).

- После того как в таблице преобразования адресов создана запись (внутренний адрес: внутренний порт) (внешний адрес: внешний порт), все пакеты от отправителя (внутренний адрес: внутренний порт) передаются через (внешний адрес: внешний порт) на любой адрес получателя.
- Любой внешний сервер может послать пакеты на (внутренний адрес: внутренний порт), отправляя пакеты на (внешний адрес: внешний порт).

- После того как в таблице преобразования адресов создана запись (внутренний адрес: внутренний порт) (внешний адрес: внешний порт), все пакеты от отправителя (внутренний адрес: внутренний порт) передаются через (внешний адрес: внешний порт) на любой адрес получателя.
- Внешний сервер (адрес сервера: порт сервера) может послать пакеты на (внутренний адрес: внутренний порт), отправляя пакеты на (внешний адрес: внешний порт), только если (внутренний адрес: внутренний порт) ранее посылал пакеты на (адрес сервера: любой порт).

- После того как в таблице преобразования адресов создана запись (внутренний адрес: внутренний порт) (внешний адрес: внешний порт), все пакеты от отправителя (внутренний адрес: внутренний порт) передаются через (внешний адрес: внешний порт) на любой адрес получателя.
- Внешний сервер (адрес сервера: порт сервера) может послать пакеты на (внутренний адрес: внутренний порт), отправляя пакеты на (внешний адрес: внешний порт), только если (внутренний адрес: внутренний порт) ранее посылал пакеты на (адрес сервера: порт сервера).

- Если один и тот же внутренний отправитель (внутренний адрес: внутренний порт) отправляет пакеты к разным получателям (адрес сервера: порт сервера), то для каждого адреса получателя будет выделен отдельный внешний порт, и будет использоваться отдельная запись в таблице преобразования адресов.
- Только внешний сервер (адрес сервера: порт сервера), который получил пакет от внутреннего отправителя (внутренний адрес: внутренний порт), может послать пакет обратно.
Например, к серверу A подключились два клиента C и E:

- Клиент C имеет внутренний адрес 192.168.1.5:50150 и внешний адрес 203.0.113.5:52050.
- Клиент E имеет внутренний адрес 192.168.2.5:50250 и внешний адрес 203.0.113.6:52060.
- Сервер должен сообщить каждому клиенту внешний адрес другого клиента.
- Обычно в роутерах используется NAT типа «Port-restricted cone NAT». Роутер пропускает клиенту пакеты только от того отправителя (IP-адрес и порт), которому клиент посылал пакеты ранее. И если клиент C пошлёт пакет клиенту E, то роутер D не пропустит этот пакет.
- В этом случае используется метод UDP hole punching. Оба клиента должны слать UDP-пакеты друг другу. Как только клиент C отправит пакет клиенту E, то роутер B будет готов принимать пакеты от клиента E. Аналогично, как только клиент E отправит пакет клиенту C, то роутер D будет готов принимать пакеты от клиента C. Первые пакеты того из клиентов, кто начал передавать первым, будут потеряны. Но как только второй клиент тоже начнёт передавать пакеты навстречу, то оба клиента смогут обмениваться пакетами.
- Но если на роутере используется «Симметричный NAT» (Symmetric NAT), то для каждого получателя будет выделен новый внешний порт. И, как правило, нет возможности узнать какой именно порт выделил роутер. Поэтому если хотя бы у одного из роутеров используется «Симметричный NAT» (Symmetric NAT), то установить соединение между клиентами будет невозможно.


Как я понимаю, единственный надёжный способ решить эти проблемы это передавать пакеты не напрямую между клиентами, а через сервер. Нужно или реализовать эту функцию в программе игры в рамках архитектуры «равный к равному», или реализовать архитектуру клиент-сервер.
Установление соединения между локальными сетями в Интернет
-
Как правило, ни один из игроков не имеет публичного IP-адреса, и игроки находятся в разных локальных сетях за NAT.


Протокол STUN позволяет клиенту, находящемуся за NAT, определить свой внешний IP-адрес и порт.
STUN сообщения передаются в UDP пакетах.
Клиент может обратиться к любому из публичных STUN-сервером. Список публичных STUN-серверов можно взять в Википедии. Или найти по запросу «public STUN servers list».
Чтобы игроки могли обмениваться своими адресами можно использовать свой публичный сервер. На схеме он называется сервер адресов (Address-server).
Что такое NAT замыкания на себя?
Предположим, что вы настроили IP-камеру, которую вы хотите получить доступ из любой точки мира через Интернет и иметь внешний IP-адрес, или адрес DDNS, чтобы получить доступ к камере. Вы проверили свою конфигурацию, когда я был вдали от дома, внешняя сеть, и все работало нормально,как и ожидалось. Но вы приходите домой и попытаться использовать те же адреса для доступа к камере и ничего не появляется, или хуже, Вы получаете сообщение об ошибке.
Вы можете быть свидетелями того, что называется замыкания на себя NAT. Эта особенность конфигурации маршрутизатора часто вызывает проблемы для новых пользователей и может быть очень разочаровывает. Это сообщение пытается объяснить, почему это происходит и что вы можете сделать, чтобы получить вокруг него.
Почему это происходит?
Для того, чтобы понять, что такое замыкания на себя NAT, Вы должны понять, как ваш маршрутизатор работает. См простой demostrada сети ниже.
Ваша камера и компьютер, вероятно, подключен к маршрутизатору (подключается непосредственно по кабелю, или через беспроводное соединение), является, от маршрутизатора, подключен к Интернету через поставщика услуг Интернета (Интернет-провайдер – Интернет-провайдер). Маршрутизатор имеет два IP-адреса: внутренний, который доступен только из вашей домашней сети (например 192.168.0.1) и который доступен из Интернета. Для удаленного доступа, вы вводите внешний IP-маршрутизатор, так как с помощью внутреннего IP не будет работать на внешней сети.
Ваша локальная сеть только понимает типа 192.168.x.x адреса. например, если вы набрали 192.168.0.2 нет браузера, ваша сеть должна понять, что вы пытаетесь получить доступ к камере и отправить информацию там. Всякий раз, когда требуется другой адрес (как внешний IP-адрес, в качестве 88.20.20.20 или веб-адрес, как minhacam.dydns.org) ваш маршрутизатор понимать, что этот адрес не давая вашей внутренней сети и отправляет информацию в Интернете.
однако, если этот внешний адрес (в качестве minhacam.dyndns.org), на самом деле, указывает на ваш домашний маршрутизатор, она будет признана и отправляемая информация передается обратно к маршрутизатору. в настоящее время, или маршрутизатор, то, направляет эту информацию обратно в правильное место во внутренней сети (в качестве IP-камеры) или устраняет пакеты ввода данных.
Одна из самых больших проблем замыкания на себя NAT Это то, что это часто не очевидно, что все настроено правильно. Некоторые маршрутизаторы продемонстрируют свою собственную страницу конфигурации, когда такой запрос был сделан по внутренней сети. Некоторые просто ничего не показывают, в то время как другие являются достаточно умны, чтобы признать, что вы пытаетесь сделать, и направит вас в нужное место.
Этот цикл называется авто-Retorno NAT (замыкания на себя NAT) и некоторые маршрутизаторы позволяют эту функцию, в то время как другие этого не делают. Если маршрутизатор поддерживает замыкания на себя NAT Вы не будете видеть это как проблему, так как ваша камера будет доступна из всех мест с тем же адресом, но так как вы читаете этот пост, ищет решение, потому что ваш IP-камеры не доступен, ваш маршрутизатор, вероятно, не поддерживает эту функцию.
Как я могу это исправить?
Есть просто исправить это. Это на усмотрение вашего маршрутизатора. Если маршрутизатор поддерживает замыкания на себя NAT, настолько велик! Всякий раз, когда вы вводите внешний адрес, будет иметь доступ к камере, как правило. Если ваш маршрутизатор не поддерживает этого, там не так много вы можете сделать.
Если ваш маршрутизатор не позволяет замыкания на себя NAT, ваш единственный вариант заключается в использовании ваш внешний адрес (minhacam.dyndns.org) для доступа к IP-камеры, когда вы не дома, и использовать локальный адрес (192.168.x.x), когда вы находитесь дома. Установите адреса любимые и это на самом деле не является проблемой, хотя разочарование.
Единственное, что нужно сделать, это получить маршрутизатор, который позволяет замыкания на себя NAT, хотя, часто, Характеристики маршрутизатора не говорят, если есть поддержка или нет, поэтому если вы хотите маршрутизатор с поддержкой замыкания на себя NAT, Вам придется обратиться к производителю.
Существует еще один из возможных решений, которая стремится изменить свой локальный адрес файла указать внешний адрес на внутренний адрес камеры. однако, это сложно, так что давайте иметь дело с этим в другом посте, позже.
What is NAT Loopback?

It is often dismissed as an issue not to be resolved; however, it affects almost anybody who runs their own server within their local network (or simply home network). If you have done any “port forwarding” in your router to access points in your local network, you might already have this situation.
NAT (Network Address Translation) loop-back occurs when somebody from within the local network tries to access the server computer using the external public IP address behind NAT enabled router.
When accessed externally, the router directs the traffic to the computer you “port forwarded” (which what NAT does). However, when accessed from the within the local network many routers discard the request or simply show the router page and do not apply the port forwarding rules that you have set.
So why do you need to overcome NAT loop-back? Simply because you don’t want to enter different IP addresses whenever you are within the local network or accessing your servers from the public IP address. For example, suppose your local IP address is 192.168.1.10, the server’s IP address is 192.168.1.17 and your public IP address is 211.533.77.33, if you browse to the server’s local IP address (192.168.1.17), you will find what you are looking for. However, if you use the external IP address, you will either get nothing or usually the routers configuration page. So, if you have a bookmark to your website, if it is working outside your local network, it won’t work inside which is quite annoying.
What are the solutions? The simplest solution is to check whether your router supports NAT loop-back. This setting is usually under either NAT or Security tabs of the router configuration pages. If it supports the feature enable it and your router will detect its public IP address and apply the forwarding rules for requests that spawn within the local network. If you router doesn’t have such a feature than the alternatives is a bit more tricky.
If you use a domain name to access your public IP address instead of directly entering 211.533.77.33, then you can overcome this issue by setting up a local DNS server. You can do this on any computer you wish. If you are using a Linux variant, the Ubuntu server guide has quick configuration page here. Simply follow it until “Reverse Zone File” section and then make sure your router uses the DNS server you’ve setup instead of some default values. Make sure when resolving the domain enter the local IP address of your server. If everything is done properly then when you enter your domain name it will be resolved to your server’s local IP address. You can test where the domain is pointing by using the “host [domain]” command on Linux based systems.
If the above options is not case and you only have a single computer which you usually use, you can modify the hosts file to manually let the computer resolve the domain name before even asking the DNS servers. It is very simple, just edit the /etc/hosts file and add a line in the format “[hostname] [IP Address]”. Now when you browse to that address your computer will automatically use the IP address you specified. If you have multiple computers and users in the network which you don’t want to edit their host files manually, especially for tablets and phones it is not possible anyway, you have to buy a new modem/router that supports NAT loop-back.