iptables-nat

iptables-nat ★★★★★

  • 初识nat,工作中常用nat技术

NAT简介:

◆ NAT: network address translation 网络地址转换

  • 内网地址想与公网地址进行通信时,可使用NAT方法。NAT方法需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。

NAT的工作原理

◆ 公共IP地址

公共ip地址范围
A1.0.0.0 到 9.255.255.255
A11.0.0.0 到 126.255.255.255
B128.0.0.0 到 172.15.255.255
B172.32.0.0 到 191.255.255.255
C192.0.0.0 到 192.167.255.255
C192.169.0.0 到 223.255.255.255
  • 公网地址需要花钱申请,任何公网地址可以互通,目前ipv4地址已经不够使用。

◆ 私有IP地址

私有ip地址范围
A10.0.0.0 到 10.255.255.255
B172.16.0.0 到 172.31.255.255
C192.168.0.0 到 192.168.255.255
  • :公共ip地址不能直接到达私有ip地址,但是如果私有ip地址想访问互联网,怎么办?

局域网主机访问互联网主机

◆ 局域网主机访问公网主机,源IP地址的转换==>SNAT

  • 以目前本机访问某度为例:
    虚拟机ip:192.168.38.17 ==>
[root@centos7-17 ~]# curl http://ipinfo.io/ip  查看当前主机访问互联网的ip
61.149.195.206
src ipdst ip
hostA:192.168.38.1761.135.169.121(某度ip)
经过NAT路由器时
61.149.195.20661.135.169.121
源地址转换
--
响应时
61.135.169.12161.149.195.206
经过NAT路由器时
61.135.169.121hostA:192.168.38.17
NAT路由器再将地址转换回去

◆ 局域网主机访问公网主机,通信图示:

  • 总结:上述通信过程:
    ①在请求报文中,若源ip被修改 ==> 此时称为SNAT
    ②请求报文中,若目标ip被修改 ==> 此时称为DNAT
    ③PNAT: port nat,端口和IP都进行修改,ip加端口,现在PNAT和SNAT、DNAT都合并在一起了,目前并不做明显区分
现在NAT路由器涉及端口转换时,一般都会涉及端口,因为仅是ip地址转换的话,一个局域网中主机众多,不能区分。

◆ 如果局域网配置公网地址会怎样?

  • 建议不要这样使用,如果局域网不访问互联网,那没啥问题,但是局域网要访问互联网还是配置私有地址。

互联网主机访问局域网主机

◆ DNAT ==> (相当于lvs调度之类的)但是iptables不支持多路映射,因此iptables的DNAT只能是将dst ip转换为一个dst ip

◆ 地址转换表

src ipdst ip
6.6.6.6:XXXX61.149.195.206:25(25邮件服务器端口)
经过NAT路由器时
6.6.6.6:XXXX192.168.38.27:25(局域网提供邮件服务的主机)
目标地址转换
--
响应时
192.168.38.27:256.6.6.6:XXXX
经过NAT路由器时
61.149.195.206:256.6.6.6:XXXX
NAT路由器再将地址转换回去请求报文中目标地址转换

◆ 互联网主机访问局域网主机,通信图示:

◆ DNAT ==> 映射至局域网的多个主机,则相当于实现的调度器的功能,反向代理,但是linux的iptables只能实现一对一的映射,调度实现详情见lvs。

NAT

◆ NAT: network address translation

  • PREROUTING,INPUT,OUTPUT,POSTROUTING
  • 请求报文:修改源/目标IP,由定义如何修改
  • 响应报文:修改源/目标IP,根据跟踪机制自动实现

◆ SNAT:source NAT POSTROUTING, INPUT

  • 让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装
  • 请求报文:修改源IP

◆ DNAT:destination NAT PREROUTING , OUTPUT

  • 把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP
  • 请求报文:修改目标IP

◆ PNAT: port nat,端口和IP都进行修改

NAT的功能

◆ NAT不仅能解决IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。

  • ②宽带分享
  • ③安全防护

实验

SNAT

◆ nat表的target: SNAT:固定IP

  • –to-source [ipaddr[-ipaddr]][:port[-port]]
  • –random

◆ iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP

  • -s LocalNET:源地址是本地局域网的ip地址
  • -d LocalNet:目标地址为本地的局域网地址(!取反)
  • -j SNAT: -j target
  • –to-source ExtIP:指明替换为哪个外网地址
实现示例:
~]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j SNAT - -to-source 172.18.1.6-172.18.1.9

SNAT实验

◆ 拓扑图:

◆ 各主机配置:

  • hostA:

    • eth0
      • 桥接:模拟外网
      • ip:172.18.3.4/16(此处没有静态配置,DHCP自动获取的)
  • hostB:

    • NAT路由器
    • eth0
      • 桥接:模拟外网地址
      • ip:172.18.2.2/16(DHCP自动获取)
    • eth1
      • NAT模式:内网
      • ip:192.168.38.17
