4.iptables SNAT DNAT
一、SNAT策略及应用
1、SNAT策略概述
SNAT应用环境
局域网主机共享单个公网IP地址接入Internet(私有IP不能在Internet中正常路由)
SNAT策略的原理
源地址转换,根据指定条件修改数据包的源IP地址,通常被叫做源映射。
SNAT转换前提条件
局域网各主机已正确设置IP地址、子网掩码、默认路由发送数据
Linux网关开启IP路由转发
1.1、开启SNAT命令
Linux系统本身是没有转发功能 只有路由发送数据
临时开启
echo 1 >/proc/sys/net/ipv4/ip_forward
或
sysctl -w net.ipv4.ip forward=1
永久开启
vim /etc/ sysctl. conf
net. ipv4.ip_ forward = 1 #将此行写入配置文件
sysctl -P #读取修改后的配置
1.2 SNAT转换1:固定的公网IP地址
#配置SNAT策略,实现snat功能,将所有192.168.100.0这个网段的ip的源ip改为10.0.0.1
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j SNAT --to 10.0.0.1
可换成单独IP 出站外网网卡 外网IP
或
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j SNAT --to-source 10.0.0.1-10.0.0.10
内网IP 出站外网网卡 外网IP或地址池
1.3 SNAT转换2:非固定的公网IP地址(共享动态IP地址)
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
1.4 案例
192.168.1.250 --> 192.168.1.249 --> 192.168.1.43:80
1.4.1 192.168.1.250的网关指向192.168.1.249
route add -host 192.168.1.43 gw 192.168.1.249 #发往192.168.1.43的请求 网关是192.168.1.249 请求192.168.1.43的数据会发向192.168.1.249
#验证
[root@zabbix-proxy ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
192.168.1.43 192.168.1.249 255.255.255.255 UGH 0 0 0 eth0
1.4.2 192.168.1.249 开启内核转发 POSTROUTING链做SNAT 转换src_ip
#开启内核转发
[root@zabbix ~]# cat /proc/sys/net/ipv4/ip_forward
1
#添加SNAT规则
[root@zabbix ~]# iptables -t nat -I POSTROUTING -s 192.168.1.250/32 -d 192.168.1.43 -p tcp --dport 80 -j MASQUERADE
#来源地址是192.168.1.250 目的地地址是192.168.1.43:80的数据包 src_ip 更换为本机ip地址
1.4.3 192.168.1.250 发送请求
curl 192.168.1.43
1.4.4 192.168.1.43 进行验证
#tcpdump抓包进行验证
tcpdump -i p3p1 port 80 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on p3p1, link-type EN10MB (Ethernet), capture size 262144 bytes
15:48:05.285997 IP 192.168.1.249.38754 > 192.168.1.43.http: Flags [S], seq 939672207, win 29200, options [mss 1460,sackOK,TS val 1885570437 ecr 0,nop,wscale 7], length 0
15:48:05.286041 IP 192.168.1.43.http > 192.168.1.249.38754: Flags [S.], seq 2964534852, ack 939672208, win 28960, options [mss 1460,sackOK,TS val 48673200 ecr 1885570437,nop,wscale 7], length 0
#nginx日志进行验证
[root@rstx-43 ~]# tail -f /var/log/nginx/yum_access.log
192.168.1.249 - - [07/Oct/2022:15:48:05 +0800] "GET / HTTP/1.1" 200 4250 "-" "curl/7.29.0" "-" "192.168.1.43"
192.168.1.249 - - [07/Oct/2022:15:50:13 +0800] "GET / HTTP/1.1" 200 4250 "-" "curl/7.29.0" "-" "192.168.1.43"
二、DNAT原理与应用
2.1、DNAT 应用环境
在Internet中发布位于局域网内的服务器
DNAT原理
修改数据包的目的地址
DNAT转换前提条件
局域网的服务器能够访问Internet
Linux网关开启IP路由转发
2.2、DNAT转换
把从ens33进来的要访问web服务的数据包目的地址转换为 192.168.80.11
iptables -t nat -A PREROUTING -i ens37 -d 10.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.100.118
或者
iptables -t nat -A PREROUTING -i ens37 -d 10.0.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.118
iptables -t nat -A PREROUTING -i ens37 -p tcp --dport 80 -j DNAT --to 192.168.100.13-192.168.100.20
2.3 案例
192.168.1.250 --> 192.168.1.249:9999 --> 192.168.1.43:80
2.3.1 192.168.1.249开启内核转发 开启DNAT 目标地址网络转换 dest_ip dest_port 发生改变(网段不一致SNAT规则必须设置好)
#设置SNAT 把所有192.168.1.250发过来的数据包改变 src_ip src_port 在POSTROUTING链
iptables -t nat -I POSTROUTING -s 192.168.1.250 -j MASQUERADE
#设置DNAT 改变192.168.1.250发往192.168.1.249:9999 dest_ip dest_port
iptables -t nat -I PREROUTING -d 192.168.1.249 -p tcp --dport 9999 -j DNAT --to 192.168.1.43:80
#DNAT阶段 把原数据包的dest_ip(192.168.1.249):dest_port(9999) 改变为dest_ip(192.168.1.43):dest_port(80)
#SNAT阶段 把原数据包的src_ip(192.168.1.250):src_port(xxxx) 改变为src_ip(192.168.1.249):src_port(xxxx) 发往192.168.1.43:80