iptables basic

iptables basic iptables 是 Linux 内核集成的 IP 信息包过滤系统。该系统用于在 Linux 系统上控制 IP 数据包过滤和防火墙配置 iptables 操作的是 2.4 以上内核的 netfilter。所以需要 linux 的内核在 2.4 以上。其功能与安全性远远比其前辈 ipfwadm, ipchains 强大,iptables大致是工作在OSI七层的二、三、四层,其前辈ipchains不能单独实现对tcp/udp port以及对mac地址的的定义与操作 iptables-nft iptables vs. iptables-nft https://developers.redhat.com/blog/2020/08/18/iptables-the-two-variants-and-their-relationship-with-nftables#the_iptables_rules_appear_in_the_nftables_rule_listing iptables 包含4个表,5个链 其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度. 4个表: filter, nat, mangle, raw,默认表是 filter (没有指定表 ( -t ) 的时候就是filter表) 。 表的处理优先级: raw>mangle>nat>filter 4 个表 filter: 一般的过滤功能, 这是默认的表,包含了内建的链 INPUT (处理进入的包)、FORWARD (处理通过的包) 和OUTPUT (处理本地生成的包) 。 nat: 用于nat功能 (端口映射,地址映射等),对应的链: PREROUTING (修改到来的包)、OUTPUT (修改路由之前本地的包) 、POSTROUTING (修改准备出去的包) ,centos6没有input链,centos7 有 input 链。 mangle: 用于对特定数据包的修改, 对应的链: PREROUTING (修改路由之前进入的包) ,input, OUTPUT (修改路由 IPTABLES 之前本地的包), forward, postrouting raw: 优先级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能 5 个链: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING PREROUTING: 数据包进入路由表之前 INPUT: 通过路由表后目的地为本机 FORWARD: 通过路由表后, 目的地不为本机 OUTPUT: 由本机产生, 向外转发 POSTROUTIONG: 发送到网卡接口之前 iptables 规则的语法 iptables [-t table] COMMAND chain CRETIRIA -j ACTION -t table : 3个filter nat mangle COMMAND: 定义如何对规则进行管理 chain: 指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的 CRETIRIA:指定匹配标准 -j ACTION :指定如何进行处理 iptables [-t table] COMMAND chain CRETIRIA -j ACTION iptables [-t table] -[AD] chain rule-specification [options] iptables [-t table] -I chain [rulenum] rule-specification [options] iptables [-t table] -R chain rulenum rule-specification [options] iptables [-t table] -D chain rulenum [options] iptables [-t table] -[LFZ] [chain] [options] # 创建新的链 iptables [-t table] -N chain iptables [-t table] -X [chain] iptables [-t table] -P chain target [options] iptables [-t table] -E old-chain-name new-chain-name # 创建链 iptables -t mangle -N chain0 指定链 iptables -t filter -L FORWARD nf_conntrack iptalbes 会使用 nf_conntrack 模块跟踪连接,而这个连接跟踪的数量是有最大值的,当跟踪的连接超过这个最大值,就会导致连接失败。 通过命令查看 ...

2026-05-10 · 8 min · 1523 words · -

IPv6 地址类型与配置

GUA(Global Unicast Address,全局单播地址) GUA 是 IPv6 中可在公网上路由的地址类型,相当于 IPv4 的公网 IP。 地址格式 GUA 地址以 2000::/3 开头,即前 3 位为 001,实际分配中几乎所有 GUA 地址都以 2 或 3 开头。 | 48 位全局路由前缀 | 16 位子网 ID | 64 位接口 ID | 全局路由前缀(Global Routing Prefix):由 ISP 或 RIR 分配,用于全球路由 子网 ID(Subnet ID):由站点管理员划分子网 接口 ID(Interface ID):标识同一子网内的主机,通常通过 SLAAC(EUI-64)或随机生成 典型示例 2001:0db8:85a3:0000:0000:8a2e:0370:7334 其中 2001:0db8::/32 是文档示例专用前缀(RFC 3849),不会在公网上实际路由。 与 IPv4 公网 IP 的对比 特性 IPv4 公网 IP IPv6 GUA 全球可路由 ✓ ✓ 地址数量 约 43 亿 约 $3.4 \times 10^{38}$ NAT 需求 通常需要 通常不需要 分配方式 ISP 分配(动态/静态) ISP 分配前缀,设备自动生成 常见 GUA 前缀段 ...

2026-05-09 · 3 min · 428 words · -

ping command, fping

