nat命令

PC主机IP: 192.168.1.100
开发板IP: 192.168.1.200
开发板上容器的IP: 192.168.100.3

#删除规则表 dnat1
nft delete table dnat1 

#增加规则表 dnat1
nft add table dnat1 

#在表dnat1中增加一条链 prerouting [SNAT]
nft add chain dnat1 prerouting { type nat hook prerouting priority 0 \;}

#在表dnat1中增加一条链 postrouting [DNAT]
nft add chain dnat1 postrouting { type nat hook postrouting priority 100 \; }

#开发板上将目的192.168.1.200:1022(PC)转为192.168.100.3:22(容器),这样PC外部就能够访问容器内部的数据了
nft add rule dnat1 prerouting ip daddr 192.168.1.200 tcp dport 1022 iif FE0 dnat 192.168.100.3:22

#在开发板上将源地址,即容器地址192.168.100.3映射到FE0的物理网口上,这样容器就可以访问外部的数据了
nft add rule dnat1 postrouting ip saddr 192.168.100.3 oif FE0 masquerade

//输出容器信息
nft list table dnat1 -a

 

NAT (网络地址转换) 技术在平时是很多见的,如家庭中在使用路由器共享上网时,一般用的就是 NAT 技术,它可以实现众多内网 IP 共享一个公网 IP 上网。NAT 的原理 简单的说就是当内网主机访问外网时,当内网主机的数据包要通过路由器时,路由器将数据包中的源内网 IP 地址改为路由器上的公网 IP 地址,同时记录下该数据包的消息;当外网服务器响应这次由内而外发出的请求或数据交换时,当外网服务器发出的数据包经过路由器时,原本是路由器上的公网 IP 地址被路由器改为内网 IP 。工作原理如下图所示:



SNAT 和 DNAT 是 iptables 中使用 NAT 规则相关的的两个重要概念。如上图所示,如果内网主机访问外网而经过路由时,源 IP 会发生改变,这种变更行为就是 SNAT;反之,当外网的数据经过路由发往内网主机时,数据包中的目的 IP (路由器上的公网 IP) 将修改为内网 IP,这种变更行为就是 DNAT 。

与 SNAT 和 DNAT所对应的两个链分别是  POSTROUTING和PREROUTING  
 

 

 

说明:(个人理解)prerouting  和postrouting指的是数据包的流向,如上图所示postrouting一般指的是发往公网的数据包;prerouting一般指来自公网的数据包!

 

 

通常内网到外网是pre,外网到内网是post,但是外还是内只是个相对概念,在一定条件下是可以转换的。落实到网卡上,对于每个网卡数据流入的时候必然经过pre,数量流出必然经过post

 

POSTROUTING是源地址转换,要把你的内网地址转换成公网地址才能让你上网。

PREROUTING是目的地址转换,要把别人的公网IP换成你们内部的IP,才让访问到你们内部受防火墙保护的机器


PREROUTING
当外网的数据包进入到内网时,我们需要修改数据包中的公网 IP 为内网的主机 IP,这种 DNAT 的行为规则就要在 PREROUTING 链里添加。

POSTROUTING
和 PREROUTING 不同,在执行 SNAT 任务时的行为规则就添加在 POSTROUTING 链中。

 

转自:https://blog.csdn.net/xzknet/article/details/51957269

你可能感兴趣的:(linux,tcp/ip)