Linux GRE 隧道配置与原理

GRE(Generic Routing Encapsulation,通用路由封装)是一种轻量、通用的三层隧道协议,能够在一个网络层协议之上承载"任意"网络层协议的报文。它由 Cisco 提出,核心规范为 RFC 2784,后续被 RFC 2890(扩展 Key 与序号字段)和 RFC 9601 更新。Linux 内核原生支持 GRE(ip_gre 模块),配合 iproute2 工具集即可在两台主机之间建立点对点隧道,常用于跨网络打通私网、与 IPsec 组合提供带路由能力的 VPN,或在云网络(如早期 OpenStack Neutron + OVS)中承载租户流量。

Linux LD_PRELOAD 技术介绍

LD_PRELOAD 是 Linux/Unix 系统的一个环境变量,它能够影响程序运行时的链接行为,允许在程序启动前指定优先加载的动态链接库。借助这个环境变量,可以在主程序与其依赖的动态链接库之间插入额外的动态库,甚至覆盖系统标准函数库中的实现。

Linux 反弹 Shell

在渗透测试(Penetration Testing)和攻防演练中,Linux 主机上获取一个可交互的命令行是最常见的诉求之一。当目标机由于防火墙、NAT、动态 IP 等原因无法被直接访问时,常规的「正向连接」就会失效,此时需要用到反弹 Shell(Reverse Shell,又称反向 Shell)

Linux 网络负载均衡

负载均衡(Load Balancing) 是指将大量并发请求或数据流量按某种策略分发到多台后端节点上分别处理,从而提升系统的整体吞吐能力、可用性与可扩展性。它的本质是在客户端和服务端之间引入一个"分发层",对外暴露统一入口,对内把流量调度到一组真实服务器。

Linux 网络命名空间

网络命名空间(network namespace,常缩写为 netns)是 Linux 内核提供的一种资源隔离机制。它让不同进程看到完全独立的网络栈:网卡接口、路由表、防火墙规则、ARP 表、端口号乃至 /proc/net/sys/class/net 的视图,彼此互不干扰。

Linux 中的虚拟网络接口

  • 对应字符设备 /dev/net/tun
  • 是操作系统内核中的虚拟网络设备,由用户层程序提供数据的接收与传输。
  • 普通的物理网络接口如 eth0,它的两端分别是内核协议栈和外面的物理网络。而对于 TUN/TAP 虚拟接口如 tun0,它的一端一定连接着用户层程序,另一端则视配置方式的不同而变化,可以直连内核协议栈,也可以是某个 bridge。
  • TUN 和 TAP 的区别在于工作的网络层次不同:用户程序通过 TUN 设备只能读写网络层的 IP 数据包,而 TAP 设备则支持读写链路层的数据包(通常是以太网数据包,带有 Ethernet header)。
  • TUN 与 TAP 的关系,就类似于 socket 与 raw socket。
  • TUN/TAP 应用最多的场景是 VPN 代理,比如 clash、tun2socks。

即 IPv4 in IPv4,在 IPv4 报文的基础上再封装一个 IPv4 报文。

Linux 中通过函数名字符串在 C/C++ 里获取并调用函数地址

在写服务端代码时,有时会遇到这样一个需求:手里只有一段字符串形式的函数名(比如从配置文件、RPC 路由表或测试 harness 里读出来),却要据此拿到函数的内存地址并调用它。这在 C/C++ 这种编译期绑定(static binding)的语言里并不天然——编译器在编译期就把函数调用绑成了固定地址,符号信息默认只在链接阶段使用,运行期通常不可见。