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


前言

本节介绍网络地址转换(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)事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值