Linux 网络配置与安全实践
前言
在 Linux 服务器的日常运维中,网络配置与安全是最基础也最关键的技能之一。从网卡配置、路由表管理,到数据包分析、代理部署,再到内核层面的传输优化与策略路由,每一项都直接影响着服务的可用性、性能与安全边界。本文将从这些实际场景出发,系统性地梳理 Linux 网络配置的常用命令、工具链与实践经验,帮助读者建立从底层到应用层的完整知识脉络。
一、网络接口与路由管理
Linux 系统中,网络接口配置和路由表管理是网络通信的基石。传统的 ifconfig 和 route 命令虽然在许多发行版中已逐渐被 ip 命令取代,但在大量存量系统中仍然广泛使用。理解这些命令的用法,对于日常排障和脚本兼容性都至关重要。
1.1 使用 ifconfig 管理网络接口
ifconfig 用于查看和配置网络接口,包括 IP 地址、子网掩码及接口启停等。
配置 IP 地址并激活设备:
# 配置 eth0 并激活
ifconfig eth0 10.78.40.155 netmask 255.255.255.0 up配置接口别名:
# 为 eth0 添加别名接口 eth0:1
ifconfig eth0:1 10.120.127.223
route add -host 10.120.127.223 dev eth0:1启用/禁用接口:
ifconfig eth0:1 up
ifconfig eth0:1 down查看所有或指定网络接口配置:
ifconfig
ifconfig eth01.2 使用 route 管理路由表
route 命令用于查看和操作内核 IP 路由表,是控制数据包转发路径的核心工具。
添加到主机的路由:
route add -host 10.120.127.223 dev eth0:1
route add -host 10.78.40.155 gw 10.227.88.183添加到网络的路由:
route add -net 192.168.1.0 netmask 255.255.255.0 eth0
route add -net 192.168.1.0 netmask 255.255.255.0 gw 10.0.0.1
route add -net 10.0.0.0/24 eth1添加默认网关:
route add default gw 192.168.1.1删除路由:
route del -host 10.78.40.155 dev eth0:1查看路由表:
route
route -n # -n 不解析主机名,输出更快1.3 ARP 缓存管理
ARP 表管理是排查二层网络问题的常用手段。
# 查看 ARP 缓存
arp
# 添加静态 ARP 条目
arp -s 192.168.1.100 00:0c:29:3a:2b:1c
# 删除 ARP 条目
arp -d 192.168.1.1001.4 使用 ip 命令统一管理网络
ip 命令来自 iproute2 工具包,是替代 ifconfig、route、arp 等传统命令的现代化方案,提供了更丰富和一致的功能。
管理链路层设备:
# 启用/禁用设备
ip link set dev eth0 up
ip link set dev eth0 down
# 修改传输队列长度
ip link set dev eth0 txqueuelen 100
# 修改 MTU
ip link set dev eth0 mtu 1500
# 修改 MAC 地址
ip link set dev eth0 address 00:01:4f:00:15:f1
# 查看设备详细信息(含错误统计)
ip -s -s link ls eth0管理 IP 地址:
# 添加 IP 地址(带标签)
ip addr add 10.78.40.155/28 brd + label eth0:1 dev eth0
ip addr add 10.120.127.223/24 brd + dev eth1 label eth1:1
# 删除 IP 地址
ip addr del 10.78.40.155/24 brd + dev eth0
# 查看地址
ip addr ls eth0
# 清除指定网段的所有地址
ip -4 addr flush label "eth0"管理路由表(ip route):
# 添加路由(指定网关)
ip route add 10.0.0.0/24 via 192.168.189.123
# 添加多路径路由实现负载均衡
ip route add default scope global nexthop dev ppp0 nexthop dev ppp1
# 添加加权多路径路由
ip route replace default equalize \
nexthop via 192.168.163.152 dev eth0 weight 1 \
nexthop via 192.168.163.153 dev eth1 weight 1
# 删除路由
ip route del default scope global nexthop dev ppp0 nexthop dev ppp1
# 查询到指定目的地的路由
ip route get 192.168.143.244
# 查看路由表
ip route ls
ip route ls table fddi153
# 清除路由缓存
ip route flush cache管理 ARP/邻居表:
# 添加永久 ARP 条目
ip neigh add 10.140.136.184 lladdr 00:00:00:00:00:01 dev eth0 nud perm
# 修改 ARP 状态为 reachable
ip neigh chg 10.140.136.184 dev eth0 nud reachable
# 删除 ARP 条目
ip neigh del 10.140.136.184 dev eth0
# 查看 ARP 条目
ip -s n ls 192.168.179.141策略路由(ip rule):
在某些场景下,我们不仅需要根据目的地址决定路由,还需要综合源地址、协议类型甚至传输层端口来选择路径,这就是策略路由。
# 让来自指定源网段的数据包使用特定路由表
ip rule add from 192.203.80.0/24 table inr.ruhep prio 220
# 源 NAT 规则
ip rule add from 192.168.23.205 nat 192.168.85.138 table 1 prio 320
# 查看所有路由规则
ip rule ls
# 删除规则
ip rule del prio 32767二、网络数据包分析:tcpdump 实战
tcpdump 是 Linux 下最经典的网络抓包工具,能够将网络接口上流经的数据包完全截获并提供分析。掌握 tcpdump 对于协议分析、故障定位和安全审计都具有不可替代的价值。
2.1 常用选项速览
| 选项 | 说明 |
|---|---|
-c <count> | 指定抓取的包数量 |
-i <interface> | 指定监听的网络接口 |
-n | 不对地址进行主机名解析 |
-nn | 不对地址和端口进行名称解析 |
-P in/out/inout | 指定抓取流入/流出的包 |
-s <len> | 设置抓取的数据包长度 |
-e | 输出中包含数据链路层头部信息 |
-q | 快速打印,输出简短 |
-X | 以十六进制和 ASCII 输出包数据 |
-v/-vv/-vvv | 递进级别的详细输出 |
-w <file> | 将抓包数据写入文件 |
-r <file> | 从文件中读取数据包 |
-D | 列出可用于抓包的接口 |
2.2 表达式语法
tcpdump 的过滤表达式基本格式为 proto dir type ID,其中:
- 类型(type):
host、net、port、portrange - 方向(dir):
src、dst、src or dst、src and dst - 协议(proto):
tcp、udp、icmp等
表达式之间可用 and(&&)、or(||)、not(!)连接,并使用 () 改变优先级(注意在 Shell 中需要转义)。
2.3 典型抓包示例
监视指定主机的数据包:
tcpdump -i eth0 host 192.168.1.100监视主机间的通信(多条件组合):
tcpdump -i eth0 host node1 and \(node2 or node3\)截获某主机发出的数据包:
tcpdump -i eth0 src host node1监视指定主机和端口:
tcpdump -i eth0 port 8080 and host node1抓取指定网段的包并限制数量:
tcpdump -i eth0 -c 10 net 192.168抓取 ICMP(ping)包:
tcpdump -c 5 -nn -i eth0 icmp and src 10.9.102.68抓取发往本机 22 端口的数据包:
tcpdump -c 10 -nn -i eth0 tcp dst port 22详细解析数据包内容:
tcpdump -c 2 -q -XX -vvv -nn -i eth0 tcp dst port 22抓取经网关的 FTP 流量(使用引号避免 Shell 对括号的解析):
tcpdump 'gateway snup and (port ftp or ftp-data)'三、TCP BBR 拥塞控制算法
BBR(Bottleneck Bandwidth and Round-trip propagation time)是 Google 开发的一种新型拥塞控制算法,旨在解决传统基于丢包的算法(如 CUBIC)在高带宽、高延迟网络下带宽利用率低的问题。BBR 通过持续估算瓶颈带宽和最小 RTT 来决定发送速率,能显著提升网络吞吐并降低延迟。
3.1 BBR 的启用条件
要使用 BBR,Linux 内核版本需满足 4.9 及以上。同时需要将拥塞控制算法设置为 bbr,队列调度算法设置为 fq(Fair Queuing)。
3.2 手动启用 BBR
如果内核已满足版本要求,可直接通过 sysctl 启用:
# 编辑 /etc/sysctl.conf 添加以下内容
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# 使配置生效
sysctl -p验证是否启用成功:
sysctl net.ipv4.tcp_congestion_control
# 输出应为: net.ipv4.tcp_congestion_control = bbr3.3 自动安装脚本的核心流程
对于内核版本不满足要求的系统,可使用一键安装脚本。其核心逻辑如下:
- 系统检测:识别 CentOS / Debian / Ubuntu 发行版及版本号
内核升级:
- CentOS 7:通过 ELRepo 仓库安装
kernel-ml主线内核 - CentOS 6:手动下载指定版本的 RPM 包安装
- Debian/Ubuntu:从 Ubuntu Kernel PPA 获取最新的 deb 包安装
- CentOS 7:通过 ELRepo 仓库安装
引导配置:
- CentOS 7:
grub2-set-default 0将新内核设为默认启动项 - Debian/Ubuntu:
update-grub更新引导配置
- CentOS 7:
- sysctl 配置:写入
fq和bbr参数 - 重启系统:使新内核和配置生效
在 CentOS 7 上安装 ELRepo 并升级内核的关键步骤:
# 导入 ELRepo GPG 密钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安装 ELRepo 仓库
rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 安装主线内核
yum -y install kernel-ml kernel-ml-devel
# 设置为默认启动内核
grub2-set-default 0四、代理服务部署:Trojan 一键安装
Trojan 是一种基于 TLS 的代理协议,它将代理流量伪装成标准的 HTTPS 流量,从而具备较强的抗检测能力。本节介绍在 CentOS 7 上通过一键脚本部署 Trojan 的完整流程。
4.1 环境准备
部署前需确保以下条件满足:
- 操作系统:CentOS 7+ / Debian 9+ / Ubuntu 16.04+
- 域名已正确解析到服务器 IP(脚本会自动校验)
- SELinux 处于关闭或禁用状态(否则可能干扰证书申请)
- 防火墙已关闭或放行 80/443 端口
4.2 安装流程
脚本的核心部署步骤如下:
1. 安装 Nginx 作为伪装站点:
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum -y install nginx wget unzip zip curl tar
systemctl enable nginx.service2. 配置 Nginx(绑定域名,伪装 Web 服务):
cat > /etc/nginx/nginx.conf <<-'EOF'
user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 120;
client_max_body_size 20m;
server {
listen 80;
server_name your_domain;
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
}
EOF3. 部署伪装网站并申请 HTTPS 证书(acme.sh):
# 下载伪装站资源
wget https://github.com/V2RaySSR/Trojan/raw/master/web.zip
unzip web.zip
systemctl restart nginx.service
# 安装 acme.sh 并申请证书
curl https://get.acme.sh | sh
~/.acme.sh/acme.sh --issue -d $your_domain --webroot /usr/share/nginx/html/
~/.acme.sh/acme.sh --installcert -d $your_domain \
--key-file /usr/src/trojan-cert/private.key \
--fullchain-file /usr/src/trojan-cert/fullchain.cer \
--reloadcmd "systemctl force-reload nginx.service"4. 下载并配置 Trojan 服务端:
wget https://github.com/trojan-gfw/trojan/releases/download/v1.14.0/trojan-1.14.0-linux-amd64.tar.xz
tar xf trojan-1.*Trojan 服务端配置(server.conf)要点:
{
"run_type": "server",
"local_addr": "0.0.0.0",
"local_port": 443,
"remote_addr": "127.0.0.1",
"remote_port": 80,
"password": ["<random_password>"],
"ssl": {
"cert": "/usr/src/trojan-cert/fullchain.cer",
"key": "/usr/src/trojan-cert/private.key"
}
}Trojan 的工作模式是:服务端监听 443 端口,合法的 Trojan 请求解密后转发至本机 Nginx(80 端口),非 Trojan 的普通 HTTPS 请求则由 Nginx 直接响应伪装页面。
5. 配置 systemd 服务并启动:
cat > /usr/lib/systemd/system/trojan.service <<-'EOF'
[Unit]
Description=trojan
After=network.target
[Service]
Type=simple
ExecStart=/usr/src/trojan/trojan -c "/usr/src/trojan/server.conf"
ExecStop=/usr/src/trojan/trojan
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
systemctl start trojan.service
systemctl enable trojan.service五、OpenVPN 客户端配置(CentOS 7)
在企业网络环境中,OpenVPN 是常用的 SSL VPN 解决方案。在 CentOS 7 上配置 OpenVPN 客户端需要先安装 EPEL 仓库,然后安装相关依赖包。
5.1 安装 EPEL 仓库
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
rpm -Uvh epel-release-7-9.noarch.rpm
yum update5.2 安装 OpenVPN 及相关依赖
yum install easy-rsa openssh-server lzo openssl openssl-devel \
openvpn NetworkManager-openvpn openvpn-auth-ldap安装完成后,OpenVPN 的配置文件通常位于 /etc/openvpn/ 目录下,将服务端提供的 .ovpn 配置文件及证书放入该目录后即可通过 systemctl start openvpn@<config-name> 启动连接。
六、策略路由与源进源出配置
在多网卡或多 IP 的场景中,常常需要确保"从哪个地址进来的流量,就从哪个地址出去"——即源进源出(Source-based Routing)。这对于内网/公网双网卡服务器尤为常见。
6.1 场景描述
假设服务器有两块网卡:
- bond0(内网):IP 为
10.129.20.170,网关10.7.253.144 - mode4(公网):IP 为
192.168.246.63,网关192.168.160.79
目标是内网流量走内网网关、公网流量走公网网关,各自互不干扰。
6.2 配置步骤
第一步:创建独立路由表
在 /etc/iproute2/rt_tables 中新增两个自定义路由表:
echo "211 inner" >> /etc/iproute2/rt_tables
echo "212 public" >> /etc/iproute2/rt_tables第二步:向各路由表添加路由
# inner 路由表
ip route add 10.99.57.177 dev bond0 src 10.129.20.170 table inner
ip route add default via 10.7.253.144 table inner
# public 路由表
ip route add 192.168.134.107 dev mode4 src 192.168.246.63 table public
ip route add default via 192.168.160.79 table public第三步:添加源地址路由规则
内核会根据数据包的源地址匹配对应的路由表:
ip rule add from 10.129.20.170 table inner
ip rule add from 192.168.246.63 table public第四步(可选):配置 iptables 优化
为防止内核连接跟踪表引起 CPU 负载过高,可对特定流量关闭追踪:
# 对目标为公网 IP 的包跳过连接追踪
iptables -t raw -A PREROUTING -d 192.168.246.63 -j NOTRACK第五步(可选):SSH 访问控制
限制只能从特定内网 IP 网段通过 SSH 访问服务器:
iptables -I INPUT 1 -i bond0 -s 10.99.57.177/16 -p tcp --dport 22 -j ACCEPT
iptables -I INPUT 1 -i bond0 -s 10.249.21.13/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i bond0 -p tcp --dport 22 -j DROP配置完成后,来自 10.129.20.170 的数据包将查找 inner 表的路由规则走内网网关,来自 192.168.246.63 的数据包则走 public 表匹配公网网关,从而实现了源进源出的策略路由效果。
七、常见问题排查
7.1 SSH 切换用户失败(su - 报错)
问题现象:使用 su - username 切换用户时,报错 su: failed to execute /bin/bash。
原因分析:这通常是因为目标用户的进程数已达到系统限制的上限(nproc),导致无法 fork 新的 shell 进程。
排查步骤:
# 查看目标用户的进程数
ps -u web -Lf | wc -l解决方案:修改 /etc/security/limits.d/20-nproc.conf,提高最大进程数限制:
* soft nproc 65535
* hard nproc 65535修改后需重新登录使配置生效。此配置对所有用户设置软硬限制均为 65535,可根据实际需求调整为针对特定用户的限制值。
总结
本文从七个维度梳理了 Linux 网络配置与安全的关键实践:
- 网络接口与路由管理:从传统
ifconfig/route到现代化ip命令体系,覆盖链路层、地址层、路由层及策略路由的完整操作; - tcpdump 数据包分析:抓包选项、表达式语法及常见场景示例;
- BBR 拥塞控制算法:原理简介及自动化部署流程;
- Trojan 代理部署:基于 TLS 的安全代理方案,从 Nginx 伪装到证书申请与 systemd 服务化;
- OpenVPN 客户端安装:CentOS 7 下的依赖安装;
- 源进源出策略路由:多网卡场景下基于源地址的路由分流方案;
- 运维排障:SSH 切换用户失败的系统资源限制排查方法。
掌握这些技能后,运维人员可以更加从容地应对日常的网络配置需求与安全挑战。建议在实际环境中结合具体场景进行演练,以加深对各个命令和配置项的理解。
暂无评论