iptables配置SNAT和DNAT


iptables 配置 SNAT 和 DNAT

一、前言

NAT 的全称是「网络地址转换」(Network Address Translation),指的是路由器等网络设备,在传输数据的过程中,改变数据中的 IP 地址的一种技术。NAT 可以分为 SNAT(Source Network Address Translation,源地址转换)和 DNAT(Destination Network Address Translation,目的地址转换),SNAT 主要是用来做默认网关的,而 DNAT 主要是用来做端口映射的。
本文将介绍如何使用 Linux 的 iptables 来实现 SNAT 和 DNAT。

二、原理

SNAT

SNAT 全称是「源地址转换」(Source Network Address Translation),顾名思义,它是一种通常在从私有 IP 地址连接到公共 IP 地址时转换源 IP 地址的技术。当内部主机需要向外部主机或公共主机发起请求时,它是最常见的 NAT 形式。
image.png

DNAT

DNAT 全称是「目标地址转换」(Destination Network Address Translation),顾名思义,是一种一般在从公网 IP 地址连接到私有 IP 地址时,对目的 IP 地址进行转换的技术。它通常用于将目的地为特定 IP 地址或 IP 地址上的特定端口的数据包重定向到一个主机上的不同地址,主要是在不同的主机上。
image.png

SNAT 和 DNAT 对比

范围 SNAT DNAT
名称 源地址转换 目的地址转换
简介 SNAT 将源主机的私有 IP 地址更改为公共 IP 地址。它还可能更改 TCP/UDP 标头中的源端口。SNAT 通常由内部用户访问 Internet。 目标 NAT 更改数据包 IP 标头中的目标地址。它还可能更改 TCP/UDP 标头中的目标端口。当我们需要将目的地为公共地址/端口的传入数据包重定向到网络内的私有 IP 地址/端口时,会使用 DNAT。
使用场景 局域网内或防火墙后面的客户端想要浏览互联网 在防火墙后面的数据中心内托管的网站,需要用户通过 Internet 访问
地址变更 SNAT 改变通过 NAT 设备的数据包的源地址 DNAT 改变通过路由器的数据包的目的地址
操作顺序 SNAT 在做出路由决定后执行。 DNAT 在做出路由决定之前执行。
通讯流程 当内部安全网络发起与外部世界的通信时,就会发生 SNAT 当外部不安全网络发起与内部安全网络的通信时,就会发生 DNAT

| 单/多主机

| SNAT 允许“内部”网络上的多个主机访问“外部”网络上的任何主机 | DNAT 允许“外部”网络上的任何主机访问“内部”网络上的单个主机 |

三、配置 SNAT

网络接口配置

内网主机(多台):

hostname 接口名称 IPADDR GATEWAY NETMASK
local01 ens33 192.168.1.3 192.168.1.2 255.255.255.0
local02 ens33 192.168.1.4 192.168.1.2 255.255.255.0

这里以两台内网主机为例,默认情况下均无法访问外网

内网主机 DNS 配置(/etc/resolv.conf):

nameserver 192.168.1.2

NAT 主机(1 台):

hostname 接口名称 IPADDR GATEWAY NETMASK
nathost ens33 192.168.2.35 192.168.2.2 255.255.255.0
nathost ens38 192.168.1.2
255.255.255.0

nathost 主机可以通过 ens33 接口访问外网

NAT 主机 DNS 配置(/etc/resolv.conf):

nameserver 192.168.2.2
nameserver 114.114.114.114

NAT 主机配置

开启内核数据包转发

要配置 NAT,必须开启 Linux 内核的转发功能:

echo 1 > /proc/sys/net/ipv4/ip_forward  # 临时生效,重启失效

要永久生效,需要:

vim /etc/sysctl.conf

修改其中的 net.ipv4.ip_forward = 1
然后执行:

sysctl -p

立刻生效。

关闭 firewalld

systemctl stop firewalld
systemctl disable firewalld

开启 iptables FORWARD 转发

iptables -P FORWARD ACCEPT

配置 SNAT

将 192.168.1.0/24 网段的数据包的源地址修改为 192.168.2.35,通过网络接口 ens33 送出:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens38 -j SNAT --to-source 192.168.2.35

另外一种方法:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens38 -j MASQUERADE

完成配置后 192.168.1.0/24 的内网主机即可访问外网!

四、配置 DNAT

网络接口配置

内网主机(1 台):

hostname 接口名称 IPADDR GATEWAY NETMASK
local ens33 192.168.1.3 192.168.1.2 255.255.255.0

默认情况下外网主机无法直接访问该主机

内网主机 DNS 配置(/etc/resolv.conf):

nameserver 192.168.1.2

NAT 主机(1 台):

hostname 接口名称 IPADDR GATEWAY NETMASK
nathost ens33 192.168.2.35 192.168.2.2 255.255.255.0
nathost ens38 192.168.1.2
255.255.255.0

外网可以通过 ens33 接口访问 nathost 主机

NAT 主机 DNS 配置(/etc/resolv.conf):

nameserver 192.168.2.2
nameserver 114.114.114.114

NAT 主机配置

开启内核数据包转发

要配置 NAT,必须开启 Linux 内核的转发功能:

echo 1 > /proc/sys/net/ipv4/ip_forward  # 临时生效,重启失效

要永久生效,需要:

vim /etc/sysctl.conf

修改其中的 net.ipv4.ip_forward = 1
然后执行:

sysctl -p

立刻生效。

关闭 firewalld

systemctl stop firewalld
systemctl disable firewalld

开启 iptables FORWARD 转发

iptables -P FORWARD ACCEPT

配置 DNAT

将对外网 192.168.2.35 网络接口 ens33 的访问,映射到对内网 192.168.1.3 上:

iptables -t nat -A PREROUTING -i ens33 -p tcp -d 192.168.2.35 --dport 80 -j DNAT --to-destination 192.168.1.3:80

必须还要做一个 SNAT,让目标服务器能够把数据传回来:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens38 -j SNAT --to-source 192.168.2.35

完成配置后访问 192.168.2.35:80 的流量就会转发到 192.168.1.3:80 上!


文章作者: Truda
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Truda !
评论
  目录