iptables 的历史以及工作原理
iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。
他们都是工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器),也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结 构以及使用方法不一样罢了
规则的写法
iptables定义规则的方式:
格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
-t table :3个filter nat mangle
COMMAND:定义如何对规则进行管理
chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
CRETIRIA:指定匹配标准
**-j ACTION **:指定如何进行处理
链管理命令(立即生效)
-P :设置默认策略的(设定默认门是关着的还是开着的)
默认策略一般只有两种
iptables -P INPUT (DROP|ACCEPT) ** 默认是关的/默认是开的
比如:
iptables -P INPUT DROP** 这就把默认规则给拒绝了。并且没有定义哪个动作,所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。
-F: FLASH,清空规则链的(注意每个链的管理权限)
iptables -t nat -F PREROUTING
iptables -t nat -F 清空nat表的所有链
-N:NEW 支持用户新建一个链
iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的。
-X: 用于删除用户自定义的空链
使用方法跟-N相同,但是在删除之前必须要将里面的链给清空了
-E:用来Rename chain主要是用来给用户自定义的链重命名
-E oldname newname
-Z:清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)
iptables -Z :清空
规则管理命令
-A:追加,在当前链的最后新增一个规则
-I num : 插入,把当前规则插入为第几条。
格式:-I 3 :插入为第三条
-R num:Replays替换/修改第几条规则
格式:iptables -R 3 …………
-D num:删除,明确指定删除第几条规则
查看管理命令 “-L”
附加子命令
-n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。
-v:显示详细信息
-vv
-vvv :越多越详细
-x:在计数器上显示精确值,不做单位换算
--line-numbers : 显示规则的行号
-t nat:显示所有的关卡的信息
常用命令
安装iptable
- 先检查是否安装了iptables
service iptables status - 安装iptables
yum install -y iptables - 升级iptables
**yum update iptables ** - 安装iptables-services
yum install iptables-services
自带的firewalld服务的操作
- systemctl status firewall 查看状态
- firewall-cmd --state 查看状态
- service firewalld restart 重启
- service firewalld start 开启
- service firewalld stop 关闭
- systemctl stop firewalld 禁用
- firewall-cmd --list-all 查看防火墙规则
- firewall-cmd --zone=public --add-port=80/tcp --permanent
开启80端口 - systemctl restart firewalld.service 重启防火墙
- firewall-cmd --zone= public --remove-port=80/tcp --permanent
移除80端口
设置现有规则
- 查看iptables现有规则
iptables -L -n - 先允许所有,不然有可能会悲剧
iptables -P INPUT ACCEPT - 清空所有默认规则
iptables -F - 清空所有自定义规则
iptables -X - 所有计数器归0
iptables -Z - 允许来自于lo接口的数据包(本地访问)
iptables -A INPUT -i lo -j ACCEPT - 开放22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT - 开放21端口(FTP)
iptables -A INPUT -p tcp --dport 21 -j ACCEPT - 开放80端口(HTTP)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT - 开放443端口(HTTPS)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT - 允许ping
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT - 允许接受本机请求之后的返回数据 RELATED,是为FTP设置的
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT - 其他入站一律丢弃
iptables -P INPUT DROP - 所有出站一律绿灯
iptables -P OUTPUT ACCEPT - 所有转发一律丢弃
iptables -P FORWARD DROP
其他规则设定
- 如果要添加内网ip信任(接受其所有TCP请求)
iptables -A INPUT -p tcp -s 45.96.174.68 -j ACCEPT - 过滤所有非以上规则的请求
iptables -P INPUT DROP - 要封停一个IP,使用下面这条命令:
iptables -I INPUT -s ***.***.***.*** -j DROP - 要解封一个IP,使用下面这条命令:
iptables -D INPUT -s ***.***.***.*** -j DROP
保存规则设定
- 保存上述规则
service iptables save
开启iptables服务
- 注册iptables服务相当于以前的chkconfig iptables on
systemctl enable iptables.service - 开启服务
systemctl start iptables.service - 查看状态
systemctl status iptables.service