linux下iptable防火墙的配置 - Go语言中文社区

linux下iptable防火墙的配置


一、什么是iptables?

IPTABLES 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统。防火墙在做信息包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的信 息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。除非您正在使用 Red Hat Linux 7.1 或更高版本,否则需要下载该工具并安装使用它。

有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态,防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。这里有四种有效状态,名称分别为 ESTABLISHED 、 INVALID 、 NEW 和 RELATED。
(1)状态 ESTABLISHED 指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。
(2)INVALID 状态指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。
(3)状态 NEW 意味着该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。
(4) RELATED 表示该信息包正在启动新连接,以及它与已建立的连接相关联。

二、策略与规则链

防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。一般而言,防火墙策略规则的设置有两种:一种是“通”(即放行),一种是“堵”(即阻止)。当防火墙的默认策略为拒绝时(堵),就要设置允许规则(通),否则谁都进不来;如果防火墙的默认策略为允许时,就要设置拒绝规则,否则谁都能进来,防火墙也就失去了防范的作用。

iptables的四表五链
表的处理优先级:raw>mangle>nat>filter
filter:一般的过滤功能
nat:用于nat功能(端口映射,地址映射等)
mangle:用于对特定数据包的修改
raw:有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能
5链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
PREROUTING:数据包进入路由表
INPUT:通过路由表后目的地为本机
FORWARDING:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外转发
POSTROUTIONG:发送到网卡接口之前。

三、iptables基本命令的使用

[root@localhost ~]# yum install  iptables -y
#安装iptables安装包
[root@localhost ~]# systemctl stop firewalld
#临时关闭防火墙
[root@localhost ~]# systemctl disable firewalld
#开机时自动关闭防火墙
rm '/etc/systemd/system/basic.target.wants/firewalld.service'
rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
[root@localhost ~]# systemctl start  iptables
#打开iptables服务
[root@localhost ~]# systemctl enable iptables
#开机时自动重启iptables服务
ln -s '/usr/lib/systemd/system/iptables.service' '/etc/systemd/system/basic.target.wants/iptables.service'

iptables命令中参数的详细解释

  • A 在指定链的末尾添加(append)一条新的规则
    -D删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
    -I在指定链中插入(insert)一条新的规则,默认在第一行添加
    -R修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
    -L列出(list)指定链中所有的规则进行查看
    -F清空(flush)
    -N新建(new-chain)一条用户自己定义的规则链
    -X删除指定表中用户自定义的规则链(delete-chain)
    -P设置指定链的默认策略(policy)
    -n使用数字形式(numeric)显示输出结果
    -v查看规则表详细信息(verbose)的信息
    -V查看版本(version)
    -h获取帮助(help)

(1)查看防火墙策略:iptables -nL

[root@localhost ~]# iptables -nL  
#查看防火墙的策略
#-n 使用数字形式(numeric)显示输出结果
#-L 列出(list)指定链中所有的规则进行查看
#target代表进行的动作,一般会由三种不同的动作,详细解释如下1)ACCEPT:接受数据包
 (2)REJECT: 拒绝数据包通过,必要时会给数据发送端一个响应的信息。
 (3)DROP 直接丢弃数据包,不给任何回应信息
# prot:代表使用的封包协定,主要有 tcp, udp 及 icmp 三种封包格式
# opt :解释说明
#source :来源地址的闲置
#destination:目标地址进行限制

示例
这里写图片描述

(2)清空防火墙的策略:iptables -F

这里写图片描述

(3)保存防火墙的规则:service iptables save

这里写图片描述

(4)修改防火墙默认的策略

[root@localhost ~]# iptables -P INPUT ACCEPT
#将INPUT策略修改为ACCEPT
#-P设置指定链的默认策略(policy)
#使用的基本格式 : iptables -P iptables链的名称 新策略
[root@localhost ~]# iptables -nL
#查看防火墙的基本策略
Chain INPUT (policy ACCEPT)  #由这一行可以看出INPUT链中的策略已经被修改成了ACCEPT
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