ping command, fping ping6 ping6 是用于测试 IPv6 网络连通性的工具,功能与 ping 相同,但基于 ICMPv6 协议。 使用 ICMPv6 Echo Request/Reply 报文 目标地址为 IPv6 地址(如 ::1、2001:db8::1)或支持 IPv6 的域名 在现代 Linux 系统中,ping 已整合 IPv6 支持,可直接用 ping -6 替代 ping6 # 测试本地 IPv6 回环 ping6 ::1 # 等价写法(现代系统) ping -6 ::1 # ping 链路本地地址时需指定网络接口(fe80:: 开头的地址必须指定接口) ping6 -I eth0 fe80::1 # 指定发送次数 ping6 -c 4 2001:4860:4860::8888 主要选项与 ping 基本相同,如 -c(次数)、-i(间隔)、-s(包大小)、-I(指定接口)。 options -s<数据包大小>:设置数据包的大小; -M hint 设置MTU(最大传输单元)分片策略。 可设置为: ‘do’:禁止分片,即使包被丢弃; ‘want’:当包过大时分片; ‘dont’:不设置分片标志(DF flag); install # ubuntu apt install iputils-ping # archlinux install fping pacman -S fping windows 长 ping ping 192.168.1.100 -t 指定网络设备 ping -c 1 -I veth0 192.168.3.102 同时显示统计信息 fping -l google.com 什么是 ping PING (Packet Internet Grope),因特网包探索器,用于测试网络连接量的程序。Ping发送一个ICMP回声请求消息给目的地并报告是否收到所希望的ICMP回声应答。 ...

2026-05-08 · 2 min · 382 words · -

drill, dns tool, dig/drill, dnsutils to ldns dig -> dirll

drill, dns tool, dig/drill, dnsutils to ldns dig -> dirll drill if you can, dig if you have to, nslookup if you must https://imdjh.github.io/toolchain/2015/10/07/drill-if-you-can-dig-if-you-have-to.html # install drill ## macOS brew install ldns ## aws linux dnf install ldns-utils ## archlinux sudo pacman -S ldns # ubuntu sudo apt install ldnsutils # alpine apk add drill # install dig ## cenos yum install bind-utils # DNS 解析跟踪 dig +trace wiloon.com dirll -T wiloon.com drill -TD wiloon.com drill wiloon.com @192.168.50.1 drill wangyue.dev NS dig,其实是一个缩写,即Domain Information Groper。 ...

2026-05-08 · 1 min · 206 words · -

nginx basic, command

vhost(虚拟主机) nginx 中每个 server {} 块就是一个虚拟主机(vhost,Virtual Host),同一台服务器上可以配置多个 server {} 块,让 nginx 同时托管多个网站或服务。 nginx 收到请求后,依次匹配 listen(端口/IP)和 server_name(域名),找到对应的 server {} 块处理请求。如果没有匹配项,则使用第一个定义的 server 或标记了 default_server 的块。 基于域名(最常用) server { listen 80; server_name example.com; root /var/www/example; } server { listen 80; server_name another.com; root /var/www/another; } 基于端口 server { listen 8080; server_name localhost; } server { listen 9090; server_name localhost; } 基于 IP server { listen 192.168.1.1:80; } server { listen 192.168.1.2:80; } nginx basic, command # Do not run, just test the configuration file. sudo nginx -t nginx -s signal # stop — fast shutdown # quit — graceful shutdown # reload — reloading the configuration file # reopen — reopening the log files almalinux install nginx sudo dnf update -y sudo dnf install nginx -y sudo systemctl enable --now nginx # install # nerdctl nerdctl run -d \ --name nginx \ --restart=always \ -p 80:80 \ -p 443:443 \ -v nginx-config:/etc/nginx \ -v nginx-www:/var/www \ -v /etc/letsencrypt:/etc/letsencrypt \ -v /etc/localtime:/etc/localtime:ro \ nginx:1.29.1 # docker docker run -d \ --name nginx \ --restart=always \ -p 80:80 \ -p 443:443 \ -v nginx-config:/etc/nginx \ -v nginx-www:/var/www \ -v /etc/letsencrypt:/etc/letsencrypt \ -v /etc/localtime:/etc/localtime:ro \ nginx:1.27.2 docker run -d \ --name nginx \ --restart=always \ -p 80:80 \ -p 443:443 \ -v nginx-config:/etc/nginx \ -v nginx-www:/var/www \ -v /etc/localtime:/etc/localtime:ro \ nginx:1.27.2 # podman podman run -d \ --name nginx \ -p 80:80 \ -p 443:443 \ -p 1022:1022 \ -v nginx-config:/etc/nginx \ -v nginx-www:/var/www \ -v nginx-cert:/etc/letsencrypt \ -v /etc/localtime:/etc/localtime:ro \ nginx:1.27.2 # nginx config text docker run --name nginx-config-test --rm -t -a stdout -v nginx-conf:/etc/nginx:ro nginx nginx -c /etc/nginx/nginx.conf -t # archlinux, mainline branch: new features, updates, bugfixes sudo pacman -S nginx-mainline # start sudo systemctl enable --now nginx # restart kill -HUP pid #stop kill -s QUIT 1628 文件下载 server { listen 8088; location /download/images { alias /home/net-files/images; # 我在这个路径下放了一张图片: fei_ji.jpg } } 下载 curl "http://my_ip_address:8088/download/images/fei_ji.jpg" > test.jpg ———————————————— 版权声明: 本文为CSDN博主「tomeasure」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接: https://blog.csdn.net/qq_29695701/article/details/86491331

