跳到正文

腾讯轻量应用服务器 ifconfig 没有公网 IP

网友提供23 条回复

小弟以学生优惠购入一台腾讯轻量应用服务器,目前正在学习 Linux C++开发,今天在学习 socket 编程,代码也是很简单的代码:

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

static bool stop = false;

static void handle_term(int sig)
{
    stop = true;
}

int main(int argc, char *argv[])
{
    signal(SIGTERM, handle_term);

    if (argc <= 3)
    {
        printf("usage: %s ip_address port_number backlog\n", basename(argv[0]));
        return 1;
    }

    const char *ip = argv[1];
    int port = atoi(argv[2]);
    int backlog = atoi(argv[3]);

    int sock = socket(AF_INET, SOCK_STREAM, 0);
    assert(sock >= 0);

    struct sockaddr_in address;
    bzero(&address, sizeof(address));
    address.sin_family = AF_INET;
    inet_pton(AF_INET, ip, &address.sin_addr);
    address.sin_port = htons(port);

    int ret = bind(sock, (struct sockaddr *)&address, sizeof(address));
    assert(ret != -1);

    ret = listen(sock, backlog);
    assert(ret != -1);

    while (!stop)
    {
        sleep(1);
    }

    close(sock);
    return 0;
}

g++ -o main main.cpp后,终端运行./main 公网 IP 12345 5 ,然后就在bind后面 assert 退出了,bind 失败。确定代码没问题,我直接把可执行文件传到 Digitalocean 的机器上,运行程序,成功。

纳闷了,然后两台机器 ifconfig,DO 的机器出现了公网 IP,腾讯的没出现公网 IP,只有内网的 IP 和 localhost,我就在腾讯上 ./main 内网 IP 12345 5,能运行!,DO 上 telnet 腾讯的公网 IP,成功?!!!

还有这种操作?我在内网 IP 上 bind,结果给我“映射”到公网 IP 上了,这是咋做到的,为啥不让我 bind 公网的 IP 嘞

回复

adoal

没听说过 NAT 吗

PeacePeach

@julyclyde
@msaionyc 两位已 b

Foxkeh

同样的阿里云现在新购买的主机只能选择专有网络,ifconfig 也是这样了。
根据阿里云官网文档解释这种更安全一些

freecloud

用显示的内网 IP,试试。

msaionyc

@julyclyde 最后一句那个“也就是”让我笑了半天

julyclyde

@mutoudaren 现在的人认识计算机都是以 docker 为标准模型了嘛

opentrade

Aws EC2 里看到的也是内网 IP 和 127.0.0.1 。Vultr 的 VPS 看到的倒是公网 IP 。

mutoudaren

我猜跟 docker 一个原理。你在 docker 容器里面也是只有内网 ip,但是如果在容器里面 bind 0.0.0.0 。然后 docker run 的时候指定端口绑定,也可以在外部通过访问 host 的 ip 来访问 docker 容器内部。

所以云主机本身应该也就是一个高级的”docker 容器“

Xusually

直接 bind 0.0.0.0 即可

mightofcode

阿里的轻量也这样
我记得以前不是这样的

jedihy

大厂 SDN 都是这样的。你本机没有那个 IP 所以你是不可能直接 bind 上去的。bind wildcard 或者 external nic 的 IP 都行。

no1xsyzy

你想多了,你内网不 bind 直接 telnet 公网 IP 也会收到(控制台屏蔽除外)

billlee

云服务器的网络都是复杂的 SDN

试试 arping, 你会发现这个内网接口还有 arp 代理

baoshuo

好多大厂这样,一般监听 0.0.0.0 即可。

dreamage

一对一 NAT

Tink

弹性吧

phithon

和轻量没关系,云主机都是这个样

Muninn

都这样

westoy

绑定 0.0.0.0

OysterQAQ

大厂都这样 弹性 ip 随时分离添加

↑