防火墙之地址转换SNATDNAT

防火墙之地址转换SNATDNAT

2023年7月23日发(作者:)

防⽕墙之地址转换SNATDNAT

防⽕墙之地址转换SNAT DNAT

⼀、SNAT源地址转换。1、原理:在路由器后(PSOTROUTING)将内⽹的ip地址修改为外⽹⽹卡的ip地址。2、应⽤场景:共享内部主机上⽹。3、设置SNAT:⽹关主机进⾏设置。 (1)设置ip地址等基本信息。 (2)开启路由功能: sed -i '/ip-forward/s/0/1/g' sysctl -p

(3)编写规则: iptables -t nat -I POSTROUTING -o 外⽹⽹卡 -s 内⽹⽹段 -j SNAT --to-source 外⽹ip地址 #适⽤于外⽹ip地址固定场景 iptables -t nat -I POSTROUTING -o 外⽹⽹卡 -s 内⽹⽹段 -j MASQUERADE #适⽤于共享动态ip地址上⽹(如adsl拨号,dhcp获取外⽹ip)(4)做好安全控制:使⽤FORWARD时机进⾏控制,严格设置INPUT规则。

⼆、DNAT⽬的地址转换:1、原理:在路由前(PREROUTING)将来⾃外⽹访问⽹关公⽹ip及对应端⼝的⽬的ip及端⼝修改为内部服务器的ip及端⼝,实现发布内部服务器。2、应⽤场景:发布内部主机服务。3、设置DNAT:⽹关主机上设置。(1)设置ip、开启路由、设置SNAT(2)编写防⽕墙规则:iptables -t nat -I PREROUTING -i 外⽹⽹卡 -d 外⽹ip tcp --dport 发布的端⼝ -j DNAT --to-destination 内⽹服务ip:端⼝

NAT network address translation

仅从报⽂请求来看,可以分为:

SNAT 源地址转换 DNAT ⽬标地址转换 PNAT 端⼝转换

NAT server:能根据需要实现SNAT DNAT PNAT 并⾮是⽤户空间的进程完成转换功能,靠的是内核中的地址转换规则

私有IP客户端访问互联⽹的⽅法

SNAT 、PROXY

SNAT:主要⽤于实现内⽹客户端访问外部主机时使⽤(局域⽹上⽹⽤)

定义在POSTROUTING链上

iptables -t nat -A postrouting -s 内部⽹络地址或主机地址 -j SNAT --to-source NAT服务器上的某外部地址

另外⼀个target

MASQUERADE地址伪装(适⽤于PPPOE拨号上⽹,假设eth1是出⼝)

iptables -t nat -A postrouting -s 内部⽹络或主机地址 -o eth1 -j MASQUERADE

DNAT:主要⽤于内部服务器被外⽹访问(发布服务)

定义在PREROUTING

iptables -t nat -A PREROUTING -d NAT服务器的某外部地址 -p 某协议 --dport 某端⼝ -j DNAT --to-destination 内⽹服务器地址[:port]

注意:NAT服务器需要打开数据转发

echo 1 > /proc/sys/net/ipv4/ip_forward

或者修改/etc/ _forward = 1

实验操作SNAT、DNAT

实验⼀:SNAT

规划主机A 作为SNAT server

eth0 ip地址172.20.1.10(外部地址),eth1 192.168.1.1(内部地址)

主机B当做局域⽹内主机

eth0 ip地址192.168.1.2 默认路由要指向192.168.1.1