2026-04-29 · 2 min · 321 words · -

Backpressure, 背压

什么是背压 背压 (Backpressure, back-pressure), 又称负压。 Backpressure 并不是响应式编程 (Reactive Programming) 独有的概念, 也不是一种「机制」或「策略」。 Backpressure 是一种现象: 在数据流从上游生产者向下游消费者传输的过程中, 上游生产速度大于下游消费速度, 导致下游的 Buffer 溢出, 这种现象就叫做 Backpressure。 背压的本质 可以用水管来类比: 上游 = 水源 (生产者, Producer) 下游 = 水龙头 / 水桶 (消费者, Consumer) 管道 = 消息队列 / Buffer 当水源出水速度远远大于水桶的接收速度时, 管道中的水压就会升高。如果不加以控制, 水桶会溢出, 即数据丢失或系统崩溃。这个"升高的压力"就是背压。 背压出现的场景 背压广泛存在于各类系统中: 消息队列: 生产者发送消息的速率超过消费者消费速率, 队列积压 流式计算: Kafka、Flink 等处理管道中, 上游数据涌入速度超过下游处理能力 网络传输: TCP 协议中, 发送方速率超过接收方处理能力时, 接收窗口收缩 响应式编程: RxJava、Project Reactor 等框架需要显式处理背压 微服务调用链: 下游服务响应慢, 上游请求积压导致线程池耗尽 背压的处理策略 背压本身是现象, 应对背压才是策略。常见的应对方式有以下几种: 1. 控制生产速率 (Flow Control) 主动降低上游的生产速度, 使其与下游消费能力匹配。典型实现是 TCP 的滑动窗口机制: 接收方通过 ACK 报文中的窗口大小字段, 告知发送方当前可接收的数据量。 ...

2026-03-20 · 3 min · 439 words · -

kong

Kong 插件开发语言 Kong 支持使用多种语言开发自定义插件: 语言 方式 说明 Lua 原生支持 Kong 基于 OpenResty/Lua 构建,Lua 是最成熟、性能最好的插件开发语言,官方内置插件均用 Lua 编写 Go Go PDK 通过 go-pdk 库开发,编译为独立进程,Kong 通过 IPC 通信调用 JavaScript / TypeScript JavaScript PDK 通过 kong-js-pdk 开发,运行在独立的 Node.js 进程中 Python Python PDK 通过 kong-python-pdk 开发,运行在独立进程中,适合快速原型开发 WebAssembly (Wasm) Wasm Filter Kong 3.4+ 支持,可以用 Rust、C/C++、Go (TinyGo) 等编译到 Wasm 的语言开发,性能接近原生 除 Lua 外的其他语言插件都通过进程间通信(IPC)与 Kong 交互,会有一定的性能开销。生产环境对性能要求高的场景推荐使用 Lua 或 Wasm。 kong run postgresql docker network create kong-net # 创建 postgresql, 并创建一个实例 kong-db # KONG_DATABASE 数据库类型,必须是 postgres # 初始化 kong 数据库 nerdctl run --rm \ -e KONG_DATABASE=postgres \ -e KONG_PG_HOST=postgresql \ -e KONG_PG_PORT=5432 \ -e KONG_PG_USER=user_0 \ -e KONG_PG_PASSWORD=password_0 \ -e KONG_PG_DATABASE=kong_db \ -e KONG_PASSWORD=password_0 \ kong:3.9.1 kong migrations bootstrap # kong OSS + kong manager OOS nerdctl run -d --name kong \ --network=kong-net \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=postgresql" \ -e "KONG_PG_PORT=5432" \ -e "KONG_PG_USER=user_0" \ -e "KONG_PG_PASSWORD=password_0" \ -e "KONG_PG_DATABASE=kong_db" \ -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \ -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \ -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \ -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \ -e "KONG_PROXY_LISTEN=0.0.0.0:8000,0.0.0.0:8443 ssl" \ -e "KONG_ADMIN_LISTEN=0.0.0.0:8001,0.0.0.0:8444 ssl" \ -e "KONG_ADMIN_GUI_LISTEN=0.0.0.0:8002" \ -p 80:8000 \ -p 443:8443 \ -p 8444:8444 \ -p 8001:8001 \ -p 8002:8002 \ kong:3.9.1 # -p 80:8000 # HTTP 代理端口 # -p 443:8443 # HTTPS 代理端口 # -p 8001:8001 # Admin API HTTP 端口 # -p 8444:8444 # Admin API HTTPS 端口 # -p 8002:8002 # Admin GUI HTTP 端口 curl -i -X GET --url http://localhost:8001/services # Kong Manager OSS http://kong:8002/ load balance # 创建一个 upstream curl -X POST http://192.168.50.31:8001/upstreams --data "name=k8s" # 添加两个 targets 到 upstream curl -X POST http://192.168.50.31:8001/upstreams/k8s/targets \ --data "target=192.168.50.80:6443" \ --data "weight=100" curl -X POST http://192.168.50.31:8001/upstreams/k8s/targets \ --data "target=192.168.50.82:6443" \ --data "weight=100" # 创建一个Service 目标到 Blue upstream # host: upstream name curl -X POST http://192.168.50.31:8001/services/ \ --data "name=k8s-service" \ --data "host=k8s" # 最后, 添加一个 Route 作为一个端点到 Service curl -X POST http://192.168.50.31:8001/services/k8s-service/routes/ \ --data "hosts[]=k8s.wiloon.com" commands curl -s localhost:8001 | jq '.configuration' kong manager add route upstreams name: enx-api targets target address: enx:8080 gateway service new gateway service name: enx-api-service service endpoint protocol: https host: enx-api-upstream ca certificate cert: past the content of ca-cert.crt certificates cert: the content of wiloon.crt key: wiloon.key upstreams Upstream 是在 Kong 中管理后端服务的负载均衡机制。当请求到达 Service 时,Kong 会通过定义的 Upstream 来选择一个具体的后端实例(例如,一个微服务的多个副本)。 如果不使用负载均衡就不需要配置 upstreams 了, 直接在 gateway service 中配置 service endpoint 即可. ...

