iptables之NAT
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iptables之NAT相关的知识,希望对你有一定的参考价值。
iptables之NAT
==============================================================================
概述:
NAT:
1)Firewall
★源地址转换(SNAT):POSTROUTING
主要用于实现让内网客户端访问外部主机地址时使用,要定义在POSTROUTING链或INPUT链
静态转换:外网地址是固定的;
动态转换:外网地址不固定
★目标地址转换(DNAT):PREROUTING
★PAT:Port Address Translati:端口映射(了解即可)
SNAT实验测试如下:
实验环境是基于上一篇网络防火墙的环境,这里不再过多赘述:
1.实验操作之前,内网主机的可以访问外网主机,也可以ping通,如下:
通过外网的日志查看和请求ping报文清除的知道源地址是内网主机,内网主机没有做任何的转换
2.接下来我们要把内网地址转换成网关主机的外网地址,已达到伪装,隐藏之源地址的目的。
1)定义规则源地址转换为网关主机的外网地址10.1.252.161,允许内网的所有主机访问外网的所有服务
[[email protected] ~]# iptables -vnL # 定义规则前查看 Chain INPUT (policy ACCEPT 16 packets, 1130 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 12 packets, 1008 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 6 packets, 1160 bytes) pkts bytes target prot opt in out source destination 定义规则,指明源内网地址,因为访问的是外网的所有服务所以地址和端口不用指定,指明源地址转化为网关 主机的外网地址 [[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.22.0/24 -j SNAT --to-source 10.1.252.161 [[email protected] ~]# iptables -t nat -vnL 指明nat表查看定义的规则 Chain PREROUTING (policy ACCEPT 59 packets, 6309 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 21 packets, 3188 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 1 packets, 156 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 1 packets, 156 bytes) pkts bytes target prot opt in out source destination 1 84 SNAT all -- * * 192.168.22.0/24 0.0.0.0/0 to:10.1.252.161
接下来,内网主机再次访问外网的web服务和ping操作,外网抓包和访问日志已经伪装成网关主机的外网地址,如下:
为了验证是在哪个环节发生的地址转换,我们在网关主机的内网网卡和外网网卡分别抓包,如下:
DNAT目标地址转换实验如下:
实验前环境准备:
1.因为DNAT为目标地址转换,即让内网中的服务器在外网中可以被访问到,所以,为了增加实验的说服力,我这里在内网的同一块网卡上再添加一个ip地址,让每一个ip地址对应一个服务,如下:
2.如上,地址已经添加成功,假设22地址对应的是web服务,23的地址对应的是ssh服务(这里可以想象成两个主机,但实际上是一个主机,为了演示效果);为了不影响实验效果这里我先把上例中定义的SNAT规则清空,如下:
[[email protected] ~]# iptables -t nat -F [[email protected] ~]# iptables -t nat -vnL Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
实验如下:
假设内网地址192.168.22.2上提供了web服务,我们希望外网用户把对网关主机外网网卡请求的web服务的80端口全都转化到内网的192.168.22.2上,设置如下:
分析:这里一定是在nat表的PREROUTING链上定义,指明目标IP为网关主机的外网地址10.1.252.161 ,指明协议为tcp协议(如果不指明的话所有的服务会统统转到一台内网主机之上),指明目标端口 为网关主机外网地址的80端口(实际上根本没有,因为网关主机跟本就没有提供服务),指明转换的 目标地址为提供服务的内网主机地址192.168.22.2,这里没指明端口,默认就是网关主机的端口80,也 可以不相同,也就是端口映射; [[email protected] ~]# iptables -t nat -A PREROUTING -d 10.1.252.161 -p tcp --dport 80 -j DNAT --to-destination 192.168.22.2 [[email protected] ~]# iptables -t nat -vnL Chain PREROUTING (policy ACCEPT 3 packets, 675 bytes) pkts bytes target prot opt in out source destination 0 0 DNAT tcp -- * * 0.0.0.0/0 10.1.252.161 tcp dpt:80 to:192.168.22.2 Chain INPUT (policy ACCEPT 3 packets, 675 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
查看网关主机确认是没有开通web服务的80端口
[[email protected] ~]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 25 *:514 *:* LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 127.0.0.1:6010 *:* LISTEN 0 25 :::514 :::* LISTEN 0 128 :::22 :::* LISTEN 0 128 ::1:631 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 128 ::1:6010 :::*
使用外网主机请求网关主机的web服务,如下:
如上,我们只是把web服务转发到了一个内网服务上,是有选择行的。如果我们现在用外网去ping网关主机的外网地址,是不通的,要想通定义如下:
[[email protected] ~]# iptables -t nat -F # 清空服务 把上例中指定的协议和端口去掉即可,即外网用户的所有任意服务访问,全都转到内网主机为192.168.22.2的主机 [[email protected] ~]# iptables -t nat -A PREROUTING -d 10.1.252.161 -j DNAT --to-destination 192.168.22.2 [[email protected] ~]# iptables -t nat -vnL Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 DNAT all -- * * 0.0.0.0/0 10.1.252.161 to:192.168.22.2 Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
外网主机去ping网关主机的10.1.252.161,在内网主机上抓包如下:
以上是关于iptables之NAT的主要内容,如果未能解决你的问题,请参考以下文章