尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Linux服务器初始化:创建用户与用curl cip.cc查询公网IP

Linux服务器初始化:创建用户与用curl cip.cc查询公网IP 在一台全新的 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 路由有问题可以加上-4curl -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_keysmkdir -p /home/deploy/.ssh echo ssh-rsa AAAA... deployclient /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预期输出包含uid1001(deploy) gid1001(deploy) groups1001(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按发行版安装 curlcurl: (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 5useradd: user deploy exists用户已存在id deploy代码判断用户是否已存在6. 常见错误排查从输出倒推网络和用户问题生产中遇到问题时不要盲目重装系统或改文件按链路先后排查输入参数、网络连通性、DNS、TLS、权限、配置。6.1 curl: (6) Could not resolve hostDNS 出了问题现象curl: (6) Could not resolve host: cip.cc排查顺序查看当前 DNS 配置cat /etc/resolv.conf尝试用 IP 访问外部服务确认网络链路是否通。检查系统是否使用 systemd-resolvedsystemctl 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/passwdsudo 命令找不到用户是否加入管理组groups deploysudo 报权限错误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避免阻塞。查询结果写入固定文件不要每次动态请求。如果服务器使用弹性公网 IPIP 变化后要触发相关配置更新。定期复核出口 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 可复用的初始化检查清单每次初始化服务器时按下面的清单走一遍可以避免遗漏核心步骤检查项命令预期结果公网出口 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目录 700authorized_keys 600sudo 权限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 是出口地址用户管理需要结合网络策略一起规划”这层关系。先把单台机器上的查询、创建、授权、验证跑通再向批量化和平台化扩展不会走偏。
返回列表