Linux服务器初始化:创建用户与用curl cip.cc查询公网IP
2026/9/9 20:20:12 网站建设 项目流程

在一台全新的 Linux 服务器上做初始化时,有两件看起来没关系的事经常要一起处理:一是创建普通用户并配置权限,二是查清楚这台服务器的公网 IP。前者属于用户管理,后者属于网络排查,但实际运维中它们往往出现在同一个任务里。比如要给新用户开通 SSH 登录,需要在安全组或云防火墙里放行来源 IP;要配置 API 回调地址,需要知道服务器的出口 IP;要申请 SSL 证书或设置 DNS 解析,同样需要先拿到公网 IP。curl cip.cc 是 Linux 运维中非常常用的公网 IP 查询方式,它把 HTTP 请求发出后,由远程服务端返回本次连接的公网出口地址。本文以一台新服务器为背景,把用户管理和 curl 查看公网 IP 串成一条完整操作链路。

1. 先理解公网 IP、私网 IP 和出口 IP 的区别

很多刚接触 Linux 服务器的人会有一个疑问:ip addr里明明能看到 IP,为什么还要用 curl 查询公网 IP?因为网卡上看到的地址,不一定是公网可达的地址。

1.1 三种 IP 分别是做什么的

在云服务器和机房服务器中,IP 地址通常分成三类概念:

  • 私网 IP:网卡上配置的、只在内网路由可达的地址,常见如10.x.x.x172.16.x.x192.168.x.x。云服务器默认拿到的一般是私网地址。
  • 公网 IP:互联网上可以路由和访问的地址。服务器本身可能没有在网卡上绑定公网 IP,而是通过平台的 NAT 或网关映射。
  • 出口 IP:服务器发起外部连接时,对目标服务器看到的源 IP。这个 IP 才是真正暴露在互联网上的地址。

ip addr看到的是本机网卡地址,用curl cip.cc看到的是出口公网 IP。在安全组配置、白名单管理、应用回源 IP 校验、DNS 解析绑定等场景中,真正需要的往往是后者。

1.2 用户管理中哪些环节需要知道公网 IP

用户管理看起来只是创建账号、设置密码、分配权限,但生产环境中每一步都可能涉及网络策略:

场景需要公网 IP 的原因常见动作
新用户 SSH 登录安全组需要放行用户来源 IP记录用户办公网络出口 IP 后加入白名单
开放管理端口防止公网任意 IP 扫描只允许指定访问来源
配置应用回调地址应用服务器需要访问外部 API,外部只认出口 IP将服务器出口 IP 配置到第三方平台
DNS 解析或 SSL 签发域名解析到哪个地址取决于服务器对外地址确认公网 IP 后再添加 A 记录
服务器上云防火墙云平台安全组规则通常按公网 IP 匹配用出口 IP 设置入方向规则

这意味着,用户管理和公网 IP 查询并不是两个孤立的知识点,而是服务器初始化流程中的前后环节。

2. 环境准备:确认 curl 可用、网络可出、用户管理工具完整

在跑查询命令之前,先确认环境满足最小要求。这里的学习环境推荐用一台全新的、可以访问外网的 Linux 服务器,发行版可以是 Ubuntu、Debian、CentOS、Rocky Linux 或 AlmaLinux。

2.1 最小环境要求与 curl 安装

需要满足的条件如下:

  • 系统已安装 Linux 发行版,普通用户和 root 用户均可操作。
  • 服务器可以访问外网,至少能访问 HTTP/HTTPS 服务。
  • 已安装curl工具,否则运行curl cip.cc会提示命令不存在。
  • 已有 root 权限或 sudo 权限,用于创建用户和修改 sudoers。

如果系统里没有 curl,根据发行版安装:

# Debian / Ubuntu apt update apt install -y curl # CentOS / Rocky / AlmaLinux yum install -y curl # 或者新版系统 dnf install -y curl

安装完成后先看版本:

curl --version

正常会输出 curl 版本、SSL 库和协议支持信息。不同版本对 HTTPS、IPv6、代理处理有差异,后面排查连接问题时需要参考这里。

2.2 确认网络可用性

很多运维新手会先ping一个域名,发现不同平台、不同安全组策略下表现差异很大。ping使用的是 ICMP 协议,很多云服务器在安全组里禁掉了 ICMP,但 HTTP/HTTPS 流量仍然正常。