2026-02-11 · 4 min · 662 words · -

linux 网络监控, NetHogs

linux 网络监控, NetHogs 推荐工具: bandwhich - 进程级网络监控,显示连接详情(推荐) btop++ - 全能系统监控(含网络) bottom - 轻量级系统监控 nethogs - 经典进程带宽监控 按功能分类: 监控总体带宽使用 - nload、bmon、slurm、bwm-ng、cbm、speedometer、netload 监控总体带宽使用(批量式输出)- vnstat、ifstat、dstat、collectl 每个套接字连接的带宽使用 - iftop、iptraf、tcptrack、pktstat、netwatch、trafshow 每个进程的带宽使用 - bandwhich、nethogs 全面系统监控(含网络)- btop++、bottom nethogs sudo pacman -S nethogs # 刷新频率 5 秒 nethogs -d 5 网络监控工具推荐 bandwhich - 专注网络的监控工具 最推荐用于网络流量监控 - 使用 Rust 编写,2019 年开始开发 核心特点: 🚀 现代化的终端 UI,彩色交互界面 📊 实时显示每个进程、连接、远程地址的网络使用情况 🎯 可同时查看进程级和连接级的流量详情 💡 显示目标主机名(DNS 解析)、端口、协议 ⚡ 性能优秀,资源占用低 🔍 支持排序和过滤功能 适用场景: 排查哪个程序在占用网络带宽 监控异常网络连接和流量去向 查看具体的远程地址和端口信息 # 安装(Arch Linux) sudo pacman -S bandwhich # 使用(需要 root 权限) sudo bandwhich 与 nethogs 对比: ...

2025-12-24 · 5 min · 992 words · -

netcat

netcat check if netcat is installed # check if netcat is available which nc # or try to get the version/help nc -h # or check if it's installed via package manager pacman -Qs netcat check remote UDP port # send UDP packet to remote host and check if port is listening echo "test" | nc -u -w 1 remote_host port # use -v for verbose output, -z for scan mode nc -vuz remote_host port # if port is closed, you may receive ICMP port unreachable response # if port is open but service doesn't respond, it's hard to determine the status 参数说明: ...

2025-12-05 · 2 min · 383 words · -

wireguard

wireguard wireguard default port: 51820 install archlinux archlinux 新版本的内核已经集成了 wireguard,不需要单独安装. archlinux 集成了 wireguard 但是默认没加载, 需要配置一下启动的时候加载 wireguard 内核模块. # 查看 wireguard 内核模块是不是已经加载了 lsmod | grep wireguard # 手动加载内核模块 sudo modprobe wireguard # 再看一下应该已经加载了 lsmod | grep wireguard # load kernel module at boot vim /etc/modules-load.d/wireguard.conf # content of wireguard.conf # load wireguard module at boot wireguard # 安装 wireguard 管理工具, wireguard 集成进内核了, 但是管理工具 (wg) 还是要手动安装的 pacman -Sy wireguard-tools Ubuntu, Debian sudo apt install wireguard macos brew install wireguard-tools 在 App Store 安装 wireguard ...

2025-08-31 · 6 min · 1074 words · -

openwrt basic, opkg basic, ipk

openwrt basic, opkg basic, ipk commands # 查看 openwrt 版本 cat /etc/openwrt_release # 更新所有软件,包括 OpenWRT 内核、固件等 opkg list-upgradable | cut -f 1 -d ' ' | xargs opkg upgrade wan dns 在 wan 口设置里的“高级设置”选项里去掉"使用端局通告的DNS服务器"的勾选就可以使用自定义的DNS服务器 ssh port vim /etc/init.d/dropbear validate_section_dropbear > port ssh public key vim /etc/dropbear/authorized_keys dns 配置 查看本机的 DNS 配置: $ cat /etc/resolv.conf search lan nameserver 127.0.0.1 发现使用的是本机 DNS 服务器,即 dnsmasq。 查看 dnsmasq 配置: $ cat /etc/dnsmasq.conf 手动指定上游 dns vi /etc/dnsmasq.conf server=223.5.5.5 server=223.6.6.6 openwrt 改IP vi /etc/config/network opwnert init opkg install coreutils-nohup opkg install ipset opkg remove dnsmasq opkg install dnsmasq-full openwrt cron /etc/init.d/cron start /etc/init.d/cron enable crontab -e crontab -l x86, firmware download https://downloads.openwrt.org/releases/19.07.6/targets/x86/ ...

