在一台全新的 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.x、172.16.x.x、192.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 本身。可以用grep和awk从输出中提取:
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.me、ip.sb、ipinfo.io/ip、myip.ipip.net。这类服务可以直接用,例如:
curl -s ifconfig.mecurl -s myip.ipip.net | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | head -n13.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目录权限设置为700,authorized_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 | 系统未安装 curl | which curl | 按发行版安装 curl |
curl: (6) Could not resolve host | DNS 解析失败 | 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_TOKEN | Windows 本地 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排查顺序:
- 查看当前 DNS 配置:
cat /etc/resolv.conf尝试用 IP 访问外部服务确认网络链路是否通。
检查系统是否使用 systemd-resolved:
systemctl status systemd-resolved- 修改 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 connection或CAfile阶段,说明是 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.mecurl -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 查询的维护建议
不要让脚本直接依赖单一服务。推荐做法:
- 脚本里设置至少两个查询服务,第一个失败时自动切换备选。
- 所有 curl 请求加上
-s -m 5,避免阻塞。 - 查询结果写入固定文件,不要每次动态请求。
- 如果服务器使用弹性公网 IP,IP 变化后要触发相关配置更新。
- 定期复核出口 IP 文件与实际出口 IP 是否一致,可以在 cron 中执行:
*/30 * * * * /usr/local/bin/check_public_ip.shcheck_public_ip.sh 内部可以比较当前出口 IP 与已存文件,不一致时更新并通知运维。
7.2 用户管理的生产级建议
以下建议比“记得创建用户”更有价值,是实际项目中需要养成的习惯:
- 新用户默认使用
useradd -m -s /bin/bash创建,并立即设置密码过期策略。 - 禁止普通用户直接修改
/etc/sudoers,所有变更通过/etc/sudoers.d/添加。 - 生产服务器优先使用 SSH 公钥登录,密码只在需要时临时开启。
- 用户管理操作通过配置管理工具执行,保证多台机器配置一致,避免手工漂移。
- 为关键用户配置审计,记录命令历史,例如增加
sudo日志输出。 - 业务账号与个人账号分离,避免多人共用同一个
root、deploy账号。
7.3 可复用的初始化检查清单
每次初始化服务器时,按下面的清单走一遍,可以避免遗漏核心步骤:
| 检查项 | 命令 | 预期结果 |
|---|---|---|
| 公网出口 IP | curl -s -m 5 cip.cc | 可见 IP、地址、运营商 |
| 纯 IP 提取 | curl -s -m 5 ifconfig.me | 只返回 IP 字符串 |
| 用户创建 | id deploy | UID/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 是出口地址,用户管理需要结合网络策略一起规划”这层关系。先把单台机器上的查询、创建、授权、验证跑通,再向批量化和平台化扩展,不会走偏。