Назад | Перейти на главную страницу

Не могу подключиться к моей машине через публичный IP

Я не мог понять, почему я не могу установить соединение через публичный IP-адрес. При использовании локального IP работает.

У меня есть соответствующие исключения для портов брандмауэра, а NAT моего маршрутизатора имеет конфигурации для переадресации портов на мою машину.

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

Любая помощь? (Я также установил сервер nginx, к которому нельзя получить доступ с общедоступного IP-адреса, но работает через локальный)

Клиент:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main()
{
    sockaddr_in address;
    int res;
    int sfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (-1 == sfd)
    {
        perror("cannot create socket");
        exit(EXIT_FAILURE);
    }

    memset(&address, 0, sizeof(address));

    address.sin_family = AF_INET;
    address.sin_port = htons(6511);
    res = inet_pton(AF_INET, "201.93.179.98", &address.sin_addr); /* connect through public IP doesn't work */
    //res = inet_pton(AF_INET, "192.168.1.71", &address.sin_addr);

    if (0 > res)
    {
        perror("error: first parameter is not a valid address family");
        close(sfd);
        exit(EXIT_FAILURE);
    }
    else if (0 == res)
    {
        perror("char string (second parameter does not contain valid ipaddress)");
        close(sfd);
        exit(EXIT_FAILURE);
    }

    if (-1 == connect(sfd, (sockaddr *)&address, sizeof(address)))
    {
        perror("connect failed");
        close(sfd);
        exit(EXIT_FAILURE);
    }

    /* perform read write operations ... */
    char msg[] = "Hello World";
    write(sfd, (void *)msg, sizeof(msg));
    printf("sent %s\n", msg);

    shutdown(sfd, SHUT_RDWR);

    close(sfd);
    return EXIT_SUCCESS;
}

Сервер:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main()
{
    sockaddr_in address;
    int sfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    if(-1 == sfd)
    {
        perror("can not create socket");
        exit(EXIT_FAILURE);
    }

    memset(&address, 0, sizeof(address));

    address.sin_family = AF_INET;
    address.sin_port = htons(6511);
    address.sin_addr.s_addr = inet_addr("192.168.1.71"); /* serve on given interface */

    if(-1 == bind(sfd, (sockaddr *)&address, sizeof(address)))
    {
        perror("error bind failed");
        close(sfd);
        exit(EXIT_FAILURE);
    }

    if(-1 == listen(sfd, 10))
    {
        perror("error listen failed");
        close(sfd);
        exit(EXIT_FAILURE);
    }

    for(;;)
    {
        int cfd = accept(sfd, NULL, NULL);

        if(0 > cfd)
        {
            perror("error accept failed");
            close(sfd);
            exit(EXIT_FAILURE);
        }

        /* perform read write operations ... 
           read(cfd,buff,size)*/
        char msg[100] = {};
        read(cfd, (void *)msg, sizeof(msg));
        printf("got %s\n", msg);

        if (-1 == shutdown(cfd, SHUT_RDWR))
        {
            perror("can not shutdown socket");
            close(cfd);
            close(sfd);
            exit(EXIT_FAILURE);
        }
        close(cfd);
    }

    close(sfd);
    return EXIT_SUCCESS;  
}

Вам необходимо настроить маршрутизатор / брандмауэр на разрешить шпильки NAT. Если у вас есть маршрутизатор SOHO, он, скорее всего, этого не поддерживает. Если у вас есть что-то вроде Cisco ASA, вам следует прочитать документацию.