更好的做法是直接用 curl 访问一个稳定的服务:

curl -I -m 5 https://www.baidu.com

如果返回 HTTP 响应头,说明外网可用。如果报超时或连接失败,再检查 DNS 和安全组,不要因为 ping 不通就判断网络故障。

2.3 学习环境与生产环境的要求差异

检查项学习环境生产环境
操作用户可以用 root 直接操作建议使用带 sudo 权限的普通用户
curl 安装缺什么装什么依赖通过配置管理工具统一安装并记录
公网 IP 查看查看后记在笔记里即可写入受控文件或配置中心,供脚本复用
用户管理创建测试用户、密码登录密钥登录、sudo 最小权限、审计日志
安全放行临时放行来源 IP按 IP 白名单和端口最小化放行

学习环境追求快速跑通,生产环境追求可追溯、最小权限、可回滚。

注意:curl 查询到的公网 IP 是出口 IP,不是服务器网卡上配置的私网 IP。两者在 NAT 环境下会不同,不要混用。

3. 用 cip.cc 查看公网 IP 的完整用法

cip.cc 是一个查看本机公网出口 IP 的简单服务。它的原理是:服务器发起 HTTP 请求到 cip.cc,服务端从 TCP 连接中取到源 IP,再把 IP、地理位置、运营商等信息返回给客户端。对于 Linux 运维来说,它适合人工快速查看,也适合写进初始化脚本。

3.1 先跑一条最简单的命令

直接执行:

curl cip.cc

常见输出类似下面这样(具体内容以实际返回为准):

IP : 1.2.3.4 地址 : 中国 北京 朝阳 运营商 : 电信 数据二 : 北京市 数据三 : 中国北京朝阳电信 URL : http://www.cip.cc/1.2.3.4

输出包含四类信息:

  • IP:当前出口公网 IP。
  • 地址:粗略地理位置。
  • 运营商:网络接入服务商。
  • URL:可以通过浏览器直接访问的 IP 详情页。

这条命令适合在终端人工查看,缺点是多行内容不好直接赋值给脚本变量。

3.2 在脚本里只提取 IP 字符串

日常写脚本时,往往只需要 IP 本身。可以用grepawk从输出中提取:

curl -s cip.cc | grep -E '^IP' | awk -F: '{print $2}' | tr -d ' '

命令拆解如下:

  • curl -s:静默输出,不显示进度条。
  • grep -E '^IP':找到以IP开头的行。
  • awk -F: '{print $2}':按冒号分割后取第二列。
  • tr -d ' ':删除可能存在的空格。

在脚本中赋值:

PUBLIC_IP=$(curl -s cip.cc | grep -E '^IP' | awk -F: '{print $2}' | tr -d ' ') echo "当前出口公网 IP: $PUBLIC_IP"

不过要注意,cip.cc 的输出格式可能随服务端调整,如果字段名或分隔符变化,解析逻辑需要同步更新。更稳妥的方案是使用只返回纯 IP 的服务,比如ifconfig.meip.sbipinfo.io/ipmyip.ipip.net。这类服务可以直接用,例如:

curl -s ifconfig.me
curl -s myip.ipip.net | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | head -n1

3.3 curl 参数按需组合

实际使用时,不建议直接裸敲curl cip.cc,而是根据场景加参数:

参数作用使用场景
-s静默模式,关闭进度条脚本、定时任务中必须加
-m 5最大超时时间 5 秒防止服务不可用导致脚本卡住
-L跟随重定向服务端返回 302/301 时使用
-4强制 IPv4服务器没有正确 IPv6 路由时使用
-6强制 IPv6需要查询 IPv6 出口地址时使用
-k跳过证书校验不要在公网查询中默认使用,只在调试内部服务时考虑

推荐的实际命令是:

curl -s -m 5 cip.cc

如果服务器启用了 IPv6 但 IPv6 路由有问题,可以加上-4

curl -s -4 -m 5 cip.cc

注意:脚本里所有外网请求都要设置超时时间。没有-m时,如果 DNS 无法解析或目标服务无响应,curl 可能长时间挂起,导致整个自动化流程阻塞。

4. 用户管理:从创建用户到记录服务器公网 IP

接下来进入本文的完整操作主线:在一台新服务器上完成用户管理,同时用 cip.cc 记录公网 IP。下面以创建一个名为deploy的普通用户为例。

4.1 创建用户并设置密码

使用 root 或 sudo 用户执行:

