目录
linux 系统本身是没有转发功能,只有路由发送数据
NAT
—— PREROUTING
路由判断前
—— INPUT
进入本机的流量
—— OUTPUT
出本机的流量
—— POSTROUTING
路由判断后
NAT的实现分为两类
—— SNAT:source NAT ,支持 POSTROUTING , INPUT,让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装,请求报文:修改 源IP ;让内网可以访问外网
—— DNAT:destination NAT ,支持 PREROUTING , OUTPUT,把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP,请求报文:修改 目标IP ;让外网可以访问到内网的机器
SNAT
SNAT 应用环境
局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由
SNAT 原理
源地址转换
修改数据包的源地址
SNAT 转换前提条件
局域网各主机已正确设置IP地址、子网掩码、默认网关地址
Linux网关开启IP路由转发
例图参考
开启 SNAT 命令
临时开启
echo 1 > /proc/sys/net/ipv4/ip_forward 或 sysctl -W net.ipv4.ip_forward=1
永久开启
[root@localhost network-scripts]# sysctl -a|grep "ip_forward" sysctl: reading key "net.ipv6.conf.all.stable_secret" sysctl: reading key "net.ipv6.conf.default.stable_secret" sysctl: reading key "net.ipv6.conf.ens32.stable_secret" sysctl: reading key "net.ipv6.conf.ens33.stable_secret" sysctl: reading key "net.ipv6.conf.lo.stable_secret" sysctl: reading key "net.ipv6.conf.virbr0.stable_secret" sysctl: reading key "net.ipv6.conf.virbr0-nic.stable_secret" net.ipv4.ip_forward = 0 net.ipv4.ip_forward_use_pmtu = 0 vim /etc/ sysctl. conf #打开配置文件 net. ipv4.ip_ forward = 1 #将此行写入配置文件任意空行之中 sysctl -P #读取修改后的配置
修改 iptables 网卡
SNAT 转换1:固定的公网ip地址 iptables -t nat -A POSTROUTING -s 12.0.0.0/24 -o ens33 -j SNAT --to 192.168.91.101 #交给网关 iptables -t nat -A POSTROUTING -s 12.0.0.0/24 -o ens37 -j SNAT --to 192.168.91.101~192.168.91.103 #内网地址 出站网卡 外网ip或地址池 SNAT 转换2:非固定的公网ip地址 iptables -t nat -A POSTROUTING -s 12.0.0.0/24 -d 192.168.100.0/24 -j MASQUERADE iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens37 -j MASQUERADE
DNAT
DNAT 应用环境
在Internet中发布位于局域网内的服务器
DNAT 原理
修改数据包的目的地址
DNAT 转换前提条件
-
局域网的服务器能够访问Internet
-
网关的外网地址有正确的DNS解析记录
-
Linux网关开启IP路由转发
vim /etc/ sysctl. conf #打开配置文件 net. ipv4.ip_ forward = 1 #将此行写入配置文件任意空行之中 sysctl -P #读取修改后的配置
例图参考
DNAT 转换1: 发布内网的 Web服务
#把从ens33进来的要访问web服务的数据包目的地址转换为 192.168.100.102 iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp--dport 80 -j DNAT --to 192.168.100.102 #或 iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp--dport 80-j DNAT --to-destination 192.168.100.102 #入站|外网网卡 | 外网ip 内网服务器ip
DNAT 转换2: 发布时修改目标端口
#发布局域网内部的OpenSSH服务器, 外网主机需使用250端口进行连接 iptables-t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp--dport 250-jDNAT --to 192.168.100.102:22
在内网上配置
#在内网上安装 httpd并开启服务 [root@localhost yum.repos.d]# yum install -y httpd [root@localhost yum.repos.d]# systemctl start httpd #关闭防火墙和安全终端 [root@localhost yum.repos.d]# systemctl stop firewalld.service [root@localhost yum.repos.d]# setenforce 0
在网关服务器添加 iptables 规则
#先清空规则 [root@localhost yum.repos.d]#iptables -F -t nat #添加规则 [root@localhost yum.repos.d]#iptables -t nat -A PREROUTING -i ens38 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.100.102 #查看规则 [root@localhost yum.repos.d]#iptables -nL -t nat Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT tcp -- 0.0.0.0/0 12.0.0.1 tcp dpt:80 to:192.168.100.102 Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination
测试外网是否能访问内网
#在外网服务器上 [root@localhost ~]# curl 12.0.0.1 #在内网服务器上 [root@localhost yum.repos.d]# tail /etc/httpd/logs/access_log 127.0.0.1 - - [02/Nov/2021:18:05:31 +0800] "GET / HTTP/1.1" 403 4897 "-" "curl/7.29.0"