2022-08-11 · 3 min · 483 words · -

resolv.conf, systemd-resolved, DNS

resolv.conf, systemd-resolved, DNS # 查看版本 systemd-resolve --version # check systemd-resolved status resolvectl status resolvectl restart # disable dns on 53 port vim /etc/systemd/resolved.conf # switch off binding to port 53 DNSStubListener=no # disable LLMNR LLMNR=false https://cloud-atlas.readthedocs.io/zh_CN/latest/linux/redhat_linux/systemd/systemd_resolved.html 测试 域名解析 resolvectl query goproxy.cn resolvectl query baidu.com resolvectl query google.com 配置 vim /etc/systemd/resolved.conf [Resolve] # DNS: 上游的 dns 服务器, 可以配置多条, 用空格分隔 DNS=192.168.50.1 # FallbackDNS: 一个空格分隔的 IPv4 与 IPv6 地址列表。用作系统的替补 DNS 服务器。此选项所设置的 DNS 服务器仅在实在找不到可用 DNS 的情况下才会被使用。 FallbackDNS=223.5.5.5 223.6.6.6 114.114.114.114 #Domains= #LLMNR=yes #MulticastDNS=yes #DNSSEC=allow-downgrade #DNSOverTLS=no #Cache=yes #DNSStubListener=yes #ReadEtcHosts=yes # 重启服务 systemctl restart systemd-resolved # check systemd-resolved status resolvectl status # 确认状态 systemd-resolve --status link ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf archlinux ...

2022-08-03 · 1 min · 139 words · -

socat

socat socat 测试端口连通性, test a remote port is reachable with socat # test tcp port socat /dev/null TCP:192.168.1.15:22 socat - tcp4:192.168.1.15:22,connect-timeout=3 # test udp port # https://serverfault.com/questions/416205/testing-udp-port-connectivity # set up a server listening on UDP port 1234 socat UDP-RECV:1234 STDOUT # or socat STDIO UDP-LISTEN:1234 # test udp port socat - UDP:localhost:1234 http server, 加载本地 .html 文件 echo "foo">foo.html socat -v -v TCP-LISTEN:8000,crlf,reuseaddr,fork SYSTEM:"echo HTTP/1.0 200; echo Content-Type\: text/plain; echo; cat foo.html" https://stackoverflow.com/questions/29739901/socat-fake-http-server-use-a-file-as-server-response ...

2022-04-19 · 3 min · 533 words · -

iproute2 > 路由表, routing table, ip route

iproute2 > 路由表, routing table, ip route commands ip route # 简写, Abbreviations # route: ro, r. # show: list, sh, ls, l. ip route ls tab all ip route Usage: ip route { list | flush } SELECTOR := 表示声明并定义 { xxx | xxx } 表示多选 - 必选 [] 表示可选 SPEC 应该是 specification 的缩写 NH 应该是 next hop 的缩写 PREFIX 就是地址加掩码的格式, 比如 0.0.0.0/0 PREFIX 有个 default 的特殊表示, 等同于 0.0.0.0/0, 也就是默认路由 路由表 linux 系统路由表可以自定义从 1-252 个路由表, 操作系统维护了 4 个路由表: ...

2022-02-11 · 14 min · 2819 words · -

tcpcopy, 流量复制

tcpcopy, 流量复制 公有云环境 https://github.com/session-replay-tools/tcpcopy/issues/336 云环境下,安全策略可能会干扰测试的进行 采用如下步骤可以规避麻烦: 测试机器和 intercept 部署到一台机器 tcpcopy端 -c 参数采用 tcpcopy 所在的线上机器ip地址 在线上机器设置iptables黑洞来过滤掉测试服务器的响应包 iptables -I INPUT -p tcp --sport 测试服务的端口 -j DROP -s 测试服务所在机器的ip地址 千万要注意在测试服务器不要设置路由了,否则会受到干扰 环境 测试用的 tcp 服务 tcp-echo-server 线上服务器, online source server, xxx.xxx.20.50 2000 端口提供服务 (tcp-echo-server) 测试服务器, 目标服务器, target server, xxx.xxx.20.45, 192.168.50.102 3000 端口提供服务 (tcp-echo-server), 不能跟 online server 用同一个端口 辅助服务器, assistant server, xxx.xxx.20.45, intercept 跟测试服务部署到同一个机器, 不使用单独的服务器 线上服务器安装 tcpcopy git clone https://github.com/session-replay-tools/tcpcopy.git cd tcpcopy ./configure --single make make install ls /usr/local/tcpcopy 辅助服务器 (intercept) 安装 git clone https://github.com/session-replay-tools/intercept.git cd intercept ./configure --single make make install ls /usr/local/intercept 实时复制流量 测试服务器 192.168.50.102 测试服务器不添加路由规则. ...