useradd -m -s /bin/bash deploy passwd deploy

参数说明:

  • -m:自动创建用户家目录/home/deploy。不加-m时,部分系统只创建账号,不生成家目录,会导致后续 SSH 公钥配置无法正常使用。
  • -s /bin/bash:指定登录 Shell。如果不指定,可能使用系统的 nologin 或默认 sh。
  • passwd deploy:交互式设置登录密码。

创建完成后验证用户信息:

id deploy groups deploy ls -ld /home/deploy

正常输出会显示 UID、GID 和主组,并且家目录属于deploy用户。

4.2 配置 sudo 权限时使用最小授权

给普通用户配置 sudo 权限,推荐通过独立配置文件实现,不要直接编辑/etc/sudoers主文件。执行:

visudo -f /etc/sudoers.d/deploy

在打开的文件中写入:

deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl

这段配置的含义是:允许deploy用户在所有主机上,以任意用户身份执行systemctl命令,并且不需要输入密码。

如果只是学习环境,想给完整 sudo 权限,可以按发行版把用户加入管理组:

# Debian / Ubuntu usermod -aG sudo deploy # CentOS / Rocky / AlmaLinux usermod -aG wheel deploy

默认组名称不同,原因来自各发行版的 PAM 配置差异。生产环境建议按实际业务只开放必要命令,避免普通用户拥有全部 sudo 权限。

4.3 用脚本完成“创建用户 + 记录公网 IP”的初始化流程

把用户管理和公网 IP 查询放在同一个初始化脚本中,适合在多台服务器上重复执行。下面是一个最小可运行示例:

#!/bin/bash set -euo pipefail if [ "$EUID" -ne 0 ]; then echo "请使用 root 执行此脚本" exit 1 fi USER_NAME="${1:-deploy}" if id "$USER_NAME" &>/dev/null; then echo "用户 $USER_NAME 已存在" else useradd -m -s /bin/bash "$USER_NAME" echo "已创建用户 $USER_NAME" fi # 配置 .ssh 目录 mkdir -p "/home/$USER_NAME/.ssh" chmod 700 "/home/$USER_NAME/.ssh" touch "/home/$USER_NAME/.ssh/authorized_keys" chmod 600 "/home/$USER_NAME/.ssh/authorized_keys" chown -R "$USER_NAME:$USER_NAME" "/home/$USER_NAME/.ssh" # 查询公网出口 IP 并记录到用户家目录 PUBLIC_IP=$(curl -s -m 5 cip.cc | grep -E '^IP' | awk -F: '{print $2}' | tr -d ' ') echo "$PUBLIC_IP" > "/home/$USER_NAME/public-ip.txt" chown "$USER_NAME:$USER_NAME" "/home/$USER_NAME/public-ip.txt" echo "公网 IP 已写入 /home/$USER_NAME/public-ip.txt: $PUBLIC_IP"

脚本关键点:

  • set -euo pipefail:遇到错误退出,避免脚本继续执行造成更严重后果。
  • 用户已存在时不重复创建,适合重复执行初始化脚本。
  • .ssh目录权限设置为700authorized_keys权限设置为600。权限过宽会导致 SSH 拒绝使用公钥登录。
  • 公网 IP 文件记录到用户家目录,方便后续应用读取。

执行方式:

chmod +x init_user.sh ./init_user.sh deploy

如果脚本放在服务器上执行,注意不要向外部输出密码或其他敏感信息。

4.4 登录授权:放置公钥与记录来源 IP

生产环境推荐关闭普通用户密码登录,改用 SSH 公钥。将本机生成的公钥追加到目标服务器:

ssh-copy-id deploy@服务器地址

或者手动追加到 authorized_keys:

mkdir -p /home/deploy/.ssh echo "ssh-rsa AAAA... deploy@client" >> /home/deploy/.ssh/authorized_keys chmod 600 /home/deploy/.ssh/authorized_keys chown -R deploy:deploy /home/deploy/.ssh

这里公网 IP 的作用就体现出来了:如果安全组限制 SSHD 端口只允许特定来源访问,那么用户登录前,要先把用户所在网络的出口 IP 加入白名单。否则密钥正确也无法建立 TCP 连接。

5. 运行验证:从上一条命令的结果反推每一项是否成功

很多教程只讲命令,不讲怎么确认命令成功。下面把每一步的验证方式列出来。

5.1 用户和权限验证

