当前位置: 首页 > article >正文

Linux性能优化-网络篇-NAT详解

文章目录

  • 前言
  • 一、NAT原理和基础
    • NAT
    • iptables
  • 二、NAT实践
    • SNAT实现
    • DNAT 实现
    • PNAT实现
  • 三、conntrack
    • conntrack命令


前言

本节介绍网络地址转换(Network Address Translation),缩写为NAT。


一、NAT原理和基础

NAT

NAT技术可以重写IP数据包的源IP或者目的IP,被普遍用来解决公网IP地址短缺的问题。
NAPT(Network Address and Port Translation), 即把内网IP映射到公网IP的不同端口上,让内网IP可以共享同一个公网IP地址。
根据转换方式的不同,我们可以把NAPT分为三类。

  • 第一类,源地址转换SNAT,即目的地址不变,只替换源IP或者源端口。SNAT主要用于,多个内网IP共享同一个公网IP,来访问外网资源场景。
  • 第二类, 目的地址转换DNAT, 即源IP保持不变,只替换目的IP或者端口。DNAT主要通过公网IP的不同端口号,来访问内网的多种服务,同时隐藏后端服务器的真实IP地址。
  • 第三类, 同时使用SNAT和DNAT。当接收到网络包时,执行DNAT,把目的IP转换内网IP; 而发送网络包时,执行SNAT,把源IP替换成外部IP。

iptables

Linux内核提供的Netfilter框架,允许对数据包进行修改(NAT)和过滤(filter).iptables更工具,提供了简单易用的命令行接口,可以方便的配置和管理NAT,防火墙规则。

二、NAT实践

SNAT实现

环境准备 准备主机3台

主机外网IP内网IP
WEB172.22.27.10-
GW172.22.27.20192.168.73.10
Client-192.168.73.20

GW开启核心转发功能

[root@gw ~]# vim /etc/sysctl.conf 
net.ipv4.ip_forward=1

Client端将网关指向GW