2022-02-11 · 3 min · 630 words · -

TCP 拥塞控制算法, CUBIC, BBR

BBR 检查是否已经开启了 BBR # 如果结果中带有bbr,则证明你的内核已开启 bbr。 sysctl net.ipv4.tcp_available_congestion_control BBR 对 TCP 性能的提升是巨大的,它能更有效地使用当下网络环境,Youtube 应用后在吞吐量上有平均 4% 提升 (对于日本这样的网络环境有 14% 以上的提升) 报文的往返时延 RTT 降低了 33%,这样如视频这样的大文件传输更快,用户体验更好: 不像 CUBIC 这种基于丢包做拥塞控制,常导致瓶颈路由器大量报文丢失,所以重新缓存的平均间隔时间也有了 11%提升: 在 Linux 4.19 内核中已经将拥塞控制算法从 CUBIC (该算法从 2.6.19 内核就引入 Linux了)改为 BBR, 而即将面世的基于 UDP 的 HTTP3 也使用此算法。许多做应用开发的同学可能并不清楚什么是拥塞控制,BBR 算法到底在做什么, 我在《Web协议详解与抓包实战》这门课程中用了 6 节课在讲相关内容,这里我尝试下用一篇图片比文字还多的文章把这个事说清楚。 TCP 协议是面向字符流的协议,它允许应用层基于 read/write 方法来发送、读取任意长的字符流: 但 TCP 之下的 IP 层是基于块状的 Packet 报文来分片发送的,因此, TCP 协议需要将应用交付给它的字符流拆分成多个 Packet (在 TCP 传输层被称为 Segment)发送,由于网速有变化且接收主机的处理性能有限, TCP 还要决定何时发送这些 Segment。TCP 滑动窗口解决了 Client、Server 这两台主机的问题, 但没有去管连接中大量路由器、交换机转发 IP 报文的问题,因此当瓶颈路由器的输入流大于其输出流时,便会发生拥塞 ...

2021-11-17 · 2 min · 393 words · -

linux 报文高速捕获技术对比, napi/libpcap/afpacket/pfring/dpdk/xdp

