手机版 收藏 导航

Linux下如何判断当前机器使用的是内网IP还是公网IP

原创   www.link114.cn   2023-07-23 16:19:25

Linux下如何判断当前机器使用的是内网IP还是公网IP

在日常网络开发和系统管理中,能够准确判断当前机器使用的IP地址是内网IP还是公网IP是一项非常重要的技能。这不仅可以帮助我们更好地理解系统的网络环境,也有助于我们针对不同的网络环境采取相应的措施,提高应用程序的健壮性和安全性。

那么,在Linux系统下,我们如何才能判断当前机器使用的是内网IP还是公网IP呢?下面就让我们一起探讨一下相关的方法。

在Linux系统中,可以使用 ip addr 命令来查看当前机器的网络接口信息,包括IP地址。通过分析输出结果,我们可以判断当前使用的IP地址是内网IP还是公网IP。一般来说,以 192.168.172.16.-172.31.10. 开头的IP地址都属于内网IP,而其他的IP地址则属于公网IP。

除使用 ip addr 命令,我们还可以使用 curl 命令来判断当前机器使用的IP地址是内网IP还是公网IP。具体做法是,我们可以访问一些公开的IP查询服务,通过分析返回的结果来确定IP地址的性质。例如,我们可以执行以下命令:

curl http://ipecho.net/plain
curl http://icanhazip.com
curl https://api.ipify.org

这些服务会返回当前机器使用的公网IP地址。返回的IP地址与 ip addr 命令输出的IP地址不一致,那么就说明当前机器使用的是内网IP。

除使用命令行工具,我们还可以使用编程语言来判断当前机器使用的IP地址是内网IP还是公网IP。下面是一个使用 Python 语言实现的简单示例:

import socket
import requests

def is_public_ip(ip):
    """
    判断IP地址是否为公网IP
    """
    ip_prefix = ip.split('.')[0:2]
    if ip_prefix == ['10'] or \
       (ip_prefix == ['172'] and 16 <= int(ip.split('.')[1]) <= 31) or \
       (ip_prefix == ['192'] and ip.split('.')[1] == '168'):
        return False
    else:
        try:
            response = requests.get(f'https://ipinfo.io/{ip}/json')
            data = response.json()
            if data['country'] != 'CN':
                return True
            else:
                return False
        except:
            return True

# 获取当前机器的IP地址
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
current_ip = s.getsockname()[0]
s.close()

# 判断当前IP地址是否为公网IP
if is_public_ip(current_ip):
    print(f'当前机器使用的是公网IP: {current_ip}')
else:
    print(f'当前机器使用的是内网IP: {current_ip}')

这个脚本首先获取当前机器的IP地址,通过分析IP地址的前缀来判断是否为内网IP。不是内网IP,则再通过调用 ipinfo.io 的API来确认是否为公网IP。使用这种方式,我们可以更准确地判断当前机器使用的IP地址类型。

在Linux系统下判断当前机器使用的IP地址是内网IP还是公网IP,可以使用 ip addr 命令、curl 命令,或者编写自定义的 Python 脚本等方法。不同的方法各有优缺点,需要根据具体场景和需求来选择合适的方式。希望本文对您有所帮助。