Linux防火墙规则和SNAT实验和DNAT实验

Linux防火墙

概述

       Linux防火墙功能是由内核实现的,在2.4版及以后的内核中,包过滤机制是netfilter,管理工具是iptables
       netfilter是Linux内核中的包过滤防火墙功能体系,称为Linux防火墙的内核态
       iptables是用来管理防火强墙的命令工具,为防火墙体系提供过滤规则,决定如何过滤或处理到达防火墙主机的数据包,称为Linux防火墙的用户态。

iptables的规则表、链结构

规则链

       在iptables中有5中默认的规则链,其作用在于对数据包进行过滤和处理,根据处理的时机不同,各种规则被组织在不同的链中。

INPUT:处理入站数据包
OUTPUT:处理出站数据包
FORWARD:处理转发数据包
POSTROUTING:在进行路由选择后处理数据包
PREROUTING:在进行路由选择前处理数据包

规则表

       在iptables中有4中默认的规则表,它们具有某一类相似用途的防火墙规则,按照不同处理时机区分不同的规则链以后,被归置到不同的表中,规则表是规则链的集合。

raw表:确定是否对该数据包进行状态跟踪
mangle表:为数据包设置标记
nat表:修改数据中的源、目标IP地址或端口
fiter表:确定是否过滤该数据包

数据包的过滤匹配流程

在这里插入图片描述
       在一个主机传递数据到另一个主机时,首先会根据规则表的优先级,在路由选择前进行数据包的跟踪,打上标记,然后查看路由表进行路由选择,确定是要到达本机的数据包还是要进行路由转发
       如果是到达本机的数据,它会进入经过mangle表的INPUT链继续打上标记,然后根据filter表中的INPUT链中的规则进行数据过滤,之后再经过路由选择,根据规则表的优先级,进行数据发送,然后POSTROUTING链将数据传送到对方主机上。
       如果是进行路由转发的数据,则会经过FORWARD链进行数据转发。

iptables语法格式

语法格式如图
在这里插入图片描述
常见数据包的处理方式
在这里插入图片描述

设置规则内容

-A:在链尾追加新的规则
-I:在指定位置插入一条新的规则
-R:修改、替换指定位置或内容的规则
-P:设置指定链的默认策略

查卡规则内容

-L:列表查看各条规则信息
–line-numbers:查看规则信息时显示规则的行号
-n:以数字形式显示IP地址、端口信息
-v:显示详细信息

清除规则

-D:清除指定位置或内容的规则
-F:清空规则链的所有规则

自定义规则

-N:新建一条规则链
-X:删除自定义的规则链

例1:
在filter表的INPUT链增加一条规则,只要是TCP协议的数据包都接收

[root@localhost ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT

在INPUT链插入一条规则,只要是udp协议的数据包都接收

[root@localhost ~]# iptables -I INPUT -p udp -j ACCEPT

在INPUT链插入一条规则,只要是icmp协议的数据包都接收,并且将该规则设置为第二条

[root@localhost ~]# iptables -I INPUT 2 -p icmp -j ACCEPT

将默认规则设为DROP

[root@localhost ~]# iptables -P INPUT DROP

查看规则链

[root@localhost ~]# iptables -L INPUT --line-numbers

删除规则链
删除规则链

[root@localhost ~]# iptables -D INPUT 2

新建规则链
在filter表中新建shengxia

[root@localhost ~]# iptables -t filter -N shengxia
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination                 

Chain shengxia (0 references)
target     prot opt source               destination    

给新建的规则链设置规则
给shengxia这个链设置一个规则,只要是icmp数据包都drop掉

[root@localhost ~]# iptables -t filter -A shengxia -p icmp -j DROP
[root@localhost ~]# iptables -L -t filter
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination                 

Chain shengxia (0 references)
target     prot opt source               destination         
DROP       icmp --  anywhere             anywhere  

使用新建规则链
将进入filter表的icmp数据包都转到shengxia这个链进行处理

[root@localhost ~]# iptables -t filter -I INPUT -p icmp -j shengxia
[root@localhost ~]# iptables -L -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    4   240 shengxia   icmp --  any    any     anywhere             anywhere            
  295 29207 ACCEPT     udp  --  any    any     anywhere             anywhere            
 3283  214K ACCEPT     tcp  --  any    any     anywhere             anywhere            

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 25 packets, 2204 bytes)
 pkts bytes target     prot opt in     out     source               destination                  

