介绍使用iptables管理NAT表
server24.com作为网关设备提供
172.25.23.24/24
以及192.168.10.100/24
两个不同网段的网络接口;
server20.com工作在192.168.10.10/24
并且将192.168.10.100/24
作为网关;
server21.com工作在172.25.23.24/24
,并且将172.25.23.24/24
作为网关;前面的实验通过
ip_forward
打开实现了网卡见转发数据报文的功能,当年时很多情况下,公网IP
价格昂贵,并且即使通过了进行路由,数据包可以发送出去,但是不能够受到响应报文,这就是需要进行地址转换的原因;对于内网主机需要借助于网关的公网
IP
来访问公网主机时,就需要进行SNAT
,也就是源地址转换,对于返回的数据报文经过NAT
服务器时,会通过查询NAT
表,自动的进行DNAT
的转换,这是不需要手动进行干预的,修改后的数据报文根据路由表的信息来选择对应的网卡端口转发数据报文信息;源地址转换
- 源地址转换可以在
POSTROUTING OUTPUT
上面进行,但是对于网关设备只能够在POSTROUTING
上面进行 SNAT
:
--to-source
:用于标识转换成哪一个源地址,通常数某个网关的地址,或者是路由器设备某个接口的位置;
- 通过在模拟网关设备
server24.com
上面添加SNAT
规则修改192.168.10.10/24
的地址为172.25.23.24/24
实现和server21.com
进行通信
[root@server24 ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.25.23.24
- 查看添加的规则
- 通过
server20.com
,IP
为192.168.10.10/24
尝试ping
另一个网段的主机172.25.23.24/24
,这里还是需要打开的网卡间转发的,也就是ip_forward
- 接下来通过抓包来分析区别,地址区别数据包来源地址的的区别:
- 这张图片是使用
SNAT
的图片
- 这张图片是没有使用
SNAT
的图片
通过对比发现通过
SNAT
之后数据包返回的地址发生了改变,而这个正是需要的;接下来删除
server21.com
上面关于指向172.25.23.24/24
的网关信息,先尝试使用server20.com
通过SNAT ping server21.com
;删除网关信息
- 验证
server20.com ping server21.com
是否正常
- 反向验证
server20.com ping server21.com
这个肯定是不能够ping
成功的,因为没有确切的网关;
- 上面添加的
SNAT
规则就可以实现数据包在网络上面进行数据传输,并且只需要修改自己的网关,就可以; - 对于使用拨号上网的可以使用,通常拨号上网
IP
都是通过DHCP
服务器来进行分配的
iptables -t nat -A POSTROUTING -s 172.25.23.0/24 -j SNAT MASQUERADE[效率低]
- 如果需要限制内网用户访问外网的某些情况,需要在
FORWARD
上面添加规则
[root@server24 ~]# iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
[root@server24 ~]# iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT
[root@server24 ~]# iptables -A FORWARD -s 192.168.10.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
- 接下来在
server21.com
上面安装httpd
服务,并且提供默认的配置页面
[root@server21 ~]# yum install httpd -y
[root@server21 ~]# echo "hello SNAT" > /var/www/html/index.html
[root@server21 ~]# /etc/init.d/httpd start
- 然后在
server20.com
上面通过elinks
命令来访问,得到的下面页面
- 接下来添加
vsftpd
服务,并且添加FORWARD
链上面的规则 - 首先安装
vsftpd
,并且进行启动
[root@server21 ~]# yum install vsftpd -y
[root@server21 ~]# /etc/init.d/vsftpd start
Starting vsftpd for vsftpd: [ OK ]
- 接下来在
server24.com
的FORWARD
上面添加对应的规则
[root@server24 ~]# iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@server24 ~]# iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT
查看规则如下
接下来使用
ftp
来访问ftp
服务器
- 如果登录成功,数据连接失败,需要手动添加模块
[root@server24 ~]# modprobe ip_nat_ftp
- 或者直接将上面的信息添加进入
iptables
的配置文件中
[root@server24 ~]# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
- 关于目标地址转换
- 简单来讲,私有网络需要通过网关代理访问共有网络的
web
服务时,我们需要进行SNAT
服服务,反过来,如果我们需要将两台提供不同服务的私有网络服务器通过网关代理提供给公有网络进行访问,就需要进DNAT
转换; - 因为公网
IP
不廉价的,大多数情况下,希望于通过一个公网IP
的不同端口代理不同的后台服务; - 对于
SNAT
来说会自动进行DNAT
,同样的对于DNAT
会自动进行SNAT
;
规划
三台Linux
主机:
server21.com作为内网,用于提供服务
server24.com作为为i内网提供服务的网关,并且需要提供DNAT
服务;
server20.com 作为来自公网的互联网主机,虽然是局域网IP,这里单纯的假设一下
- 因为需要的服务已经在
server21.com
上面配置正常了,接下来需要修改的是iptables NAT
的规则 - 首先清除上面的规则
[root@server24 ~]# iptables -t nat -F
[root@server24 ~]# iptables -F
[root@server24 ~]# iptables -P FORWARD ACCEPT
- 如果双方的网关正常的指向
server24.com
对应的网络接口的位置,相关的服务是可以正常访问的,因为是通过路由的方式进行数据交换的
- 首先来删除
servr20.com
的192.168.10.0/24
的网关,因为实际上是一个外网地址,实际上是通过路由,路由到192.168.10.100
这个地址的,对于server21.com
的172.25.23.24/24
这个网关地址需要保留
- 现在的访问肯定是失败的,接下来进行目标地址转化
[root@server24 ~]# iptables -t nat -A PREROUTING -d 192.168.10.100 -p tcp --dport 80 -j DNAT --to-destination 172.25.23.21
- 然后在
server20.com
上面通过elinks
来访问192.168.10.100
- 这里为了防止
192.168.10.100
本身的Web
服务影响实验,所以首先听掉server24.com
上面的服务;
[root@server24 ~]# /etc/init.d/httpd status
httpd is stopped
- 验证DNAT将端口进行转换
- 尝试更改
DNAT
之前请求的端口为80
,提供服务的主机的端口为8080
,然后尝试使用DNAT
进行地址转换 - 首先更改
server21.com 172.25.23.21
上面的服务端口为8080
[root@server21 ~]# vim /etc/httpd/conf/httpd.conf
Listen 8080
[root@server21 ~]# /etc/init.d/httpd restart
- 查看端口是否启动正常
- 接下来更改
server24.com
上面的nat
规则
[root@server24 ~]# iptables -t nat -R PREROUTING 1 -d 192.168.10.100 -p tcp --dport 80 -j DNAT --to-destination 172.25.23.21:8080
- 查看修改后的规则
尝试进行修改后的连接
在上面配置网络的过程中
ip_forward
的值在重新启动网络服务,之后,会变为0
,这个需要特别的注意,可以通过配置文件进行更改,这样重新启动网络服务时,会读取配置文件里面的定义尝试在
FORWARD
链上面添加规则,过滤某些关键字
[root@server24 ~]# iptables -A FORWARD -m string --algo kmp --string "h7n9" -j DROP
- 同时更改页面的发布内容
[root@server21 ~]# cat /var/www/html/index.html
hello DNAT PORT h7n9
- 然后尝试通过
elinks
进行访问
- 然后删除关键字.验证进行访问
[root@server21 ~]# cat /var/www/html/index.html
hello DNAT PORT
- 页面访问正常