路由转发:临时生效
[root@centos7-17 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

永久生效:
[root@centos7-17 ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf 
[root@centos7-17 ~]# sysctl -p
net.ipv4.ip_forward = 1
  • hostC:
    • eth0
      • NAT:内网
      • ip:192.168.38.27
      • 默认路由指向:192.168.38.17

◆ 定义SNAT规则

  • 在NAT路由器上使用iptables在nat表的POSTROUTING链定义如下规则:
[root@centos7-17 ~]# iptables -t nat -A POSTROUTING -s 192.168.38.0/24 ! -d 192.168.38.0/24 -j SNAT --to-source 172.18.2.2

◆ 测试和结果分析:

hostC 主机发起请求:内网访问外网
[root@centos7-27 ~]# curl 172.18.3.4
web server:172.18.3.4


hostA主机:访问日志:
[root@web-server ~]# tail -f /var/log/httpd/access_log 
172.18.2.2 - - [23/Oct/2019:19:21:28 +0800] "GET / HTTP/1.1" 200 22 "-" "curl/7.29.0"
    ==>是NAT路由器访问的web server

上述实现总结

  • SNAT:当局域网主机访问互联网主机时,在NAT路由器将实现SNAT,即访问互联网的数据报文将源ip地址转换为局域网可以与互联网主机通信的外网ip。

  • 上述iptables -t nat -A POSTROUTING -s 192.168.38.0/24 ! -d 192.168.38.0/24 -j SNAT --to-source 172.18.2.2 此命令有个致命的缺陷;NAT的外网地址是由DHCP获取的,但是–to-source 172.18.2.2 确是一个固定的ip地址,解决办法如下:

◆ 解决办法:

  • MASQUERADE:动态IP,如拨号网络
    –to-ports port[-port]
    –random

  • iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE

[root@centos7-17 ~]# iptables -t nat -A POSTROUTING -s 192.168.38.0/24 ! -d 192.168.38.0/24 -j MASQUERADE
[root@centos7-17 ~]# iptables -t nat -D POSTROUTING 1
[root@centos7-17 ~]# iptables -t nat -vnL
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    1    60 MASQUERADE  all  --  *      *       192.168.38.0/24     !192.168.38.0/24 
然后在虚拟机将桥接网卡移除,或者直接手动修改桥接网卡ip地址


MASQUERADE将自动绑定外网地址:
[root@centos7-27 ~]# curl 172.18.3.4
web server:172.18.3.4
  • :此时必须指明内网ip的网段,如果内部局域网有多网段,那么设置多条规则,将仅剩下外网ip

DNAT

◆DNAT

  • –to-destination [ipaddr[-ipaddr]][:port[-port]]

◆ iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]

DNAT实验

◆ 拓扑图:

◆ 各主机配置:

  • hostA:

    • eth0
      • 桥接:模拟外网
      • ip:172.18.3.4/16(此处没有静态配置,DHCP自动获取的)
  • hostB:

    • NAT路由器
    • eth0
      • 桥接:模拟外网地址
      • ip:172.18.2.74/16(DHCP自动获取)
    • eth1
      • NAT模式:内网
      • ip:192.168.38.17
    • 路由转发打开
  • hostC:

    • eth0
      • NAT:内网
      • ip:192.168.38.27
      • 默认路由指向:192.168.38.17(访问hostA需要指明)
承接上述SNAT实验:
仅需要在NAT路由器上配置:
[root@centos7-17 ~]# iptables -t nat -A PREROUTING -d 172.18.2.74/16 -p tcp --dport 22 -j DNAT --to-destination 192.168.38.27:22 
    ==> 谁访NAT的tcp 22端口,就被映射为192.168.38.27:22 


[root@web-server ~]# ssh 172.18.2.74
root@172.18.2.74's password: 
Last login: Wed Oct 23 19:56:53 2019 from 192.168.38.17
[root@centos7-27 ~]# exit



在hostC主机上查看:可以看见hostA连接的hostC
[root@centos7-27 ~]# ss -tn
State       Recv-Q Send-Q            Local Address:Port        Peer Address:Port              
ESTAB       0      0                 192.168.38.27:22          172.18.3.4:39120   

DNAT实验总结

  • :iptables是在nat表的PREROUTING链实现的DNAT,与LVS不同。

转发

REDIRECT

  • NAT表
  • 可用于:PREROUTING OUTPUT 自定义链
  • 通过改变目标IP和端口,将接受的包转发至不同端口
  • –to-ports port[-port]

◆ 示例:

  • iptables -t nat -A PREROUTING -d 172.168.100.10 -p tcp --dport 80 -j REDIRECT --to-ports 8080
  • 访问目标主机-d 172.18.100.10 的tcp 80 端口转发至172.18.100.10的8080端口

◆ 一般使用场景:

  • 将本机的端口进行重定向
在上述DNAT实验中:
hostC提供web server,但是修改了默认端口
    httpd tcp 80 修改为 tcp 8080时


hostC主机上配置:访问本机80端口重定向至8080端口
[root@centos7-27 ~]# iptables -t nat -A PREROUTING -d 192.168.38.27 -p tcp --dport 80 -j REDIRECT --to-ports 8080


hostB主机配置:访问本机80端口时,映射为192.168.38.27:80端口
[root@centos7-17 ~]# iptables -t nat -A PREROUTING -d 172.18.2.74/16 -p tcp --dport 80 -j DNAT --to-destination 192.168.38.27:80


hostA主机:访问172.18.2.74:80端口:
[root@172-18-3-4 ~]# curl 172.18.2.74
192.168.38.27
  • :REDIRECT和DNAT均只能在PREROUTING链上配置,虽然INPUT链默认只流向本机的数据报文,但是iptables是在PREROUTING链上配置的。
-17 ~]# iptables -t nat -A PREROUTING -d 172.18.2.74/16 -p tcp --dport 80 -j DNAT --to-destination 192.168.38.27:80


hostA主机:访问172.18.2.74:80端口:
[root@172-18-3-4 ~]# curl 172.18.2.74
192.168.38.27
  • :REDIRECT和DNAT均只能在PREROUTING链上配置,虽然INPUT链默认只流向本机的数据报文,但是iptables是在PREROUTING链上配置的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值