Chain shengxia (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    4   240 DROP       icmp --  any    any     anywhere             anywhere       

记录日志
打开日志服务,记录日志位置

[root@@localhost ~]# vim /etc/rsyslog.conf 

在这里插入图片描述
添加日志规则

[root@localhost ~]# iptables -I INPUT -p icmp -j LOG --log-prefix "shengxia" --log-level 4
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
LOG        icmp --  anywhere             anywhere             LOG level warning prefix "shengxia"

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

另一台主机ping,即可看到日志

[root@localhost ~]# tail -f /var/log/sctest.log 
Aug  3 00:39:16 elk-node1 kernel: shengxiaIN=ens35 OUT= MAC=00:0c:29:04:07:e4:00:0c:29:13:a8:73:08:00 SRC=192.168.111.160 DST=192.168.111.254 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=42723 DF PROTO=ICMP TYPE=8 CODE=0 ID=15597 SEQ=1 
Aug  3 00:39:17 elk-node1 kernel: shengxiaIN=ens35 OUT= MAC=00:0c:29:04:07:e4:00:0c:29:13:a8:73:08:00 SRC=192.168.111.160 DST=192.168.111.254 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=43194 DF PROTO=ICMP TYPE=8 CODE=0 ID=15597 SEQ=2 
Aug  3 00:39:18 elk-node1 kernel: shengxiaIN=ens35 OUT= MAC=00:0c:29:04:07:e4:00:0c:29:13:a8:73:08:00 SRC=192.168.111.160 DST=192.168.111.254 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=43810 DF PROTO=ICMP TYPE=8 CODE=0 ID=15597 SEQ=3 

例2
编写
脚本实现以下功能

允许192.168.40.0/24的网段访问本机的web、ftp、ssh、mysql
允许访问本机的dns服务–53udp
禁止其它电脑ping主机,主机可以ping其它电脑
默认的INPUT链规则设置为DROP
禁止192.168.40.90/24主机访问本机的2233端口

#!/bin/bash
#允许192.168.40.0/24的网段访问本机的web、ftp、ssh、mysql
iptables -A INPUT -s 192.168.40.0/24 -p tcp -m multiport --dport 80,21,22,3306 -j ACCEPT
#允许访问本机的dns服务--53 udp
iptables -I INPUT -p udp --dport 53 -j ACCEPT
#禁止其它电脑ping主机(别的主机发送请求报文),主机可以ping其它电脑(接收响应报文)
iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP
#默认的INPUT链规则设置为DROP
iptables -P INPUT DROP
#禁止192.168.40.90/24主机访问本机的2233端口
iptables -I INPUT -s 192.168.40.90/24 -p tcp --dport 2233 -j DROP
#允许192.168.1.0网段访问本机23端口
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 23
#允许192.168.1.12-192.168.1.200访问本机8080端口
iptables -A INPUT -s iprange --src-range 192.168.1.12-192.168.1.200 -p tcp --dport 8080 -j ACCEPT
#允许192.168.1.20访问3306端口
iptables -A INPUT -s 192.168.1.20 -p tcp --dport 3306 -j ACCEPT
#允许访问本机的80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

SNAT实验

先放两张图看一下使用SNAT和没有使用SNAT的区别
在这里插入图片描述
在这里插入图片描述
       从图中明显看出,如果没有使用SNAT策略,局域网的主机是无法跟外网进行通信的,所以这就是SNAT的好处,将源IP地址进行转化,使得局域网主机共享单个公网IP接入Internet。

SNAT实验网络拓扑图

       在进行一个实验时,首先要规划好网络拓扑图,保证实验的顺利进行。
在这里插入图片描述

实验环境和步骤

1.准备好两台虚拟机,一台做PC机,一台做Linux网关服务器
(这里准备两台虚拟机,Centos7-firewalld做网关服务器)
在这里插入图片描述

2.给虚拟机添加网卡,配置好IP地址、网关、域名服务器
       根据网络拓扑图,先给Linux网关服务器进行配置,整个实验在桥接模式下进行,所以如果是校园网联网的情况下可能实验不成功。

先进入IP配置所在目录

cd /etc/sysconfig/network-scripts/
将ifcfg-ens33文件复制一份,我这里新加的另一块网卡名时ifcfg-ens35,所以执行下面命令
cp ifcfg-ens33 ifcfg-ens35

给Linux网关服务器配置IP地址、网关、域名

ifcfg-ens33网卡

BOOTPROTO="none"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.1.147
PREFIX="24"
GATEWAY=192.168.1.1
DNS1=114.114.114.114

在这里插入图片描述

ifcfg-ens35网卡

BOOTPROTO="none"
NAME="35"
DEVICE="ens35"
ONBOOT="yes"
IPADDR=192.168.50.254
PREFIX="24"

在这里插入图片描述

给PC机配置IP地址、网关、域名

BOOTPROTO="none"
DEFROUTE="yes"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.50.1
PREFIX="24"
GATEWAY=192.168.50.254
DNS1=114.114.114.114

在这里插入图片描述

3.网关服务器开启路由转发功能

3种方法
1./sbin/sysctl -w net.ipv4.ip_forward=1
2.echo 1 > /proc/sys/net/ipv4/ip_forward
3.修改/etc/sysctl.conf,设置net.ipv4.ip_forward=1

4.关闭防火墙和selinux功能

关闭防火墙
service firewalld stop --> 临时关闭
systemctl disable firewalld -->永久关闭
关闭selinux功能
setenforce 0

5.网关服务添加SNAT策略

#使用脚本实现,方便后续修改
#清除防火墙规则
#!/bin/bash
iptables -F
iptables -t nat -F
#添加SNAT策略
iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -o ens33 -j SNAT --to-source 192.168.1.147   
#开启路由功能
echo 1 > /proc/sys/net/ipv4/ipv4_forward

6.测试验证
       用PC机ping百度,如果能ping通,则说明实验成功
在这里插入图片描述

DNAT实验网络拓扑图

在这里插入图片描述
        步骤和SNAT实验差不多,需要注意的是用三台虚拟机,一台做发布内网的web服务器,一台做网关服务器,一台做客户机。
        其中,发布内网的web服务器使用仅主机模式,方便显示效果,网关服务器中的一个网卡用桥接,一个网卡用仅主机

        当Windows客户端直接访问web服务器时,显示如下,注意IP地址为192.168.111.160:8080

在这里插入图片描述

        添加DNAT策略访问内网服务器

#!/bin/bash
echo 1 >/proc/sys/net/ipv4/ip_forward
service firewalld stop
iptables -F
iptables -t nat -F
iptables -t nat -A PREROUTING -d 192.168.2.96 -i ens33 -p tcp --dport 8080 -j DNAT --to-destination 192.168.111.160

        浏览器直接访问 192.168.2.96:8080就可以实现DNAT策略访问web服务器啦!!!
在这里插入图片描述
也可以将端口转换一下,比如默认端口80 --->8080

iptables -t nat -A PREROUTING -d 192.168.2.96 -i ens33 -p tcp --dport 80 -j DNAT --to-destination 192.168.111.160:8080

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值