id deploy

预期输出包含:uid=1001(deploy) gid=1001(deploy) groups=1001(deploy)

sudo -l -U deploy

这个命令会列出deploy用户当前可用的 sudo 权限。如果看到刚才配置的/usr/bin/systemctl,说明 sudoers 规则已生效。

查看家目录归属:

ls -ld /home/deploy

预期输出:drwx------ 3 deploy deploy 4096 ...

5.2 公网 IP 记录验证

查看脚本写入的结果:

cat /home/deploy/public-ip.txt

再执行一次原始查询,确认两次结果是否一致:

curl -s -m 5 cip.cc

如果两次结果不同,说明服务器出口是动态 IP 或者存在多线路负载,应引起注意。

5.3 命令行常见异常输出对照

把实际运行中可能出现的结果汇总成一张表:

现象可能原因检查方式处理建议
curl: command not found系统未安装 curlwhich curl按发行版安装 curl
curl: (6) Could not resolve hostDNS 解析失败cat /etc/resolv.conf配置可用的 DNS 并确认网络可达
curl: (35) TCP connection reset by peer连接被防火墙或 TLS 层中断检查安全组、代理、TLS 版本先确认 curl 是否能访问其他 HTTPS 站点
curl: (35) schannel: next InitializeSecurityContext failed: SEC_E_INVALID_TOKENWindows 本地 curl 与服务端 TLS 协商异常检查本地时间和 curl 版本优先使用 Linux 服务器执行命令,或更新 curl
命令长时间卡住未设置超时参数查看进程状态脚本中加-m 5
useradd: user deploy exists用户已存在id deploy代码判断用户是否已存在

6. 常见错误排查:从输出倒推网络和用户问题

生产中遇到问题时,不要盲目重装系统或改文件,按链路先后排查:输入参数、网络连通性、DNS、TLS、权限、配置。

6.1 curl: (6) Could not resolve host:DNS 出了问题

现象:

curl: (6) Could not resolve host: cip.cc

排查顺序:

  1. 查看当前 DNS 配置:
cat /etc/resolv.conf
  1. 尝试用 IP 访问外部服务确认网络链路是否通。

  2. 检查系统是否使用 systemd-resolved:

systemctl status systemd-resolved
  1. 修改 DNS 配置文件后重启网络服务,或者使用临时方案:
echo "nameserver 223.5.5.5" > /etc/resolv.conf

注意:/etc/resolv.conf可能被 NetworkManager 或 systemd-resolved 覆盖,直接修改后重启网络可能丢失。

解决方法因发行版而异,核心原则是确认本机可以解析域名,然后再排查 curl 自身配置。

6.2 curl: (35) TCP connection reset by peer:连接或 TLS 被重置

curl: (35)是 TLS/SSL 会话层错误,常见表现是握手阶段连接被对端重置。可能原因有:

  • 本地防火墙或云安全组阻断了到目标服务器的 443 端口。
  • 本地网络出口设备对 TLS 流量做了特殊处理。
  • curl 使用的 TLS 版本与目标服务不匹配。
  • 服务器当前时间不正确,导致证书校验失败。

排查方式:

curl -v -m 5 https://cip.cc

观察输出中卡在哪个阶段。如果卡在TCP_NODELAY之后的连接阶段,说明是网络层问题;如果卡在SSL connectionCAfile阶段,说明是 TLS 层问题。

可以先对比访问普通站点:

curl -I -m 5 https://www.baidu.com

如果普通 HTTPS 站正常,只有个别站点报错,优先考虑目标服务或本地网络策略问题。

6.3 cip.cc 输出解析不到 IP 字符串

当脚本执行后PUBLIC_IP为空,最常见原因是 cip.cc 输出格式变化或返回内容不是预期文本。先手动查看:

curl -s -m 5 cip.cc

如果返回的是 HTML 页面或格式变化,就不要再硬写解析规则,改用纯 IP 服务。快速验证:

curl -s -m 5 ifconfig.me
curl -s -m 5 myip.ipip.net

选择服务时建议保留至少两个备选,避免单一服务故障导致初始化脚本失败。

6.4 用户创建成功但无法登录或 sudo 失败

检查以下几项:

