Как посмотреть какой порт открыл роутер

Если я сделаю следующее:

UdpClient c = new UdpClient();
c.Connect(new System.Net.IPEndPoint(IPAddress.Parse("69.65.85.125"), 9900));
c.Send(new byte[] { 1,2,3,4,5 }, 5);

затем я отправлю пакет на мой маршрутизатор, затем мой маршрутизатор отправит этот пакет на ip "69.65.85.125".

Если я захочу перехватить этот пакет на компьютере с IP-адресом "69.65.85.125", я смогу увидеть порт, который был заблокирован маршрутизатором (client.RemoteEndpoint). Как можно будет увидеть эту информацию без захвата пакета в другом месте? Есть ли способ запросить роутер?

2 ответа

Решение

Если ваш маршрутизатор поддерживает это, вы можете запросить его через UPnP. Вот библиотека-обертка для UPnP, которую я нашел для.NET, я никогда не использовал ее, поэтому не могу дать вам никаких советов, хорошо это или нет.

Посмотрите на программу ComponetsTest для примера кода в zip для библиотеки. Вам нужно будет обратиться к документации UPnP, чтобы узнать, какие вызовы вам понадобятся для обслуживания.

С доски объявлений библиотеки кто-то спрашивает, как найти сопоставления портов.

Службы WANPPPConnection и WANIPConnection имеют действия, называемые GetSpecificPortMappingEntry, просто вызывайте эту итерацию по индексам от 0 до тех пор, пока не будет возвращена ошибка, каждый вызов будет возвращать другое сопоставление портов UPnP, вы также можете получить статические сопоставления с другим сервисом.

Чтобы получить общедоступный IP-адрес, удаленное устройство должно ответить, отправив обратно пакет UDP, содержащий IP-адрес и порт, который он видел. Это одна из самых фундаментальных концепций сервера STUN, обычно используемая в алгоритмах пробивания дырок UDP.

Есть несколько бесплатных серверов STUN, которые делают именно это. Отправьте одному из них запрос "связывания", и вы получите ответ с вашим публичным IP-адресом и портом.

stun.l.google.com:19302
stun1.l.google.com:19302
stun2.l.google.com:19302
stun3.l.google.com:19302
stun4.l.google.com:19302
stun01.sipphone.com
stun.ekiga.net
stun.fwdnet.net
stun.ideasip.com
stun.iptel.org
stun.rixtelecom.se
stun.schlund.de
stunserver.org
stun.softjoys.com
stun.voiparound.com
stun.voipbuster.com
stun.voipstunt.com
stun.voxgratia.org
stun.xten.com

Если вы действительно заинтересованы в правильном перфорировании UDP, ознакомьтесь с http://en.wikipedia.org/wiki/Interactive_Connectivity_Establishment. Это блестящий алгоритм, который использует STUN и другой протокол, называемый TURN, чтобы гарантировать успешное соединение между узлами. (Apple использует его для видеозвонков Facetime, среди других.)

Если вам интересно, компания, в которой я работаю, разработала продукт под названием IceLink, который использует ICE/STUN/TURN для установления прямых потоков данных между узлами. SDK доступны для.NET, Mac, iOS, Android, Java, Windows Phone, Windows 8, Unity, Xamarin и других, и даже включают полную поддержку потоков аудио / видео WebRTC.

Другие вопросы по тегам