[root@client ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.73.10   0.0.0.0         UG    100    0        0 ens33
192.168.73.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33

在网关上配置iptables规则
源地址转换需要在iptables的postrouting上做NAT转换,如果放在prerouting做转换,数据报文尚未经过路由决策,无法知道数据报文所要到达的目标是内网还是外网,所以在prerouting上做转换不合理 在gw上添加规则进行SNAT转换

[root@gw ~]# iptables -t nat -A POSTROUTING -s 192.168.73.0/24 ! -d 192.168.73.0/24 -j SNAT --to-source 172.22.27.20
#当gw上外网的地址为静态地址时可以使用以上命令直接指定转换后的IP地址,当外网地址为动态时就需要使用MASQUERADE这个参数,他会对地址自动识别
[root@gw ~]# iptables -t nat -A POSTROUTING -s 192.168.73.0/24 ! -d 192.168.73.0/24 -j SNAT MASQUERADE

测试在web端进行抓包

[root@web ~]# tcpdump -i ens33 -nn dst port 80

在client端访问web

[root@client ~]# curl 172.22.27.10
this is node1

在web端抓包结果,来请求资源的地址为172.22.27.10

[root@web ~]# tcpdump -i ens33 -nn dst port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
11:58:50.461106 IP 172.22.27.20.36174 > 172.22.27.10.80: Flags [S], seq 1918498498, win 29200, options [mss 1460,sackOK,TS val 24432253 ecr 0,nop,wscale 7], length 0
11:58:50.461605 IP 172.22.27.20.36174 > 172.22.27.10.80: Flags [.], ack 3686753828, win 229, options [nop,nop,TS val 24432253 ecr 24440153], length 0
11:58:50.462022 IP 172.22.27.20.36174 > 172.22.27.10.80: Flags [P.], seq 0:76, ack 1, win 229, options [nop,nop,TS val 24432254 ecr 24440153], length 76: HTTP: GET / HTTP/1.1
11:58:50.485763 IP 172.22.27.20.36174 > 172.22.27.10.80: Flags [.], ack 255, win 237, options [nop,nop,TS val 24432277 ecr 24440177], length 0
11:58:50.486019 IP 172.22.27.20.36174 > 172.22.27.10.80: Flags [F.], seq 76, ack 255, win 237, options [nop,nop,TS val 24432278 ecr 24440177], length 0
11:58:50.486615 IP 172.22.27.20.36174 > 172.22.27.10.80: Flags [.], ack 256, win 237, options [nop,nop,TS val 24432278 ecr 24440178], length 0

DNAT 实现

环境准备 准备主机3台

主机外网IP内网IP
Client172.22.27.10-
GW172.22.27.20192.168.73.10
WEB-192.168.73.20
GW开启核心转发功能
[root@gw ~]# vim /etc/sysctl.conf 
net.ipv4.ip_forward=1

web端将网关指向GW

[root@web ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.73.10   0.0.0.0         UG    100    0        0 ens33
192.168.73.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33

在网关上配置itables规则, 在prerouting链上配置DNAT的转换规则

[root@gw ~] iptables -t nat -A PREROUTING -d 172.22.27.20 -p tcp --dport 80 -j DNAT --to-destination 192.168.73.20
#当内网的web服务使用的为非标准端口时也可以将其端口进行转换,以内网的http服务为8080为例
[root@gw ~] iptables -t nat -A PREROUTING -d 172.22.27.20 -p tcp --dport 80 -j DNAT --to-destination 192.168.73.20:8080

测试
在内网web服务器上进行抓包

[root@web ~]# tcpdump -i ens33 -nn dst port 80

使用外网client进行访问

[root@client ~]# curl 172.22.27.20
this is node3

在内网web上查看抓包的内容

[root@web ~]# tcpdump -i ens33 -nn dst port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
12:27:42.003647 IP 172.22.27.10.46410 > 192.168.73.20.80: Flags [S], seq 2954399785, win 29200, options [mss 1460,sackOK,TS val 26171682 ecr 0,nop,wscale 7], length 0
12:27:42.004005 IP 172.22.27.10.46410 > 192.168.73.20.80: Flags [.], ack 2781463815, win 229, options [nop,nop,TS val 26171683 ecr 26163784], length 0
12:27:42.004116 IP 172.22.27.10.46410 > 192.168.73.20.80: Flags [P.], seq 0:76, ack 1, win 229, options [nop,nop,TS val 26171683 ecr 26163784], length 76: HTTP: GET / HTTP/1.1
12:27:42.005712 IP 172.22.27.10.46410 > 192.168.73.20.80: Flags [.], ack 255, win 237, options [nop,nop,TS val 26171685 ecr 26163786], length 0
12:27:42.005741 IP 172.22.27.10.46410 > 192.168.73.20.80: Flags [F.], seq 76, ack 255, win 237, options [nop,nop,TS val 26171685 ecr 26163786], length 0
12:27:42.006079 IP 172.22.27.10.46410 > 192.168.73.20.80: Flags [.], ack 256, win 237, options [nop,nop,TS val 26171685 ecr 26163786], length 0

从内网上所看到的请求包的来源都是172.22.27.10的主机。

PNAT实现

将发往本机80端口的请求重定向至9527

[root@web ~] iptables -t nat -A PREROUTING -d 192.168.73.20 -p tcp --dport 80 -j REDIRECT --to-ports 9527

三、conntrack

NAT可以正常工作,至少需要两个步骤:

  • 第一,利用Netfilter中的钩子函数(Hook), 修改源地址或者目的地址。
  • 第二,利用连接跟踪模块(conntrack), 关联同一个连接的请求和响应。

内核提供的关于conntrack的配置选项:

# 当前连接跟踪数
net.netfilter.nf_conntrack_count
# 最大连接跟踪数
net.netfilter.nf_conntrack_max
# 连接跟踪表的大小
net.netfilter.nf_conntrack_buckets
# 处于TIME_WAIT的连接跟踪记录,超时清理时间。
net.netfilter.nf_conntrack_tcp_timeout_time_wait

内核工作异常是,可以通过dmesg命令,查询到“nf_conntrack: table full”的报错信息。遇到这个报错,说明net.netfilter.nf_conntrack_max太小了。

conntrack命令

Centos7 安装命令:

yum install conntrack-tools

conntrack命令支持多种参数,用于执行不同的操作✅:

-L, --list:列出连接跟踪表中的所有条目。
-G, --get:获取单个连接跟踪条目的信息。
-D, --delete:从连接跟踪表中删除条目。
-I, --create:创建一个新的连接跟踪条目。
-U, --update:更新已存在的连接跟踪条目。
-E, --event:监听连接跟踪事件。

统计总的连接跟踪数

conntrack -L -o extended | wc -l

查看所有TCP连接

conntrack -L -p tcp

查看所有UDP连接

conntrack -L -p udp

监听连接跟踪事件

conntrack -E
示例输出:实时显示连接跟踪事件,如新建(NEW)、更新(UPDATE)和销毁(DESTROY)事件。


http://www.kler.cn/a/463578.html

相关文章:

  • 力扣【SQL连续问题】
  • vim 的基础使用
  • Vue项目中生成node_modules文件夹的两种常用方法及npm优势
  • 服务器数据恢复—服务器硬盘亮黄灯的数据恢复案例
  • Scrum中敏捷项目经理(Scrum Master)扮演什么角色?
  • java中统一异常处理,如何实现全局异常处理,@RestControllerAdvice 注解实现统一异常处理
  • 基于Docker+模拟器的Appium自动化测试(二)
  • 如何使用网络工具进行网络性能评估
  • 【Rust自学】8.4. String类型 Pt.2:字节、标量值、字形簇以及字符串的各类操作
  • Android Opengl(三)绘制三角形
  • Python 数据可视化的完整指南
  • LLaMA详解
  • springboot520基于Spring Boot的民宿租赁系统的设计与实现(论文+源码)_kaic
  • 安卓入门四 Application Component
  • ubuntu2204 gpu 没接显示器,如何连接vnc
  • JnetPcap抓取数据包IP数据包
  • 3、redis的集群模式
  • selenium 安装Chrome驱动
  • 用点包图洞察医学数据:以血压分析为例
  • 服务器网卡绑定mode和交换机的对应关系
  • MySQL 索引优化实战 – 结合 Explain 深度解析慢查询
  • REST与RPC的对比:从性能到扩展性的全面分析
  • 非关系型数据库和关系型数据库的区别
  • 免登录游客卡密发放系统PHP网站源码
  • Excel 面试 01 “Highlight in red the 10 lowest orders”
  • 如何查看下载到本地的大模型的具体大小?占了多少存储空间:Llama-3.1-8B下载到本地大概15GB