问题现象检查目标操作
SSH 登录失败账户是否被锁定passwd -S deploy
登录后被退出Shell 是否有效grep deploy /etc/passwd
sudo 命令找不到用户是否加入管理组groups deploy
sudo 报权限错误sudoers 配置语法错误使用visudo -c检查配置
SSH 公钥登录被拒绝家目录和 authorized_keys 权限确认.ssh为 700、authorized_keys 为 600

这个问题在手动修改 sudoers 文件时最常出现。sudoers 语法一旦写错,可能导致所有用户无法执行 sudo,因此必须使用visudo编辑,它会在保存时检查语法。

注意:排查顺序应优先确认输入和网络链路,再查配置和权限。不要一上来就怀疑系统被入侵或删除日志,先看错误码和可达性。

7. 最佳实践:让 curl、用户管理和公网 IP 查询更可靠

7.1 公网 IP 查询的维护建议

不要让脚本直接依赖单一服务。推荐做法:

  1. 脚本里设置至少两个查询服务,第一个失败时自动切换备选。
  2. 所有 curl 请求加上-s -m 5,避免阻塞。
  3. 查询结果写入固定文件,不要每次动态请求。
  4. 如果服务器使用弹性公网 IP,IP 变化后要触发相关配置更新。
  5. 定期复核出口 IP 文件与实际出口 IP 是否一致,可以在 cron 中执行:
*/30 * * * * /usr/local/bin/check_public_ip.sh

check_public_ip.sh 内部可以比较当前出口 IP 与已存文件,不一致时更新并通知运维。

7.2 用户管理的生产级建议

以下建议比“记得创建用户”更有价值,是实际项目中需要养成的习惯:

  • 新用户默认使用useradd -m -s /bin/bash创建,并立即设置密码过期策略。
  • 禁止普通用户直接修改/etc/sudoers,所有变更通过/etc/sudoers.d/添加。
  • 生产服务器优先使用 SSH 公钥登录,密码只在需要时临时开启。
  • 用户管理操作通过配置管理工具执行,保证多台机器配置一致,避免手工漂移。
  • 为关键用户配置审计,记录命令历史,例如增加sudo日志输出。
  • 业务账号与个人账号分离,避免多人共用同一个rootdeploy账号。

7.3 可复用的初始化检查清单

每次初始化服务器时,按下面的清单走一遍,可以避免遗漏核心步骤:

检查项命令预期结果
公网出口 IPcurl -s -m 5 cip.cc可见 IP、地址、运营商
纯 IP 提取curl -s -m 5 ifconfig.me只返回 IP 字符串
用户创建id deployUID/GID 正常
家目录生成ls -ld /home/deploy目录存在且属主正确
SSH 目录权限ls -l /home/deploy/.ssh.ssh目录 700,authorized_keys 600
sudo 权限sudo -l -U deploy能看到授权命令
DNS 可达性nslookup cip.cc正常返回解析结果
HTTPS 可达性curl -I -m 5 https://cip.cc返回 HTTP 响应头

这个清单同时覆盖了用户管理和公网 IP 查询两条主线,适合作为新服务器巡检脚本的初始版本。

8. 扩展方向:从查看 IP 到自动化和配置管理

curl cip.cc 只是公网 IP 查询的入口,真正有价值的是把查询结果应用到自动化流程中。比如如下几个扩展方向:

  • 结合云平台 API:如果服务器绑定弹性公网 IP,可以先调用云平台接口确认当前 IP 与本地查询结果是否一致,用于排查 NAT 或网卡绑定异常。
  • 接入配置中心:把出口 IP 写入配置中心,应用启动时从配置中心读取自己的回调地址,而不是在每台服务器上分散维护。
  • 与安全策略联动:安全组规则中限制 SSHD、Redis、MySQL 等管理端口只允许已知来源 IP,这时“查询来源 IP”和“用户管理”会持续联动。
  • 定时巡检脚本:把公网 IP、用户列表、sudoers 内容导入巡检系统,出现异常时自动告警。
  • 结合日志审计:在用户创建、sudo 授权、公网 IP 变更三个关键操作上增加日志留痕,方便事后追踪。

每一项都依赖一个基本功:先熟练掌握单台服务器上的命令用法,再通过脚本和配置管理工具把单点操作变成标准化动作。对于刚进入运维领域的人来说,这篇内容中最重要的不是记住 cip.cc 这个网址,而是理解“公网 IP 是出口地址,用户管理需要结合网络策略一起规划”这层关系。先把单台机器上的查询、创建、授权、验证跑通,再向批量化和平台化扩展,不会走偏。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询