(5)添加防火墙的策略

[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j REJECT
#通过80端口进行访问时被拒绝
[root@localhost ~]# iptables -nL
#查看防火墙的策略
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

在执行完上面的命令后,为了方便测试,需要安装apache 服务,并在apache服务的默认发布目录下,编辑默认发布文件,然后在另一台主机上测试,观察结果。

在172.25.254.218这台主机上进行测试

这里写图片描述

[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#通过80端口进行访问时被接受
[root@localhost ~]# iptables -nL
#查看防火墙的策略
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 reject-with icmp-port-unreachable
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

这里写图片描述

[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j DROP
#通过80端口进行访问时被丢弃
[root@localhost ~]# iptables -nL
#查看防火墙的策略
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination     

这里写图片描述

(6)添加防火墙的策略并指定特定的ip

[root@localhost ~]# iptables -A INPUT -s 172.25.254.218  -p tcp --dport 80 -j REJECT
#添加防火墙策略,指定172.25.254.218这台主机到INPUT链中,
#通过80端口,拒绝接受数据包
#-A 指定iptables链的类型
#-s 指定具体的ip
#-p 指定封装的协议类型
#-dport 指定哪个端口
#-j 指定动作的状态
[root@localhost ~]# iptables -nL
#查看防火墙的策略

示例

这里写图片描述
这里写图片描述
这里写图片描述

(7)插入防火墙策略


 1. [root@localhost ~]# iptables -I INPUT 1 -s 172.25.254.218 -p tcp --dport 22 -j REJECT
 #插入策略信息到INPUT链的第一条,策略信息是:指定172.25.254.218这台主机它通过22端口是拒绝
 #-I 插入策略信息

 2. [root@localhost ~]# iptables -nL
#查看防火墙的策略
 3.在172.25.254.218这台主机上进行测试

示例
插入策略到指定位置
这里写图片描述
查看策略信息
这里写图片描述
验证策略要求,拒绝主机 172.25.151.250 通过 22 端口访问
这里写图片描述

(8)修改iptables防火墙策略

[root@localhost ~]# iptables -R INPUT 2 -s 172.25.254.218 -p tcp --dport 80 -j ACCEPT
#修改INPUT链的第二条信息,允许172.25.254.218这台主机通过80端口访问。
#-R:修改的意思
#-s:指定具体的id
#-p:指定封装的协议
#-dport:指定的端口
#-j:动作的类型
[root@localhost ~]# iptables -nL
#查看防火墙的基本策略

target     prot opt source    
...........此处省略           
ACCEPT     tcp  --  172.25.254.218       0.0.0.0/0            tcp dpt:80
#观察target这一栏中信息可以看出,INPUT链的第二条信息已经修改为ACCEPT

(9)删除iptables防火墙的策略

[root@localhost ~]# iptables -D INPUT 1
#删除INPUT链的第一条信息
#-D:删除
#基本格式:iptables -D iptables链的类型 第几条信息

(10)iptables 规则链的添加,重命名及其删除

1、iptables规则链的添加

[root@localhost ~]# iptables -N linux
#添加规则链linux
[root@localhost ~]# iptables -nL
#查看防火墙的策略
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain linux (0 references)
#由这一行可以看出linux规则链已经添加
target     prot opt source               destination   

2、iptables规则链的重命名

[root@localhost ~]# iptables -E linux sweet
#将规则链linux的名称修改为sweet
[root@localhost ~]# iptables -nL
#查看防火墙的策略
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain sweet (0 references)
#由这一行可以看出linux规则链已经被修改为sweet规则链
target     prot opt source               destination       

3、iptables规则链的删除

[root@localhost ~]# iptables -X  sweet
#删除iptables规则链sweet
[root@localhost ~]# iptables -nL
#查看防火墙策略
#由下面的信息可以看出,sweet规则链已经删除
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

四、iptables -m state –state 状态模组

[root@localhost ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#只有在已经连接的正在连接的允许
#-A 指定链的类型
#-m state :状态模组
# --state :一些封包的狀態,主要有:
#  INVALID    :无效的封包,通常这些包被DROP
#  ESTABLISHED:该包属于某个已建立的连接
#  NEW        :该包想要开始一个新的连接(重新连接或连接重定向)
#  RELATED    :该包是属于某个已建立的连接所建立的新连接
[root@localhost ~]# iptables -nL
#查看防火墙的策略
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
#由这一行我可以看出,此规则链已经添加

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination    

五、iptables 的端口转发和伪装

1、端口转发

@服务器(server主机)

[root@client ~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 
#-t nat:指定 nat 表
# -A :指定iptables链的类型
# PREROUTING:(外部访问内部)可以在这里定义进行 目的NAT的规则,因为路由器进行路由时只检查数据包的目的ip地址,所以为了使数据包得以正确路由,我们必须 在路由之前就进行目的NAT;
# -i eth0:匹配从网络接口 eth0 进来
# -p tcp:封包协议为 tcp 协议
# --dport 22:目的端口为 22 端口
# -j DNAT:进行目标地址转换 
# --to-dest:转发数据包的目的地址

(1)编辑网络配置文件eth0
这里写图片描述
编辑网络配置文件的内容
这里写图片描述
(2)编辑网络配置文件eth1
这里写图片描述
配置文件的内容
这里写图片描述
(3)重新启动网络
这里写图片描述
(4)查看ip信息
这里写图片描述
(5)添加输入端口
这里写图片描述
(6)查看防火墙的策略信息
这里写图片描述
(7)开启内核功能
编辑内核文件
这里写图片描述
这里写图片描述
这里写图片描述
(8)在server这台主机上进行测试网络是否通常通畅
这里写图片描述

@局域网内的主机(客户端主机)

配置网络和网关
这里写图片描述
这里写图片描述
查看desktop主机是否已经设置号ip信息
这里写图片描述
查看网关是否设置,由下图可以看出网关为192.268.1.218
这里写图片描述

在主机172.25.254.60这台主机上进行测试

这里写图片描述
查看ip信息,由下图可以看出我们在处于外部网络的主机上面登陆172.25.254.218这台主机时,发生了地址转换
这里写图片描述

2、地址伪装

在执行上面的地址转发后执行下面的命令,就可以实现地址伪装

@服务器

添加两个网卡,并配置网络eth0和eth1,进行地址转发和地址伪装,开启内核网络

[root@server ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT
 --to-source 
 -t nat:指定 nat 表
 -A POSTROUTING:指定 POSTROUTING POSTROUTING:可以在这里定义进行源NAT的规 则,系统在决定了数据包的路由以后在执行该链中的规则。
 -O eth0:匹配从网络接口 eth0 出去
 -j SNAT:进行源地址转换
 --to-source:转发数据包的源地址 

添加输出端口
这里写图片描述
查看iptables的策略
这里写图片描述

网络测试
这里写图片描述

@局域网内的主机

跟上面地址转发一致,需要设置ip和设定网关;
网络进行测试172.25.254.218这台主机
这里写图片描述
网络是否通畅测试192.168.1.218
这里写图片描述
测试主机的网络是否通畅
这里写图片描述
使用局域网内的主机登陆主机
这里写图片描述

@主机上进行测试

在主机上查看由哪些局域网内的主机登陆了这台主机,由下图我们可以看出,172.25.254.218这台主机登陆过真机,而实际上我们是通过192.168.1.118这台主机登陆真机,可以看出地址进行了伪装,向外界网络出公有地址,隐藏私有地。
这里写图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/dhjibk/article/details/80633776
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-04-10 22:48:17
  • 阅读 ( 1170 )
  • 分类:Linux

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