SNAT与DNAT
SNAT是转换源地址,是在postrouting链上,相当于是你在一个局域网内,你的ip是192.168.200.10主机A,你需要访问公网主机B,ip是172.168.89.105,如果不改变你的源地址,走路由将主机A的数据发送给B,接收到A的请求返回数据给A,但是B无法看到私网的IP,所以B只能找上一级路由,为了实现数据包的正确发送及返回,网关必须将A的址转换为一个合法的公网地址,同时为了以后B主机能将数据包发送给A,这个合法的公网地址必须是网关的外网地址,如果是其它公网地址的话,B会把数据包发送到其它网关,而不是A主机所在的网关,A将收不到B发过来的数据包,所以内网主机要上公网就必须要有合法的公网地址,而得到这个地址的方法就是让网关进行SNAT(源地址转换),将内网地址转换成公网址(一般是网关的外部地址),所以大家经常会看到为了让内网用户上公网,我们必须在routeros的firewall中设置snat,俗称IP地址欺骗或伪装(masquerade)
内部地址要访问公网上的服务时(如web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。
DNAT是转换目的地址:当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。
在执行 SNAT 任务时的行为规则就添加在 POSTROUTING 链中
在执行DNAT任务时的行为规则是在PREROUTING链中
POSTROUTING链
我们最后的任务应该是构造网络地址转换,对吧?至少对我来说是的。我们在nat表的POSTROUTING里只加入了一条规则,它会对所有从Internet接口(对我来说,这是eth0)发出的包进行NAT操作。在所有的例子脚本里,都有一些变量,它们要给以正确的配置。选项-t指定要在哪个表里插入规则,这里是nat表。命令-A说明我们要把规则添加到POSTROUTING链末尾。-o$INET_IFACE指定要匹配所有从接口INET_IFACE出去的包,这里我们使用的是eth0。最后,我们把target设置为SNAT。这样,所有匹配此规则的包都会由SNAT target处理之后,它们的源地址就是Internet接口的地址了。不要忘了SNAT可是一定要有IP地址的,用–to-source来设置哦。
PREROUTING链
顾名思义,PREROUTING链(nat表的)是在路由之前做网络地址转换工作的。然后,包再经过路由,就会被送到filter表的INPUT或FORWARD链。我们在这里讨论这个链的唯一原因是,我们觉得有责任再次指出你不应该在此链中做任何过滤。PREROUTING链只会匹配流的第一个包,也就是说,这个流的所有其他包都不会被此链检查。事实上,在这个脚本中,我们根本没有用到PREROUTING链。如果你想对一些包做DNAT操作,例如,你把web service放在了局域网内,这里就是你放置规则的地方,有关PREROUTING链的详细信息在章节表和链中。
iptables -L命令还可以查看nat表和mangle表的内容哦
iptables -L -t nat
cat /proc/net/ip_conntrack | less
iptables -F -t nat (清除NAT表)
iptables --list 查看过滤表
新的规则存盘
./iptables save
在/proc/net/ip_conntrack文件里也有包的流向