NAT
启用网卡转发:
将/proc/sys/net/ipv4_forward的值设置为1,永久生效编辑/etc/sysctl.conf。
注意:linux的IP地址是属于主机而不是网卡的,所以各网卡对应的ip地址可以内部互相通信。
假设有IP1 IP2 对应网关为GW1 GW2,GW1和GW2在一台Linux上。
若IP1和IP2都为内网,只要设定好对应网关,就可以互相通讯,不需要nat。
nat会话表:记录相关数据包源地址、目标地址、协议端口号等信息。
NAT通过nat会话表和ip_conntrack完成对应的地址转换。
SNAT
源地址转换,目标地址不变。适用于内网多计算机通过外网地址访问外网资源。报文要在出网关时完成地址转换(POSTROUTING)。
IP1(内网)访问IP2(外网)
发送:数据包(IP1,IP2) --> GW1(数据包(IP1,IP2)) -->GW2(数据包(IP1,IP2) )-->SNAT(数据包(GW2,IP2) ) --> nat会话表(建立IP1 <--> GW2)--> GW2(数据包(GW2,IP2)) -->路由选择 --> IP2(数据包(GW2,IP2))
响应:数据包(IP2,GW2) --> 路由选择 --> GW2(数据包(IP2,GW2)) -->nat会话表 (内部自动目标地址转换)--> GW2(数据包(IP2,IP1)) --> GW1(数据包(IP2,IP1)) --> IP1(数据包(IP2,IP1))
DNAT
目标地址转换,源地址不变。适用于外网用户通过网关的外网地址访问内网多个服务器。报文要在刚进入网关时完成地址转换(PREROUTING)。
IP2(外网)访问IP1(内网)
发送:数据包(IP2,GW2) --> 路由选择 --> GW2(数据包(IP2,GW2)) -->DNAT(数据包(IP2,IP1) --> nat会话表(建立GW2 <--> IP1 ) --> GW2(数据包(IP2,IP1)) --> GW1(数据包(IP2,IP1) --> IP1(数据包(IP2,IP1))
响应:数据包(IP1,IP2) --> GW1(数据包(IP1,IP2)) -->GW2(数据包(IP1,IP2)) --> nat会话表(内部自动源地址转换) --> GW2(数据包(GW2,IP2)) --> 路由选择 --> IP2(数据包(GW2,IP2))