iptables防火墙
一、iptables防火墙概述
1.应用场景
1.主机安全
2.内部共享上网
3.端口或IP映射
2.iptables工作流程
1.匹配规则是从上往下的依次执行的
2.只要匹配上规则,就不会再往下执行
3.如果都没有匹配到规则,就执行默认的规则
4.防火墙默认规则最后执行,默认允许所有
#注意:匹配越多的规则越往前放
二、iptables四表五链
#四表:
1.Filter表
2.NAT表
3.Managle表
4.Raw表
#五链:
1.INPUT
2.FORWARD
3.OUTPUT
4.PREROUTING
5.POSTRUTING
1.filter表
主要作用就是阻止和允许访问
包含的链:
1.INPUT:过滤进入主机的数据包
2.FORWARD:负责转发流经主机的数据包
3.OUTPUT:处理从主机出去的数据包
2.NAT表
主要作用就是端口和IP转发
包含的链:
1.OUTPUT:处理从主机出去的数据包
2.PREROUTING:在数据包到达防火墙时进行判断,改写数据包目的地址或端口(端口转发)
3.POSTRUTING:在数据包到达防火墙时进行判断,改写数据包目的地址或端口(局域网共享上网)
三、iptables安装
1.安装iptables
[root@web02 ~]# yum install -y iptables-services
2.加载防火墙的内核模块
[root@m01 ~]# modprobe ip_tables
[root@m01 ~]# modprobe iptable_filter
[root@m01 ~]# modprobe iptable_nat
[root@m01 ~]# modprobe ip_conntrack
[root@m01 ~]# modprobe ip_conntrack_ftp
[root@m01 ~]# modprobe ip_nat_ftp
[root@m01 ~]# modprobe ipt_state
#查看加载的模块
[root@m01 ~]# lsmod | egrep 'filter|nat|ipt'
3.停止firewalld,启动iptables
[root@web02 ~]# systemctl stop firewalld
[root@web02 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@web02 ~]# systemctl start iptables.service
[root@web02 ~]# systemctl enable iptables #加入开机自启动
[root@web02 ~]# systemctl stop iptables #停止防火墙
四、iptables常用参数
#常用参数
(a)链管理:
-N:new, 自定义一条新的规则链;
-X: delete,删除自定义的规则链;
注意:仅能删除 用户自定义的 引用计数为0的 空的 链;
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃
REJECT:拒绝
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
(b)规则管理:
-A:append,追加;
-I:insert, 插入,要指明位置,省略时表示第一条;
-D:delete,删除;
(1) 指明规则序号;
(2) 指明规则本身;
-R:replace,替换指定链上的指定规则;
-F:flush,清空指定的规则链;
-Z:zero,置零;
iptables的每条规则都有两个计数器:
(1) 匹配到的报文的个数;
(2) 匹配到的所有报文的大小之和;
(c)查看:
-L:list, 列出指定鏈上的所有规则;
-n:numberic,以数字格式显示地址和端口号;
-v:verbose,详细信息;
-vv, -vvv
-x:exactly,显示计数器结果的精确值;
--line-numbers:显示规则的序号;
五、iptables常用操作
1.查看防火墙(默认filter表)
[root@web02 ~]# 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
2.查看防火墙规则,指定nat表
[root@web02 ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
[root@web02 ~]#
3.清除防火墙规则
#删除链中所有的规则
[root@web02 ~]# iptables -F
#删除用户定义的链
[root@web02 ~]# iptables -X
#规则计数器清零
[root@web02 ~]# iptables -Z
4.添加防火墙规则
[root@web02 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
iptables #命令
-t #指定表
filter #表名字
-A #添加规则至链的最后
INPUT #链名字
-p #指定协议
tcp #tcp协议
--dport #指定端口
-j #指定动作
DROP #丢弃
5.删除防火墙规则
[root@web02 ~]# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@web02 ~]#
[root@web02 ~]#
[root@web02 ~]# iptables -D INPUT 2
六、防火墙配置实例
1.禁止端口访问
[root@web02 ~]# iptables -t filter -A INPUT -p tcp --dport 3306 -j DROP
2.拒绝IP访问
#配置访问抛弃
[root@web02 ~]# iptables -t filter -A INPUT -p tcp -s 10.0.0.7 -i eth0 -j DROP
-s 指定源地址
-i 指定网卡
#测试访问
[root@web01 ~]# curl 10.0.0.8
curl: (7) Failed connect to 10.0.0.8:80; Connection timed out
#配置访问拒绝
[root@web02 ~]# iptables -t filter -A INPUT -p tcp -s 10.0.0.9 -i eth0 -j REJECT
#访问测试
[root@web03 ~]# curl 10.0.0.8
curl: (7) Failed connect to 10.0.0.8:80; Connection refused
3.禁止IP网段访问
[root@web02 ~]# iptables -t filter -A INPUT -p tcp -s 10.0.0.0/24 -i eth0 -j DROP
4.只允许某个IP访问
[root@web02 ~]# iptables -t filter -A INPUT -p tcp ! -s 10.0.0.1 -i eth0 -j DROP
5.匹配端口范围
#拒绝多个端口访问,可以使用逗号隔开
[root@web02 ~]# iptables -t filter -A INPUT -p tcp -m multiport --dport 21,22,23,24 -j DROP
-m #指定扩展项
multiport #多端口匹配
#写端口范围可以使用 : 在端口之间
[root@web02 ~]# iptables -t filter -A INPUT -p tcp --dport 22:100 -j DROP
七.企业里一般怎么配置
1.配置之前考虑下
1.考虑防火墙开在哪台机器上
2.该机器部署了什么服务
nginx
keepalived
3.服务开启的是什么端口
80
443
22
4.默认规则为所有都拒绝
2.配置安全规则
#允许访问80和443
iptables -I INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
-I 添加规则至前面
#只允许跳板机连接22端口
iptables -A INPUT -p tcp -s 172.16.1.61 --dport 22 -j ACCEPT
#禁止ping
iptables -A INPUT -p icmp --icmp-type 8 ! -s 172.16.1.61 -j DROP
#允许访问外网
iptables -A INPUT -i eth0 -j ACCEPT
#默认拒绝所有
iptables -P INPUT DROP
-P 更改policy默认策略
天坑:
根据以上配置方法,最后一步设置了默认拒绝所有规则,那么跳板机连接主机后,千万不要进行清理防火墙的操作,否则就什么都连接不上了
因为清理防火墙规则不会清理'iptables -P INPUT DROP'这一条规则,那么防火墙默认规则就变成所有都dorp了
#解决方法:
需要到虚拟机或者物理机上操作
1.iptables -P INPUT ACCEPT
2.systemctl restart iptables
3.重启物理机(有风险)
#避免方法:
1.将 iptables -P INPUT ACCEPT 加到定时任务(测试阶段可用该方法)
* * * * * /usr/sbin/iptables -P INPUT ACCEPT
2.其他环境测试,测试没有问题后,复制所有规则到环境执行
3.配置前,先保存之前的防火墙规则,根据以前的规则修改
[root@web01 ~]# iptables-save > iptables_m01_20200116
修改后导入规则
[root@web01 ~]# iptables-restore < iptables_m01_20200116
3.企业中配置
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 10.0.1.0/24 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -nL
八、防火墙规则永久生效
#把规则写入iptables配置文件
[root@m01 ~]# vim /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
#保存已经配置的规则 试用于centos6
[root@m01 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
#iptables-save把规则保存到文件中,再由目录rc.d下的脚本(/etc/rc.d/init.d/iptables)自动装载
#使用命令iptables-save来保存规则。一般用
[root@m01 ~]#iptables-save > /etc/sysconfig/iptables
#生成保存规则的文件 /etc/sysconfig/iptables,
#也可以用
[root@m01 ~]#service iptables save
#它能把规则自动保存在/etc/sysconfig/iptables中。
#当计算机启动时,rc.d下的脚本将用命令iptables-restore调用这个文件,从而就自动恢复了规则。
九、内部共享上网
1.在m01上操作
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
-j 指定动作
SNAT 源地址转换
--to-source 源地址转换指向
2.没有外网ip的主机操作
[root@web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
GATEWAY=172.16.1.61
DNS1=223.5.5.5
[root@web01 ~]# ifdown eth1 && ifup eth1
十、端口转发和IP转发
1.端口转发
[root@m01 ~]# iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 5555 -j DNAT --to-destination 172.16.1.7:22
[root@m01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
-d 指定目的ip
DNAT 目标地址转换
--to-destination 目标地址转换指向
2.IP转发
[root@m01 ~]# iptables -t nat -A PREROUTING -d 10.0.1.61 -j DNAT --to-destination 172.16.1.7
iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61