linux 报文高速捕获技术对比, napi/libpcap/afpacket/pfring/dpdk/xdp 传统linux网络协议栈流程和性能分析 Linux网络协议栈是处理网络数据包的典型系统,它包含了从物理层直到应用层的全过程。 数据包到达网卡设备。 网卡设备依据配置进行DMA操作。 (第1次拷贝:网卡寄存器->内核为网卡分配的缓冲区 ring buffer) 网卡发送中断,唤醒处理器。 驱动软件从ring buffer中读取,填充内核skbuff结构 (第2次拷贝:内核网卡缓冲区ring buffer->内核专用数据结构skbuff) 数据报文达到内核协议栈,进行高层处理。 socket系统调用将数据从内核搬移到用户态。(第3次拷贝:内核空间->用户空间) 研究者们发现,Linux内核协议栈在数据包的收发过程中,内存拷贝操作的时间开销占了整个处理过程时间开销的65%,此外层间传递的系统调用时间也占据了8%~10%。 协议栈的主要问题: 针对单个数据包级别的资源分配和释放 每当一个数据包到达网卡,系统就会分配一个分组描述符用于存储数据包的信息和头部,直到分组传送到用户态空间,其描述符才被释放。此外,sk_buff 庞大的数据结构中的大部分信息对于大多数网络任务而言都是无用的. 流量的串行访问 现代网卡包括多个硬件的接收端扩展(receiver-side scaling, RSS)队列可以将分组按照五元组散列函数分配到不同的接收队列。使用这种技术,分组的捕获过程可以被并行化,因为每个RSS队列可以映射到一个特定的CPU核,并且可以对应相应的NAPI线程。这样整个捕获过程就可以做到并行化。 但是问题出现在之上的层次,Linux中的协议栈在网络层和传输层需要分析合并的所有数据包 ①所有流量在一个单一模块中被处理,产生性能瓶颈; ②用户进程不能够从一个单一的RSS队列接收消息. 这就造成了上层应用无法利用现代硬件的并行化处理能力,这种在用户态分配流量先后序列的过程降低了系统的性能,丢失了驱动层面所获得的加速. 此外,从不同队列合并的流量可能会产生额外的乱序分组 从驱动到用户态的数据拷贝 从网卡收到数据包到应用取走数据的过程中,存在至少2次数据包的复制 内核到用户空间的上下文切换 从应用程序的视角来看,它需要执行系统调用来接收每个分组.每个系统调用包含一次从用户态到内核态的上下文切换,随之而来的是大量的CPU时间消耗.在每个数据包上执行系统调用时产生的上下文切换可能消耗近1 000个CPU周期. 跨内存访问 例如,当接收一个64 B分组时,cache未命中造成了额外13.8%的CPU周期的消耗.另外,在一个基于NUMA的系统中,内存访问的时间取决于访问的存储节点.因此,cache未命中在跨内存块访问环境下会产生更大的内存访问延迟,从而导致性能下降. 提高捕获效率的技术 目前高性能报文捕获引擎中常用的提高捕获效率的技术,这些技术能够克服之前架构的性能限制. 预分配和重用内存资源 这种技术包括: 开始分组接收之前,预先分配好将要到达的数据包所需的内存空间用来存储数据和元数据(分组描述符).尤其体现在,在加载网卡驱动程序时就分配好 N 个描述符队列(每个硬件队列和设备一个). 同样,当一个数据包被传送到用户空间,其对应的描述符也不会被释放,而是重新用于存储新到达的分组.得益于这一策略,在每个数据包分配/释放所产生的性能瓶颈得到了消除.此外,也可以通过简化 sk_buff 的数据结构来减少内存开销. 数据包采用并行直接通道传递. 为了解决序列化的访问流量,需要建立从RSS队列到应用之间的直接并行数据通道.这种技术通过特定的RSS队列、特定的CPU核和应用三者的绑定来实现性能的提升. 这种技术也存在一些缺点: ①数据包可能会乱序地到达用户态,从而影响某些应用的性能; ②RSS使用Hash函数在每个接收队列间分配流量.当不同核的数据包间没有相互关联时,它们可以被独立地分析,但如果同一条流的往返数据包被分配到不同的CPU核上时,就会造成低效的跨核访问. 内存映射. 使用这种方法,应用程序的内存区域可以映射到内核态的内存区域,应用能够在没有中间副本的情况下读写这片内存区域. 用这种方式我们可以使应用直接访问网卡的DMA内存区域,这种技术被称为零拷贝.但零拷贝也存在潜在的安全问题,向应用暴露出网卡环形队列和寄存器会影响系统的安全性和稳定性 . 数据包的批处理. 为了避免对每个数据包的重复操作的开销,可以使用对数据包的批量处理. 这个策略将数据包划分为组,按组分配缓冲区,将它们一起复制到内核/用户内存.运用这种技术减少了系统调用以及随之而来的上下文切换的次数;同时也减少了拷贝的次数,从而减少了平摊到处理和复制每个数据包的开销. 但由于分组必须等到一个批次已满或定时器期满才会递交给上层,批处理技术的主要问题是延迟抖动以及接收报文时间戳误差的增加. 亲和性与预取. 由于程序运行的局部性原理,为进程分配的内存必须与正在执行它的处理器操作的内存块一致,这种技术被称为内存的亲和性. CPU亲和性是一种技术,它允许进程或线程在指定的处理器核心上运行. 在内核与驱动层面,软件和硬件中断可以用同样的方法指定具体的CPU核或处理器来处理,称为中断亲和力.每当一个线程希望访问所接收的数据,如果先前这些数据已被分配到相同CPU核的中断处理程序接收,则它们在本地cache能够更容易被访问到. 典型收包引擎 3.1 libpcap 参考:libpcap实现机制及接口函数 libpcap的包捕获机制是在数据链路层增加一个旁路处理,不干扰系统自身的网路协议栈的处理,对发送和接收的数据包通过Linux内核做过滤和缓冲处理,最后直接传递给上层应用程序。 ...

2021-10-31 · 2 min · 286 words · -

tcp proxy

tcp proxy https://github.com/jpillora/go-tcp-proxy TCP半开连接与半闭连接 https://www.cnblogs.com/cangqinglang/p/9558236.html half-open connection, 半开连接 https://bbs.huaweicloud.com/blogs/301407 处于 establish 状态的服务端如果收到了客户端的 SYN 报文(注意此时的 SYN 报文其实是乱序的,因为 SYN 报文的初始化序列号其实是一个随机数),会回复一个携带了正确序列号和确认号的 ACK 报文,这个 ACK 被称之为 Challenge ACK。 接着,客户端收到这个 Challenge ACK,发现序列号并不是自己期望收到的,于是就会回 RST 报文,服务端收到后,就会释放掉该连接。 RFC 文档解释 rfc793 文档里的第 34 页里,有说到这个例子。 原文的解释我也贴出来给大家看看。 When the SYN arrives at line 3, TCP B, being in a synchronized state, and the incoming segment outside the window, responds with an acknowledgment indicating what sequence it next expects to hear (ACK 100). TCP A sees that this segment does not acknowledge anything it sent and, being unsynchronized, sends a reset (RST) because it has detected a half-open connection. TCP B aborts at line 5. TCP A willcontinue to try to establish the connection;

2021-10-02 · 1 min · 112 words · -

pve + openwrt