SNAT server:[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.20.1.10

#上⾯和我们实例操作相同

[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

主机B ping外部的其它主机(172.20.1.20模拟互联⽹上的主机)

DNAT

[root@nat ~]# iptables -t filter -F

[root@nat ~]# iptables -t nat -F[root@nat ~]# iptables -t nat -A PREROUTING -d 10.1.249.125 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.4Chain PREROUTING (policy ACCEPT)target prot opt source destination

DNAT tcp -- 0.0.0.0/0 10.1.249.125 tcp dpt:80 to:192.168.2.4

[root@nat ~]# netstat -tln | grep "<80>" 此时本机上并没有开放80端⼝

hello --> 此时我们访问为 nat 主机上的80端⼝ 由上⾯可知,此服务器上并没有开放80,⽽是将请求送往 后端服务器

实体案例 我们有⼀台机器A可以上外⽹,配置eth0=192.168.1.1,eth1=222.13.56.192

有6台机器只有内⽹IP ,分别是192.168.1.102~192.168.1.108,想让这6台机器通过机器A上⽹

在机器A 防⽕墙上配置如下即可

/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.101 -j SNAT --to-source 222.13.56.192/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.102 -j SNAT --to-source 222.13.56.192/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.103 -j SNAT --to-source 222.13.56.192/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.104 -j SNAT --to-source 222.13.56.192/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.105 -j SNAT --to-source 222.13.56.192/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.108 -j SNAT --to-source 222.13.56.192

在 6台机器上路由显⽰

route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 em1169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 em10.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 em1

iptables中DNAT转发的配置⽅法1.⼀对⼀流量完全DNAT⾸先说⼀下⽹络环境,普通主机⼀台做防⽕墙⽤,⽹卡两块eth0 192.168.0.1 内⽹eth1 202.202.202.1 外⽹内⽹中⼀台主机 192.168.0.101现在要把外⽹访问202.202.202.1的所有流量映射到192.168.0.101上命令如下:#将防⽕墙改为转发模式

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -F

iptables -t nat -F

iptables -t mangle -F

iptables -X iptables -t nat -X

iptables -t mangle -X

iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

iptables -P INPUT ACCEPT

iptables -P OUTPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -t nat -A PREROUTING -d 202.202.202.1 -j DNAT --to-destination 192.168.0.101

iptables -t nat -A POSTROUTING -d 192.168.0.101 -j SNAT --to 192.168.0.1

2.多对多流量完全DNAT说是多对多,实际上这⾥的配置是指定了多个⼀对⼀环境:eth0 192.168.0.1 内⽹eth1 202.202.202.1 、202.202.202.2 外⽹内⽹中2台主机 192.168.0.101、192.168.0.102现在要把外⽹访问202.202.202.1的所有流量映射到192.168.0.101上,同时把把外⽹访问202.202.202.2的所有流量映射到192.168.0.102上这⾥顺便提⼀下如何为⽹卡配置多个IPifconfig eth1:1 202.202.202.2 netmask 255.255.255.0 up

#将防⽕墙改为转发模式

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -F

iptables -t nat -F

iptables -t mangle -F

iptables -X

iptables -t nat -X

iptables -t mangle -X

iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

iptables -P INPUT ACCEPT

iptables -P OUTPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -t nat -A PREROUTING -d 202.202.202.1 -j DNAT --to-destination 192.168.0.101

iptables -t nat -A POSTROUTING -d 192.168.0.101 -j SNAT --to 192.168.0.1

iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102

iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1

3.⼀对多根据协议DNAT 这个最常⽤,⼀般是内⽹或DMZ区内有多个应⽤服务器,可以将不同的应⽤流量映射到不同的服务器上环境:eth0 192.168.0.1 内⽹eth1 202.202.202.1 外⽹内⽹中2台主机 192.168.0.101(Web服务器)、192.168.0.102(邮件服务器)现在要把外⽹访问202.202.202.1的Web流量映射到192.168.0.101上,同时把把外⽹访问202.202.202.1的邮件访问流量映射到192.168.0.102上命令如下:#将防⽕墙改为转发模式

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -F

iptables -t nat -F

iptables -t mangle -F

iptables -X

iptables -t nat -X

iptables -t mangle -X

iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

iptables -P INPUT ACCEPT

iptables -P OUTPUT ACCEPT

iptables -P FORWARD ACCEPT

#Web访问设置iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.101:80

iptables -t nat -A POSTROUTING -d 192.168.0.101 -p tcp --dport 80 -j SNAT --to 192.168.0.1

#邮件访问设置iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.102:25

iptables -t nat -A POSTROUTING -d 192.168.0.102 -p tcp --dport 25 -j SNAT --to 192.168.0.1

iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 110 -j DNAT --to-destination 192.168.0.102:110

iptables -t nat -A POSTROUTING -d 192.168.0.102 -p tcp --dport 110 -j SNAT --to 192.168.0.1

SNAT:源地址转换,代理内部客户端访问外部⽹络 ⽬标地址不变,重新改写源地址,并在本机建⽴NAT表项,当数据返回时,根据NAT表将⽬的地址数据改写为数据发送出去时候的源地址,并发送给主机,⽬前基本都是解决内⽹⽤户⽤同⼀个公⽹IP地址上⽹的情况。

DNAT:⽬标地址转换,将内部服务器发布⾄外部⽹络 和SNAT相反,源地址不变,重新修改⽬标地址,在本机建⽴NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的⽬标地址,并发给远程主机在DNAT的基础上,可以根据请求数据包的端⼝做PNAT(端⼝转换,也称为端⼝映射),可以根据请求数据包不同的端⼝改写不同的⽬标地址,从⽽发送给不同的主机这在⽤⼀个公⽹地址做不同服务时⽤的⽐较多,⽽且相对来说,⽤NAT的⽅式可以隐藏后端服务器的真实地址,⽐较安全。

SNAT的数据流向过程 ⾸先进⼊PREROUTING,发现不是本⽹段的地址,⽽后开始查找路由表(查找路由的过程在PREROUTING和FORWARD之间),于是经过FORWARD链进⾏转发,在通过POSTROUTING时进⾏NAT转换。在这个流程中,NAT转换的步骤在POSTROUTING链上实现,之所以不再PREROUTING上做NAT是因为数据包在进来之前,还不知道是本⽹段地址还是外⽹地址。

DNAT的数据流向过程 在DNAT中,NAT要在PREROUTING链上做。在数据进⼊主机后,路由选择过程是在PREROUTING和FORWARD之间的,所以应该先做地址转换之后再进⾏路由选择,⽽后经过FORWARD链,最后从POSTROUTING链出去。

PC1地址:172.16.251.185 ⽹关指向:172.16.251.186

route add default gw 172.16.251.186

routeNAT服务器地址:172.16.251.185

PC2地址:

⼆、SNAT的实现:

1、在我们做NAT之前,⾸先要把NAT服务器的路由功能打开,不然数据包过不了FORWARD链

sysctl -w _forward=1

######也可以使⽤⽂件永久⽣效,下⾯值改为1即可

vim /etc/

_forward = 1

######执⾏如下命令让其⽣效

sysctl -p

2、在NAT服务器添加iptables规则如:

iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.254.61

#在POSTROUTING链上⾯,将来⾃源地址为172.16.0.0/16⽹段的数据包的源地址都转换为192.168.254.61 查看iptables规则:

iptables -t nat -L -n -v3、下⾯我们在PC1上做测试,PC1现在就可以Ping通PC2主机了,如下图:

4、PC1 ping PC2,在PC1主机上抓包来测试:

tcpdump -i eth0 -v | grep 192

三、DNAT的实现:

1、在NAT服务器添加iptables规则如:

iptables -t nat -A PREROUTING -d 192.168.254.61 -j DNAT --to-destination 172.16.251.185#在PREROUTING链上⾯,将请求地址NAT服务器 eth1 192.168.1.254的数据包全部转发到PC1 172.16.251.185主机上 查看iptables规则:

iptables -t nat -L -n -v测试:PC1上⾯做了WEB服务,我们在PC2上看是否能请求到WEB页⾯: 请求防⽕墙eth1地址,192.168.254.612、在NAT服务器添加iptables规则如:

iptables -t nat -A PREROUTING -d 192.168.254.61 -p tcp --dport 80 -j DNAT --to-destination 172.16.251.185:8080

#此条规则是将所有请求NAT服务器eth1 192.168.254.61地址的80号端⼝都转发到172.16.251.185主机上8080端⼝,当然前提必须在PC1上⾯监听8080端⼝

查看iptables规则:

基于动态IP地址来做NAT代理内部客户端来上⽹

如果IP地址是动态获取的ADSL宽带来做NAT代理上⽹实现⽅式

iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o eth1 -j MASQUEREADE 注释:这⾥最好使⽤"-o"选项来指定出⼝,MASQUEREADE会⾃动调⽤该接⼝的地址作为源地址出去。

2. 先说收DNATDNAT⽬标地址转换在PREROUTING链上做;可以将虚拟机的服务映射到宿主机的ip上,达到访问宿主的 ip就等于访问虚拟机的效果;

iptables -t nat -A PREROUTING -d 192.168.1.51 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.122.2:80 -d 物理机的ip --dport 端⼝ DNAT 被映射的内⽹主机ip:端⼝

应⽤场景:

这样主要是为了 能让内⽹的主机能够对外提供服务:数据包的第⼀站 PREROUTING ,匹配到规则就执⾏规则进⾏DNAT转发,经过FORWARD ,到达POSTROUTING出站。没有匹配到就进⼊INPUT,进⾏匹配

3.再说SNAT

SNAT源地址转换在POSTROUTING链上做; 可以为局域⽹提供上⽹服务

iptables -t nat -A PORTROUTING -o br0 -j MASQUERADE

应⽤场景:

主机上的NAT 虚拟机需要访问物理⽹路,虚拟机直接通过先 经过FORWARD,然后通过POSTROUTING 将源地址转换

4. 再说说不需要经过转换的数据包,如图⽰绿⾊的部分,直接到达INPUT-->OUTPUT-->POSTROUTING出来了,⽐如说我要ssh远程这个主机,⾛的就是这个流向;

A. 如果想让相对的局域⽹内服务器对外提供web服务,需要做DNAT规则: iptables -t nat -A PREROUTING -d 公⽹IP -p tcp –m tcp --dport 公⽹端⼝ -j DNAT --to-destination 内⽹IP:80

我将外⽹IP 的80,8080 端⼝都映射到了内⽹IP的80端⼝:

经过PREROUTING 链后还需要经过FORWARD 链,需要在FORWARD这开放提供web服务的80 端⼝:

iptables -A FORWARD -p tcp -m tcp --dport 80 -j ACCEPT

理论上还需要开放⼀下--sport 80 , 但是如果已经有下⾯这个规则了,就不需要了:

这个规则是允许已有连接直接通过;但有⼤量数据包经过时,可以提⾼速度!

iptables - I FORWARD –p tcp -m state -- state RELADE,RSTABLISHED - jACCEPT

看看实际的效果:

B. 当然FORWARD链处,可以对转发进⾏数据包的过滤,⽐如我想通过公⽹服务器的ip,远程ssh连接局域⽹内的服务器,就可以使⽤DNAT进⾏转换内⽹主机的22端⼝,但是为了安全,我想限制可以远程的IP地址:我只想让我⼀个⼈可以 远程,我的ip是192.168.1.154,内⽹⽹段是192.168.122.0/24

DNAT:

iptables -t nat -A PREROUTING -d 192.168.1.51 -p tcp -m tcp --dport 8081 --to-destination 192.168.122.2:22

FORWARD:

iptables -A FORWARD -s 192.168.1.154 -d 192.168.122.0/24 -p tcp -m tcp --dport 22 -j ACCEPT

我的ip地址

在192.168.1.154上 ssh远程⼀下看看 再到其他的主机上ssh试试看,这个主机ip是192.168.1.20

看的出来FORWARD 上的那个规则⽣效了。

C. 当内⽹的主机或本地的虚拟机需要通过本机上⽹时,需要做SNAT规则:我的环境是虚拟机要通过宿主机上⽹,虚拟机以宿主机为⽹关,虚拟机的⽹段是192.168.122.0/24,宿主机的⽹段是192.168.1.0/24,相对来说宿主机⽹段就是外⽹,虚拟机就是内⽹。

-j MASQUERADE 是当外⽹ip不固定时,这个配置 I 可以⾃动获取外⽹ip。

iptables -t nat -A POSTROUTING -o br0 -s 内⽹段/24 -j MASQUERADE

-s配置不是必须的,在真实局域⽹环境中,也许会有多个局域⽹段,这时就可以通过-s 配置,指定那个⽹段可以上⽹

发布者:admin,转转请注明出处:http://www.yc00.com/web/1690105254a306233.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信