Linux 网络配置与安全实践

Linux 网络配置与安全实践

前言

在 Linux 服务器的日常运维中,网络配置与安全是最基础也最关键的技能之一。从网卡配置、路由表管理,到数据包分析、代理部署,再到内核层面的传输优化与策略路由,每一项都直接影响着服务的可用性、性能与安全边界。本文将从这些实际场景出发,系统性地梳理 Linux 网络配置的常用命令、工具链与实践经验,帮助读者建立从底层到应用层的完整知识脉络。


一、网络接口与路由管理

Linux 系统中,网络接口配置和路由表管理是网络通信的基石。传统的 ifconfigroute 命令虽然在许多发行版中已逐渐被 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 eth0

1.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.100

1.4 使用 ip 命令统一管理网络

ip 命令来自 iproute2 工具包,是替代 ifconfigroutearp 等传统命令的现代化方案,提供了更丰富和一致的功能。

管理链路层设备:

# 启用/禁用设备
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)hostnetportportrange
  • 方向(dir)srcdstsrc or dstsrc and dst
  • 协议(proto)tcpudpicmp

表达式之间可用 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 = bbr

3.3 自动安装脚本的核心流程

对于内核版本不满足要求的系统,可使用一键安装脚本。其核心逻辑如下:

  1. 系统检测:识别 CentOS / Debian / Ubuntu 发行版及版本号
  2. 内核升级

    • CentOS 7:通过 ELRepo 仓库安装 kernel-ml 主线内核
    • CentOS 6:手动下载指定版本的 RPM 包安装
    • Debian/Ubuntu:从 Ubuntu Kernel PPA 获取最新的 deb 包安装
  3. 引导配置

    • CentOS 7:grub2-set-default 0 将新内核设为默认启动项
    • Debian/Ubuntu:update-grub 更新引导配置
  4. sysctl 配置:写入 fqbbr 参数
  5. 重启系统:使新内核和配置生效

在 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.service

2. 配置 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;
    }
}
EOF

3. 部署伪装网站并申请 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 update

5.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 网络配置与安全的关键实践:

  1. 网络接口与路由管理:从传统 ifconfig/route 到现代化 ip 命令体系,覆盖链路层、地址层、路由层及策略路由的完整操作;
  2. tcpdump 数据包分析:抓包选项、表达式语法及常见场景示例;
  3. BBR 拥塞控制算法:原理简介及自动化部署流程;
  4. Trojan 代理部署:基于 TLS 的安全代理方案,从 Nginx 伪装到证书申请与 systemd 服务化;
  5. OpenVPN 客户端安装:CentOS 7 下的依赖安装;
  6. 源进源出策略路由:多网卡场景下基于源地址的路由分流方案;
  7. 运维排障:SSH 切换用户失败的系统资源限制排查方法。

掌握这些技能后,运维人员可以更加从容地应对日常的网络配置需求与安全挑战。建议在实际环境中结合具体场景进行演练,以加深对各个命令和配置项的理解。

暂无评论