Skip to content

网络通信

网络通信是Linux系统中重要的功能之一,它允许计算机与其他设备进行数据交换和通信。Linux提供了丰富的网络命令工具,用于配置网络接口、测试网络连接、管理网络路由、监控网络流量等。

本章节将详细介绍Linux系统中常用的网络通信命令,包括网络连接测试工具(如ping)、网络配置工具(如ip、ifconfig)、网络路由管理工具(如route)、网络流量监控工具(如iftop、tcpdump)等。通过学习这些命令,您将能够有效地管理和排查Linux系统的网络问题。

ping - 网络连接测试工具

ping(Packet Internet Groper)是用于测试网络连接性的基础工具,通过发送 ICMP回显请求 数据包到目标主机,并等待其返回回显应答。

语法格式

bash
ping [选项] 目标主机

选项

选项说明
-c <次数>指定发送的 ICMP 请求次数(如 -c 5 发送 5 次后自动停止)
-i <秒数>设置发送间隔时间(默认 1 秒,需 root 权限设置 <0.2 秒)
-s <字节数>指定发送的数据包大小(默认 56 字节,最大 65507)
-t <TTL>设置数据包的生存时间(TTL),限制经过的路由器跳数
-W <秒数>设置等待响应的超时时间(默认无限制)
-q静默模式,只显示统计结果
-f洪水模式(快速连续发送,需 root 权限,慎用!)
-4 / -6强制使用 IPv4 或 IPv6
-I <网卡名>指定发送数据包的网络接口(如 -I eth0
-D在时间戳前显示 Unix 时间

经典案例

1. 基本连通性测试

bash
ping google.com          # 持续测试直到手动停止(Ctrl+C)
ping -c 4 192.168.1.1    # 发送 4 次请求后自动停止
ping -s 1000 example.com # 发送 1000 字节的数据包(含 8 字节 ICMP 头)
ping -i 0.1 -c 50 192.168.1.1  # 每 0.1 秒发送一次,共 50 次
ping -t 5 google.com     # 限制 TTL=5,检测路径中的路由器响应
ping -W 2 example.com    # 设置 2 秒超时,检测高延迟网络
ping -q -c 10 8.8.8.8    # 只显示最终统计结果(丢包率、平均延迟)
sudo ping -f 192.168.1.1  # 高速发送请求(需 root 权限,谨慎使用!)
ping -I wlan0 google.com  # 通过无线网卡发送请求

IP - 网络配置工具

ip命令是iproute2软件包提供的现代网络配置工具,用于替代传统的ifconfigroute等命令。它提供了更强大的功能和更一致的语法。

语法格式

bash
ip [ OPTIONS ] OBJECT { COMMAND | help }

选项

选项说明
-s, -stats显示详细统计信息
-d, -details显示详细信息
-c, -color彩色输出
-4仅IPv4
-6仅IPv6
-h, -human人类可读格式

经典案例

bash
ip link show								# 查看所有网络接口
ip addr show								# 查看IP地址信息
ip link set eth0 up							# 启用网络接口
ip link set eth0 down						# 禁用网络接口
ip addr add 192.168.1.100/24 dev eth0		# 添加IP地址
ip addr del 192.168.1.100/24 dev eth0		# 删除IP地址
ip route show								# 查看路由表
ip route add 192.168.2.0/24 via 192.168.1.1	# 添加路由
ip route del 192.168.2.0/24					# 删除路由
ip neigh show								# 查看ARP缓存

ifup - 激活网卡

激活指定的网络接口(根据 /etc/network/interfaces 配置)

语法格式

bash
ifup <接口> [选项]

选项

选项作用
-a激活所有配置为 auto 的接口
--force强制激活(即使接口已启用)
-v显示详细操作信息

经典案例

bash
ifup eth0				# 激活 eth0 接口
ifup -a					# 激活所有自动配置的接口
ifup --force wlan0		# 强制重新激活已启用的 wlan0

ifdown - 停止网卡

停用指定的网络接口(根据 /etc/network/interfaces 配置

语法格式

bash
ifdown <接口> [选项]

选项

选项作用
-a停用所有配置为 auto 的接口
--force强制停用(即使有其他依赖)
-v显示详细操作信息

经典案例

bash
ifdown eth0 			# 停用 eth0 接口
ifdown -a				# 停用所有自动配置的接口
ifdown --force wlan0	# 强制停用正在使用的 wlan0

注意事项

  1. 依赖关系:停用接口会断开所有相关网络连接

  2. 配置文件:需与 /etc/network/interfaces 中的配置匹配

  3. 系统兼容性

    • 旧版系统(Debian/Ubuntu):直接使用

    • 新版系统(使用 NetworkManager):可能需要先禁用 NM 管理:

      bash
      sudo nmcli dev set <接口> managed no

ifconfig - 配置和显示网络接口信息

ifconfig(interface configuration)是 Linux 系统中用于配置和显示网络接口信息的传统命令,属于 net-tools 软件包。虽然在新系统中逐渐被 ip 命令取代,但仍广泛使用。

  • 显示/配置网络接口参数(IP地址、子网掩码、MAC地址等)
  • 启用/禁用网络接口
  • 设置接口的MTU等高级参数

语法格式

bash
ifconfig [接口名] [选项] [地址参数]

选项

选项说明
up激活网络接口
down禁用网络接口
netmask设置子网掩码
broadcast设置广播地址
hw设置硬件地址(MAC)
mtu设置最大传输单元
-a显示所有接口(包括未激活的)

经典案例

bash
ifconfig -a											# 显示所有接口信息
ifconfig eth0										# 查看指定网卡信息
ifconfig eth0 up      								# 启用
ifconfig eth0 down    								# 禁用
ifconfig eth0 192.168.1.100 netmask 255.255.255.0	# 配置IP地址和子网掩码
ifconfig eth0 hw ether 00:11:22:33:44:55			# 设置MAC地址

netstat - 网络连接和统计信息查看工具

命令简介

netstat(network statistics)是一个功能强大的网络信息查看工具,用于显示网络连接、路由表、接口统计等信息。虽然在新版Linux中逐渐被ss命令取代,但仍然是广泛使用的网络诊断工具。

语法格式

bash
netstat [选项]

选项

选项描述示例
-a显示所有连接和监听端口netstat -a
-t显示TCP连接netstat -t
-u显示UDP连接netstat -u
-n以数字形式显示地址和端口netstat -n
-l仅显示监听端口netstat -l
-p显示进程ID/程序名netstat -p
-r显示路由表netstat -r
-s显示网络统计信息netstat -s
-c持续输出信息netstat -c
-e显示扩展信息netstat -e
-i显示网络接口信息netstat -i
-g显示多播组成员信息netstat -g

经典案例

bash
# 查看所有TCP连接
netstat -atn

# 查看所有UDP连接
netstat -aun

# 查看所有监听端口
netstat -tulnp

# 查看路由表
netstat -rn

# 查看网络接口统计信息
netstat -i

# 持续监控TCP连接
netstat -tcp -c 1

# 查看特定端口的连接
netstat -anp | grep 80

# 显示网络协议统计信息
netstat -s

注意事项

  1. 需要root权限才能查看所有连接和进程信息
  2. 在新版Linux系统中推荐使用ss命令替代netstat(功能更强大)
  3. -p选项可能显示不完整,特别是在容器环境中
  4. 输出中的TIME_WAIT状态表示TCP连接正常关闭过程
  5. 大量SYN_RECV状态可能指示SYN洪水攻击
  6. 可以使用watch -n 1 netstat -t实现实时监控

替代方案(ss命令)

bash
# 基本等同于 netstat -tulnp
ss -tulnp

# 显示所有TCP连接
ss -t -a

# 显示所有UDP连接
ss -u -a

虽然netstat仍然可用,但在现代Linux系统中,ss命令提供了更快的性能和更详细的信息,特别是在处理大量网络连接时。

nmap - 网络探测和安全审核工具

Nmap(Network Mapper)是一款开源的网络扫描和安全审计工具,用于发现主机和服务、检测操作系统、识别服务版本等信息。广泛应用于网络探测、安全审计和漏洞扫描。

语法格式

bash
nmap [扫描类型] [选项] {目标规范}

选项

选项描述示例
-sSTCP SYN扫描(半开扫描)nmap -sS 192.168.1.1
-sTTCP连接扫描nmap -sT example.com
-sUUDP扫描nmap -sU 192.168.1.1
-O操作系统检测nmap -O 192.168.1.1
-sV服务版本检测nmap -sV 192.168.1.1
-p <端口范围>指定端口范围nmap -p 1-1000 192.168.1.1
-A激进模式(OS检测+版本检测+脚本扫描)nmap -A 192.168.1.1
-T<0-5>设置时间模板(0最慢,5最快)nmap -T4 192.168.1.1
--script <脚本>使用NSE脚本nmap --script vuln 192.168.1.1
-v增加详细程度nmap -v 192.168.1.1

经典案例

bash
# 快速扫描常用端口
nmap -F 192.168.1.1

# 完整扫描(包括OS和服务版本检测)
nmap -A -T4 192.168.1.1

# 扫描特定端口范围
nmap -p 20-80,443,8080 192.168.1.1

# 使用脚本扫描漏洞
nmap --script vuln 192.168.1.1

# 扫描整个子网
nmap 192.168.1.0/24

注意事项

  1. 未经授权扫描网络可能违反法律或服务条款
  2. 某些扫描类型(如SYN扫描)需要root权限
  3. 过度激进的扫描可能触发目标系统的防御机制
  4. 建议在测试环境中先验证扫描参数
  5. 注意保存扫描结果(可使用-oN选项输出到文件)

traceroute - 网络路由追踪工具

简介

traceroute 是一种网络诊断工具,用于显示数据包从源主机到目标主机所经过的路由路径。它通过发送具有递增TTL值的探测包,并收集中间路由器的响应来实现路由追踪。

语法格式

bash
traceroute [选项] <目标主机>

选项

选项描述示例
-4强制使用IPv4traceroute -4 example.com
-6强制使用IPv6traceroute -6 example.com
-I使用ICMP ECHO请求traceroute -I example.com
-T使用TCP SYN包traceroute -T example.com
-U使用UDP数据包(默认)traceroute -U example.com
-f <ttl>设置起始TTL值traceroute -f 5 example.com
-m <max_ttl>设置最大TTL值(默认30)traceroute -m 15 example.com
-q <n>每跳发送的探测包数(默认3)traceroute -q 5 example.com
-w <秒>等待响应超时时间traceroute -w 2 example.com
-n不解析IP地址为主机名traceroute -n example.com

经典案例

bash
# 追踪到google.com的路由路径
traceroute google.com

# 使用ICMP协议追踪,不解析主机名,最多15跳
traceroute -I -n -m 15 google.com

# 追踪特定端口(80)的TCP路由
traceroute -T -p 80 example.com

注意事项

  1. 某些网络设备可能配置为不响应ICMP/UDP探测包,导致显示为星号(*)
  2. 需要root权限才能使用某些特殊选项(如-T)
  3. 结果中的延迟时间受网络状况影响,仅供参考
  4. 过度使用traceroute可能被某些网络视为恶意行为
  5. 不同操作系统实现的traceroute可能有不同的默认行为和选项

nslookup - 域名查询工具

简介

nslookup 是一个用于查询 DNS(域名系统)记录的命令行工具,可以获取域名对应的 IP 地址、反向解析、MX 记录等信息。它支持交互式和非交互式两种模式。

语法格式

bash
nslookup [选项] [域名] [DNS服务器]

选项

选项描述示例
-type=A查询 A 记录(IPv4 地址)nslookup -type=A example.com
-type=AAAA查询 AAAA 记录(IPv6 地址)nslookup -type=AAAA example.com
-type=MX查询邮件交换记录nslookup -type=MX example.com
-type=CNAME查询别名记录nslookup -type=CNAME www.example.com
-type=NS查询域名服务器记录nslookup -type=NS example.com
-type=TXT查询 TXT 记录nslookup -type=TXT example.com
-debug显示调试信息nslookup -debug example.com
-timeout=<秒>设置查询超时时间nslookup -timeout=5 example.com
-port=<端口>指定 DNS 服务器端口nslookup -port=5353 example.com

经典案例

bash
# 查询域名的 A 记录(默认)
nslookup example.com

# 查询 Google 的 DNS 记录(指定 DNS 服务器)
nslookup google.com 8.8.8.8

# 查询 MX 记录(邮件服务器)
nslookup -type=MX gmail.com

# 反向解析 IP 地址
nslookup 8.8.8.8

# 进入交互模式(输入 exit 退出)
nslookup
> server 8.8.8.8
> set type=MX
> example.com
> exit

注意事项

  1. 在较新版本的 Linux 中,dighost 命令更常用,nslookup 已逐渐被取代。
  2. 如果未指定 DNS 服务器,默认使用 /etc/resolv.conf 中的配置。
  3. 某些 DNS 服务器可能限制查询频率,频繁查询可能被屏蔽。
  4. 反向解析(PTR 记录)需要 IP 地址对应的 DNS 记录存在。
  5. 在交互模式下,可以使用 help 查看可用命令。

nmcli - 网络管理命令行工具

简介

nmcli 是 NetworkManager 的命令行客户端工具,用于管理和监控网络连接。相比传统的 ifconfig 等工具,nmcli 提供了更现代化的网络配置方式,支持 WiFi、以太网、VPN 等多种连接类型。

语法格式

bash
nmcli [OPTIONS] OBJECT { COMMAND | help }

选项

选项描述示例
-a询问缺少的参数nmcli -a connection up
-c指定输出颜色nmcli -c auto
-e转义列分隔符nmcli -e on
-f指定显示字段nmcli -f general,ip4 dev show
-g简化输出格式nmcli -g ip4.address
-h显示帮助信息nmcli -h
-p美化输出格式nmcli -p
-s显示密码nmcli -s connection show
-t简洁输出模式nmcli -t
-v显示版本信息nmcli -v

经典案例

bash
# 查看所有网络连接
nmcli connection show

# 激活有线连接
nmcli connection up eth0

# 扫描可用WiFi网络
nmcli device wifi list

# 连接到WiFi网络
nmcli device wifi connect SSID password PASSWORD

# 创建新的静态IP连接
nmcli connection add type ethernet ifname eth0 ip4 192.168.1.100/24 gw4 192.168.1.1

# 查看设备状态
nmcli device status

# 修改DNS设置
nmcli connection modify eth0 ipv4.dns "8.8.8.8 8.8.4.4"

# 重新加载所有连接
nmcli connection reload

注意事项

  1. 需要 NetworkManager 服务运行才能使用 nmcli
  2. 修改网络配置通常需要 root 权限
  3. 某些操作可能会导致网络连接暂时中断
  4. 不同 Linux 发行版的 NetworkManager 版本可能有功能差异
  5. 使用 nmcli general logging 可以开启调试日志
  6. 对于复杂的网络配置,建议先测试在非生产环境

telnet - 检测网络服务和端口连通性

简介

Telnet 是一个基于文本的协议和命令行工具,用于通过网络连接到远程主机。它使用 TCP 端口 23 进行通信,但由于传输数据未加密,已逐渐被 SSH 取代。现在主要用于测试网络服务和端口连通性。

语法格式

bash
telnet [选项] [主机名或IP地址] [端口]

选项

选项描述示例
-4强制使用 IPv4telnet -4 example.com
-6强制使用 IPv6telnet -6 example.com
-8使用 8 位数据路径telnet -8 legacyhost
-E禁用转义字符功能telnet -E 192.168.1.1
-a尝试自动登录telnet -a server
-l user指定登录用户名telnet -l admin 10.0.0.1

经典案例

bash
# 测试邮件服务器的25端口是否开放
telnet mail.example.com 25

# 连接到远程主机的telnet服务
telnet 192.168.1.100

# 测试HTTP服务80端口
telnet www.example.com 80
GET / HTTP/1.1
Host: www.example.com

# 检查MySQL端口3306是否可访问
telnet db-server 3306

注意事项

  1. 安全警告:Telnet 以明文传输所有数据(包括密码),不要在公共网络或不安全环境中使用它进行实际管理操作。

  2. 现代 Linux 发行版可能默认不安装 telnet 客户端,需要手动安装:

    bash
    # Debian/Ubuntu
    sudo apt install telnet
    
    # RHEL/CentOS
    sudo yum install telnet
  3. 要测试 telnet 服务是否运行,可以在本地使用:

    bash
    telnet localhost
  4. 退出 telnet 会话通常使用组合键 Ctrl+] 然后输入 quit

  5. 对于生产环境的管理操作,强烈建议使用 SSH 替代 telnet。

ssh-keygen - 生成SSH密钥对工具

简介

ssh-keygen 是用于生成、管理和转换 SSH 认证密钥的命令行工具。它支持 RSA、DSA、ECDSA 和 Ed25519 等多种加密算法,是建立安全 SSH 连接的基础工具。

语法格式

bash
ssh-keygen [选项] [-t key_type] [-b bits] [-f output_keyfile] [-C comment]

选项

选项描述示例
-t type指定密钥类型(rsa/dsa/ecdsa/ed25519)-t ed25519
-b bits指定密钥位数(RSA默认2048)-b 4096
-f file指定密钥文件输出路径-f ~/.ssh/id_rsa
-C comment添加密钥注释(通常用邮箱)-C "user@example.com"
-p更改密钥密码短语-p -f ~/.ssh/id_rsa
-N new_passphrase设置新密码短语-N "mypassword"
-e导出密钥为其他格式-e -f ~/.ssh/id_rsa.pub
-y从私钥生成公钥-y -f ~/.ssh/id_rsa

加密算法

加密算法说明
rsa兼容性最好,但性能较低,密钥长度:默认 3072 位(推荐 ≥2048,安全临界值为 4096)-b 4096指定长度
ed25519安全性高,性能最优,密钥长度短,密钥长度:固定 256 位
ecdsa比 RSA 更高效,密钥尺寸更小,密钥长度:256/384/521 位。-b 384指定长度
dsa(已淘汰)OpenSSH 7.0+ 已默认禁用,存在安全性问题,密钥长度:固定 1024 位

经典案例

bash
# 生成ED25519密钥对(推荐)
ssh-keygen -t ed25519 -C "admin@server" -f ~/.ssh/server_key

# 生成4096位RSA密钥
ssh-keygen -t rsa -b 4096 -C "backup@example.com"

# 为现有私钥生成公钥
ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

# 批量生成无密码密钥对(自动化场景)
ssh-keygen -t rsa -b 2048 -N "" -f /tmp/auto_key

注意事项

  1. 安全建议

    • ED25519 算法比 RSA 更安全高效,优先考虑使用
    • 生产环境 RSA 密钥长度不应小于 2048 位
    • 避免使用无密码密钥,若必须使用需严格限制访问权限
  2. 文件权限

    bash
    chmod 600 ~/.ssh/id_rsa      # 私钥权限
    chmod 644 ~/.ssh/id_rsa.pub  # 公钥权限
  3. 生成authorized_keys

    bash
    cat ~/.ssh/id_rsa.pub > authorized_keys
  4. 密钥管理

    • 定期轮换密钥(建议每6-12个月)
    • 不同服务应使用不同密钥对
    • 删除不再使用的密钥对

ssh-copy-id - 将公钥复制到远程主机的工具

简介

ssh-copy-id 是一个便捷工具,用于将本地 SSH 公钥安装到远程主机的 authorized_keys 文件中,实现免密码 SSH 登录。它自动处理权限设置和文件创建,是配置 SSH 密钥认证的标准方法。

语法格式

bash
ssh-copy-id [-i [identity_file]] [-p port] [-f] [-n] [-o ssh_option] [user@]hostname

选项

选项描述示例
-i identity_file指定要复制的公钥文件-i ~/.ssh/id_ed25519.pub
-p port指定远程主机的SSH端口-p 2222
-f强制模式,不检查密钥是否已存在-f
-n试运行,显示操作但不实际执行-n
-o ssh_option传递SSH客户端选项-o "StrictHostKeyChecking=no"
-h显示帮助信息-h

经典案例

bash
# 基本用法(使用默认~/.ssh/id_rsa.pub)
ssh-copy-id user@remote-server

# 指定非标准端口和密钥文件
ssh-copy-id -i ~/.ssh/work_key.pub -p 2222 admin@192.168.1.100

# 首次连接时跳过主机密钥检查
ssh-copy-id -o "StrictHostKeyChecking=no" dev@cloud-instance

# 多服务器批量部署(结合循环)
for server in web{1..3}.example.com; do
    ssh-copy-id -i ~/.ssh/deploy_key.pub sysadmin@$server
done

注意事项

  1. 前置要求:
    • 本地必须已有 SSH 密钥对(可通过 ssh-keygen 生成)
    • 需要知道远程主机的登录密码(用于首次认证)
  2. 文件权限:
    • 远程主机的 ~/.ssh 目录权限应为 700
    • authorized_keys 文件权限应为 600

scp - 安全文件传输工具

简介

scp(Secure Copy Protocol)是基于 SSH 的安全文件传输命令,用于在本地主机和远程主机之间或两个远程主机之间加密传输文件。它利用 SSH 进行身份验证和数据加密,是替代传统 FTP 的安全选择。

语法格式

bash
scp [选项] [[user@]host1:]file1 ... [[user@]host2:]file2

选项

选项描述示例
-P port指定远程主机的SSH端口-P 2222
-p保留文件原始属性(修改时间、权限等)-p
-r递归复制整个目录-r
-C启用压缩传输-C
-q静默模式,不显示进度和警告-q
-i identity_file指定密钥文件-i ~/.ssh/id_ed25519
-l limit限制带宽(单位:Kbit/s)-l 1024
-v显示详细调试信息-v

经典案例

bash
# 本地文件复制到远程主机
scp backup.tar.gz user@remote:/opt/backups/

# 从远程主机下载文件(指定端口)
scp -P 2222 admin@server:/var/log/app.log /tmp/

# 目录递归传输(保留属性)
scp -rpC ~/website root@192.168.1.10:/var/www/

# 两台远程主机间传输(通过本地中转)
scp user1@host1:/data/file user2@host2:/backup/

# 使用非标准密钥传输
scp -i ~/.ssh/deploy_key -P 2222 app.conf deploy@prod:/etc/app/

注意事项

  1. 性能优化

    bash
    # 大文件传输建议组合使用这些选项
    scp -Cp -l 2048 large_file.iso user@remote:/storage/
  2. 安全限制

    • 默认使用 SSH 协议(端口 22)
    • 防火墙需放行相关端口
    • 建议配合 SSH 密钥认证使用
  3. 替代方案

    bash
    # 更现代的替代工具(支持断点续传)
    rsync -avzP -e "ssh -p 2222" source/ user@host:dest/
  4. 特殊场景处理

    bash
    # 包含空格的文件名需要转义
    scp "My\\ Documents/file.txt" remote:~/  
    
    # 使用通配符时需要先在本地展开
    scp *.log remote:/logs/

sshpass - 非交互式SSH密码认证工具

简介

sshpass 是一个用于非交互式SSH密码认证的工具,可以在命令行中直接提供SSH密码,实现自动化脚本中的密码认证。它通过标准输入或环境变量传递密码,绕过了SSH默认的交互式密码提示。

语法格式

bash
sshpass [-f filename | -d num | -p password | -e] [ssh options] command

选项

选项描述示例
-p password直接在命令行指定密码-p "myp@ss123"
-f filename从文件读取密码(第一行)-f /etc/sshpass.txt
-e从环境变量SSHPASS读取密码-e
-d num使用文件描述符num获取密码-d 3
-P prompt设置密码提示字符串匹配模式-P "password:"
-v显示详细调试信息-v

源码编译

bash
yum -y install gcc
wget http://sourceforge.net/projects/sshpass/files/latest/download -O sshpass.tar.gz
# 或者
curl -L -o sshpass-1.10.tar.gz https://sourceforge.net/projects/sshpass/files/sshpass/1.10/sshpass-1.10.tar.gz/download

# 解压
tar -xvf sshpass-1.10.tar.gz
# 进入目录
cd sshpass-*
# 预配置
./configure --prefix=/opt/sshpass
# 编译并安装
make && make install

cp /opt/sshpass/sshpass /usr/bin/

经典案例

bash
# 基本用法(明文密码)
sshpass -p 's3cret' ssh user@remote-host "ls -l /tmp"

# 从文件读取密码(更安全)
echo 's3cret' > pass.txt
chmod 600 pass.txt
sshpass -f pass.txt ssh -p 2222 admin@server

# 环境变量方式(推荐用于脚本)
export SSHPASS='s3cret'
sshpass -e scp file.txt user@remote:~/ 

# 结合rsync使用
sshpass -p 'password' rsync -avz -e ssh /local/dir/ user@remote:/remote/dir/

# 批量执行命令(自动化运维)
for host in {1..5}; do
  sshpass -p 'pass123' ssh -o StrictHostKeyChecking=no user@node$host "uptime"
done

注意事项

  1. 安全警告:

    • 命令行中的密码可能会被其他用户通过ps命令查看
    • 密码文件必须设置严格权限(600)
    • 生产环境建议优先使用SSH密钥认证
  2. 最佳实践:

    bash
    # 使用后立即清除环境变量
    export SSHPASS='password'
    sshpass -e ssh user@host
    unset SSHPASS
    
    # 或者使用临时文件
    temp_pass=$(mktemp)
    echo 'password' > $temp_pass
    sshpass -f $temp_pass ssh user@host
    rm -f $temp_pass
  3. 安装说明:

    bash
    # Ubuntu/Debian
    sudo apt install sshpass
    
    # RHEL/CentOS
    sudo yum install sshpass
    
    # macOS
    brew install hudochenkov/sshpass/sshpass
  4. 替代方案:

    bash
    # 使用expect脚本(更灵活但更复杂)
    # 使用SSH密钥认证(更安全)
    # 使用Ansible等配置管理工具

rsync - 远程文件同步工具

简介

rsync 是一个功能强大的文件同步工具,支持本地和远程文件同步。它通过差异算法仅传输变化的文件部分,显著提高传输效率。广泛用于备份、镜像和部署场景。

语法格式

bash
rsync [OPTION]... SRC [SRC]... DEST

选项

选项描述示例
-a归档模式(保留权限、时间戳等)rsync -a /src/ /dest/
-v显示详细输出rsync -av /src/ user@host:/dest/
-z压缩传输数据rsync -az /src/ user@host:/dest/
-h人类可读格式输出rsync -ah /src/ /dest/
--delete删除目标端多余文件rsync -a --delete /src/ /dest/
-P显示进度并支持断点续传rsync -aP /src/ user@host:/dest/
-e ssh指定远程shellrsync -av -e "ssh -p 2222" /src/ user@host:/dest/
--exclude=PATTERN排除匹配文件rsync -a --exclude='*.tmp' /src/ /dest/
--bwlimit=RATE限制传输带宽(KB/s)rsync -a --bwlimit=100 /src/ user@host:/dest/
--password-file=FILE指定包含密码的文件路径rsync --password-file=/etc/rsync.pass
--daemon以守护进程模式运行rsync --daemon --password-file=/etc/rsync.pass
--port=PORT指定rsync守护进程端口rsync --port=8730 --password-file=pass.txt
--link-dest保持硬链接关系rsync -avz --link-dest=/backup/previous_backup/

经典案例

bash
# 本地目录同步(保留所有属性)
rsync -av /data/backups/ /mnt/backup/

# 远程同步到本地(使用SSH加密)
rsync -avz -e ssh user@example.com:/var/www/ /local/backup/

# 镜像同步(删除目标端多余文件)
rsync -av --delete /src/ /dest/

# 排除特定文件类型
rsync -av --exclude='*.log' --exclude='temp/' /src/ user@host:/dest/

# 限速传输(100KB/s)
rsync -av --bwlimit=100 /largefiles/ user@host:/backup/

# 使用密码文件从远程同步(rsync协议)
rsync -av --password-file=/etc/rsync.secret rsync://user@host/share/ /local/path/

# 守护进程模式使用密码文件
rsync --daemon --config=/etc/rsyncd.conf --password-file=/etc/rsyncd.secret

# 限制权限的密码文件(权限必须为600)
chmod 600 /etc/rsync.pass
rsync -av --password-file=/etc/rsync.pass user@host::module /dest

注意事项

  1. 路径结尾的/很重要:/src/表示同步目录内容,/src表示同步目录本身
  2. 使用--dry-run选项可先测试而不实际执行
  3. 远程同步建议使用-z压缩选项减少网络流量
  4. 生产环境建议结合screentmux使用,防止会话中断
  5. 注意--delete选项会删除目标端多余文件,使用前务必确认
  6. 密码文件权限必须设为600,否则rsync会拒绝使用
  7. 密码文件内容格式:纯密码文本(无用户名)或"username:password"格式

curl - 数据传输工具

简介

curl 是一个用于传输数据的命令行工具,支持多种协议(HTTP/HTTPS/FTP/FTPS等)。它能够与服务器进行交互,获取或发送数据,常用于测试API、下载文件等场景。

语法格式

bash
curl [options] [URL...]

选项

选项描述示例
-o <file>将输出写入到指定文件curl -o example.html http://example.com
-O将输出写入到文件,文件名从URL中提取curl -O http://example.com/file.txt
-d <data>发送POST请求数据curl -d "name=value" http://example.com
-H <header>添加HTTP请求头curl -H "Content-Type: application/json" http://example.com
-X <method>指定HTTP请求方法curl -X DELETE http://example.com/resource
-u <user:password>指定用户名和密码curl -u user:pass http://example.com
-L跟随重定向curl -L http://example.com
-v显示详细操作信息curl -v http://example.com
-s静默模式,不显示进度或错误信息curl -s http://example.com
-k允许不安全的SSL连接curl -k https://example.com

经典案例

bash
# 下载文件
curl -O https://example.com/file.zip

# 发送POST请求
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com/endpoint

# 测试API响应时间
curl -o /dev/null -s -w 'Total: %{time_total}s\n' https://api.example.com

# 使用基本认证访问
curl -u username:password https://protected.example.com

注意事项

  1. 使用-k选项会忽略SSL证书验证,存在安全风险,仅建议在测试环境中使用
  2. 大量下载时注意带宽限制,可使用--limit-rate限制速度
  3. POST请求时注意设置正确的Content-Type头
  4. 处理敏感数据时建议使用.netrc文件存储凭证而非命令行参数
  5. 某些服务器可能会限制curl的User-Agent,可通过-A选项修改

iptables - Linux 内核防火墙配置工具

iptables 是 Linux 系统中基于内核 netfilter 框架的用户空间命令行工具,用于配置、维护和检查 IPv4 数据包过滤规则,实现网络流量控制、地址转换(NAT)和数据包修改等功能。它是 Linux 防火墙的核心组件,广泛用于服务器安全、访问控制和网络管理。

语法格式

iptables [-t 表名] 命令 [链名] [匹配条件] [-j 目标动作]

选项

选项描述示例
-t table指定要操作的表(如 filter, nat, mangle, raw),默认为 filteriptables -t nat -L
-A chain追加规则到指定链的末尾iptables -A INPUT -p tcp --dport 80 -j ACCEPT
-D chain [rulenum]删除指定链中的规则(可按规则编号或完整规则删除)iptables -D INPUT 1(删除第1条规则)
-I chain [rulenum]插入规则到指定链的指定位置(默认为链首)iptables -I INPUT 2 -s 192.168.1.0/24 -j ACCEPT
-L [chain]列出指定链或所有链的规则iptables -L -v -n(详细数字格式显示)
-F [chain]清空指定链或所有链的规则iptables -F INPUT
-P chain target设置链的默认策略(如 ACCEPT, DROP, REJECTiptables -P INPUT DROP
-s address[/mask]匹配源 IP 地址或网段iptables -A INPUT -s 192.168.1.10 -j DROP
-d address[/mask]匹配目标 IP 地址或网段iptables -A OUTPUT -d 10.0.0.0/8 -j REJECT
-p protocol匹配协议类型(如 tcp, udp, icmp, alliptables -A INPUT -p tcp --dport 22 -j ACCEPT
--dport port匹配目标端口(需结合 -p tcp-p udpiptables -A INPUT -p tcp --dport 80 -j ACCEPT
--sport port匹配源端口(需结合 -p tcp-p udpiptables -A OUTPUT -p udp --sport 53 -j ACCEPT
-i interface匹配输入网络接口(如 eth0, loiptables -A INPUT -i eth0 -j ACCEPT
-o interface匹配输出网络接口iptables -A OUTPUT -o wlan0 -j DROP
-j target指定规则匹配后的动作(如 ACCEPT, DROP, REJECT, LOG, DNAT, SNATiptables -A FORWARD -j DROP
-m module使用扩展模块(如 state, conntrack, multiport, limitiptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

经典案例

bash
# 1. 查看当前规则(以数字格式显示详细信息)
iptables -L -n -v

# 2. 允许 SSH(22端口)访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 3. 允许本地回环接口(lo)通信
iptables -A INPUT -i lo -j ACCEPT

# 4. 允许已建立的连接及相关连接通过
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 5. 拒绝来自特定 IP(如 192.168.1.100)的所有流量
iptables -A INPUT -s 192.168.1.100 -j DROP

# 6. 设置端口转发(将公网 8080 端口转发到内网 192.168.1.50:80)
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.50:80
iptables -A FORWARD -p tcp -d 192.168.1.50 --dport 80 -j ACCEPT

# 7. 启用 NAT 伪装(内网通过公网接口 eth0 上网)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 8. 记录被拒绝的包到日志(前缀标记 "IPTables-Dropped:")
iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4

# 9. 保存规则到文件(重启后失效,需手动保存)
iptables-save > /etc/iptables/rules.v4

# 10. 从文件恢复规则
iptables-restore < /etc/iptables/rules.v4

注意事项

  1. 权限要求:iptables 需 root 权限运行(使用 sudo 或 root 用户)。
  2. 规则顺序:规则按顺序匹配,第一条匹配的规则生效。建议将允许规则放在拒绝规则之前。
  3. 默认策略:设置默认策略(如 iptables -P INPUT DROP)前需确保允许管理连接(如 SSH),否则可能导致服务器无法远程访问。
  4. 保存规则:iptables 规则默认内存中生效,重启后丢失。需使用 iptables-save 持久化保存(不同发行版路径可能不同)。
  5. 危险操作iptables -F 会清空所有规则,若默认策略为 DROP 可能导致网络中断。 iptables -P INPUT DROP 会拒绝所有输入流量,需提前放行必要服务。
  6. 性能影响:复杂规则或大量连接跟踪可能消耗 CPU 和内存。建议使用 -m state-m conntrack 优化已建立连接的处理。
  7. 替代工具:现代 Linux 系统推荐使用 nftablesfirewalld(基于 iptables 的抽象层),提供更简化的管理。

iptables 是 Linux 网络安全的基石,掌握其用法可有效加固服务器。建议在测试环境验证规则后再应用于生产环境。更多扩展功能(如 IP 集、时间控制)可参考官方文档。