pve + openwrt 局域网网段: 192.168.50.0/24 pve 宿主机 ip: 192.168.50.6 软路由 ip: 192.168.50.1 download openwrt image 下载 “ext4-combined-efi” curl -O https://downloads.openwrt.org/releases/19.07.7/targets/x86/64/openwrt-19.07.7-x86-64-combined-ext4.img.gz curl -O https://downloads.openwrt.org/releases/21.02.3/targets/x86/64/openwrt-21.02.3-x86-64-generic-ext4-combined-efi.img.gz curl -O https://downloads.openwrt.org/releases/24.10.0/targets/x86/64/openwrt-24.10.0-x86-64-generic-ext4-combined-efi.img.gz upload image to pve # 解压出 .img 文件 gunzip openwrt-19.07.7-x86-64-combined-ext4.img.gz 把 openwrt-24.10.0-x86-64-generic-ext4-combined-efi.img 上传到 pve local pve>local(xxx)>ISO Images>upload 创建虚拟机 点击 “创建虚拟机(Create VM)”, 填写虚拟机名称 (例如 openwrt-24-10), 选"高级",勾选"开机自启动" (软路由必须开机启动) ,点击"下一步"。 OS: CD/DVD 选择 “Do not use any media”(不要去选择刚才上传的镜像),点击"下一步"。 System: 系统选项卡全部默认,点击"下一步"。 Disk: 硬盘不用改,之后会删除,会用上一步下载的 .img 镜像创建虚拟磁盘。 CPU 核心数量按需添加,一般双核足够了 内存 256MB 以上都是够的,系统有富余就多加一点,一般不用超过 2GB,点击"下一步" Network: PVE 虚拟机可选网卡模型 (虚拟网卡) 有 Intel E1000、VirtIO (半虚拟化) 、Realtek RTL8139和VMware vmxnet3四种。建议选用默认的 VirtIO (半虚拟化) ,其性能和效率最高。 分离不用的硬盘: 选择刚刚创建的虚拟机 > 硬件(Hardware) > Hard Disk(scsi0) > 点击"分离(Detach)", 然后它会变成 unused disk。 删除不用的硬盘和光驱: 选中"Unused disk 0",点击"删除";再用同样的方法删除不用的光驱。 添加启动盘 上传 Openwrt 镜像: 选择"pve"节点 > local存储空间 > 内容 > 点击上传 > 选择"openwrt-24.10.0-x86-64-generic-ext4-combined-efi.img"镜像 > 点击"上传"。 ...

2021-06-17 · 2 min · 358 words · -

软路由

软路由 GL.inet GL-BE3600 友善 R5s, NanoPi R5S Dell wyse 5070, 单臂软路由 安装PVE https://www.10bests.com/install-proxmox-ve/ PVE里面安装openwrt虚拟机 https://www.10bests.com/install-openwrt-lede-on-pve/ download x86 image ext4磁盘 个人建议用这个镜像 https://downloads.openwrt.org/releases/19.07.3/targets/x86/64/openwrt-19.07.3-x86-64-combined-ext4.img.gz 只读磁盘 https://downloads.openwrt.org/releases/19.07.3/targets/x86/64/openwrt-19.07.3-x86-64-combined-squashfs.img.gz 添加启动盘 上传Openwrt镜像: 选择"pve"节点 > local存储空间 > 内容 > 点击上传 > 选择"openwrt.img"镜像 > 点击"上传",openwrt镜像最好提前重命名一下,原来的太长了。 3. 把镜像转成虚拟磁盘并导入到虚拟机: 选择"pve"节点 > shell > 输入以下命令并回车 qm importdisk 100 /var/lib/vz/template/iso/openwrt-19.07.3-x86-64-combined-ext4.img local-lvm shell会显示vm-102-disk-0虚拟磁盘创建的进度,最后显示‘Successfully imported disk as ‘unused0:local-lvm:vm-102-disk-0’就是添加成功了。 qm importdisk是PVE导入磁盘到虚拟机的工具,后面的参数‘102’是Openwrt虚拟机的编号,‘/var/lib/vz/template/iso/openwrt.img’是刚才上传Openwrt镜像的完整目录,‘local-lvm’是PVE储存虚拟磁盘的存储空间。 导入成功后在‘Openwrt’虚拟机的"硬件"选项卡就能看到一个"未使用的磁盘0",选中它点击编辑,弹出配置窗口,设备类型选"sata",最后点击添加。 切换到虚拟机的"选项"选项卡,双击"引导顺序",第一引导项选"Disk ‘sata0’"。 交换机配置 路由器当交换机用时,在Lan上禁用dhcp Network>Interfaces>Lan>Edit>DHCP Server>General Setup>勾选 “Ignore interface” 在交换机上配置vlan, 隔离掉光猫的DHCP https://www.bilibili.com/video/BV1F5411x7GC?from=search&seid=1805628741909816644 交换机vlan 配置 LAN1: 光猫 LAN2: PVE LAN3 - 4: 其它VLAN1局域网设备 ...

2021-04-26 · 1 min · 161 words · -