第十四章:iptables防火墙
第1节:iptables工作流程
- 规则匹配顺序是从上往下依次执行。
- 只要匹配上,就不再往下执行 。
- 防火墙的默认规则是对应链的所有的规则执行完以后才会执行的(最后执行的规则)。
- 默认情况下,默认规则是放开所有。
第2节:iptables四表五链
四表 (tables)
- Filter表
- NAT表
- Managle表
- Raw表
五链 (chains)
- INPUt
- FORWARD
- OUTPUT
- PREROUTING
- POSTROUTING
第3节: iptables环境准备
1.安装iptables
yum install iptables-services -y
2.加载防火墙模块
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
3.查看已加载的模块
lsmod |egrep 'filter|nat|ipt'
4..启动防火墙 首先停止firewalld
systemctl stop firewalld
systemctl disable firewalld
5.启动iptables
systemctl start iptables.service
systemctl enable iptables.service
6.查看防火墙规则
iptables -nL
第4节:iptables基本操作命令
1.查看防火墙规则,默认查看的是filter表
iptables -nL
2.查看nat表
iptables -nL -t nat
3.清除防火墙规则
iptables -F <- 清除所有规则,不会处理默认的规则
iptables -X <- 删除用户自定义的链
iptables -Z <- 链的计数器清零(数据包计数器与数据包字节计数器)
4.删除指定链的指定规则
iptables -nL --line-numbers <-查看规则的number
iptables -D INPUT 7
第5节:iptables实战
需求:访问的数据包 源端口:22 目的端口:22 源IP:10.0.0.1 目的IP:10.0.0.61
1.禁止某个端口访问
iptables -A INPUT -p tcp --dport 22 -j DROP
命令解释
iptables -A INPUT #在filter表的INPUT链上添加规则
-p tcp #协议是tcp
--dport 22 #目标端口是22
-j DROP #执行的动作,如果匹配上,丢弃这个包
2.禁止某个IP访问
iptables -A INPUT -p tcp -s 10.0.0.7 -i eth0 -j DROP
iptables -A INPUT -p tcp -s 172.16.1.7 -i eth1 -j DROP
命令解释:
iptables -A INPUT
-p tcp
-s 10.0.0.7 #如果源地址是10.0.0.7
-i eth0 #如果流量来自eth0
-j DROP #执行拒绝操作
3.禁止某个网段访问
iptables -A INPUT -p tcp -s 10.0.0.0/24 -i eth0 -j DROP
4.只允许某个IP访问
iptables -A INPUT -p tcp ! -s 10.0.0.7 -i eth0 -j DROP
命令解释
iptables -A INPUT
-p tcp
! -s 10.0.0.7 #!取反,只要不是10.0.0.7的地址,执行的动作是拒绝
-i eth0
-j DROP
5.匹配端口范围
iptables -A INPUT -p tcp -s 10.0.0.7 -m multiport --dport 22,80 -j DROP
命令解释:
iptables -A INPUT -p tcp
-s 10.0.0.7
-m multiport #匹配多个端口
--dport 22,80 #匹配目标端口是22和80
-j DROP #匹配上就拒绝
iptables -A INPUT -p tcp -s 10.0.0.7 --dport 22:80 -j DROP
命令解释:
-s 10.0.0.7
-m multiport #匹配多个端口
--dport 22:100 #匹配目标端口是22到100
-j DROP #匹配上就拒绝
6.匹配ICMP类型 禁止所有主机ping
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
7.禁止10.0.0.7ping
iptables -A INPUT -p icmp --icmp-type 8 -s 10.0.0.7 -j DROP
8.除了10.0.0.7以外,所有的主机都禁止ping
iptables -A INPUT -p icmp --icmp-type 8 ! -s 10.0.0.7 -j DROP
第6节:iptables企业案例
如何配置lb服务器的防火墙
1.运行了哪些服务 nginx keepalived
2.启动了哪些端口 80 443 22
3.哪些IP和端口需要对外开放 VIP 80 443
4.默认规则修改为禁止
5.编写防火墙规则
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
iptables -A INPUT -p tcp -s 172.16.1.61 --dport 22 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -s 172.16.1.0/24 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -P INPUT DROP
6.测试命令
ping 10.0.0.7 #不通
ping 172.16.1.7 #通
ssh 10.0.0.7 #不通
ssh 172.16.1.7 #通
curl 10.0.0.7 #通
curl 172.16.1.7 #通
第7节:防火墙备份与恢复
1.备份方法
iptables-save > iptables_m01_20191010
2.恢复方法
iptables-restore < iptables_m01_20191010
3.将修改写入配置文件,下次重启依然生效
iptables-save > /etc/sysconfig/iptables
第8节:内网共享上网
实验环境: m01: 共享上网网关出口 web01: 只有内网地址,网关指向m01
实验步骤:
1.m01操作
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 10.0.0.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 -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
2.web01操作
[root@web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=172.16.1.7
GATEWAY=172.16.1.61
PREFIX=24
DNS1=223.5.5.5
[root@web01 ~]# systemctl restart network
[root@web01 ~]# ifdown eth0
[root@web01 ~]# ping www.baidu.com
第9节:端口映射
1.m01操作
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 PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22
命令解释
表:nat
链:PREROUTING
目标IP:10.0.1.61
目标端口:9000
协议:tcp
动作:DNAT
目标IP:172.16.1.7
目标端口:22
2.连接测试
ssh 10.0.0.61 -p 9000
第10节:IP映射
ip a add 10.0.0.62/24 dev eth0 label eth0:0
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 -I PREROUTING -d 10.0.0.62 -j DNAT --to-destination 172.16.1.7
第11节:陨石坑
假如配置安全规则的时候配置了默认拒绝所有规则 那么此时如果手欠,又输入了iptable -F 不好意思,这台服务器就谁都连不上了
临时此时解决方法:
1.告诉机房服务器账号密码,让机房人员登录进去执行恢复命令
- systemctl restart iptables
- iptables -P INPUT ACCEPT
2.直接让机房人员硬重启服务器 风险:如果运行的是数据库,那么硬重启可能会导致数据丢失或者数据库损坏,启动失败
3.使用远程控制卡登录到服务器,执行恢复命令
- systemctl restart iptables
- iptables -P INPUT ACCEPT
如何规避这样的风险:
1.配置防火墙的时候,添加一条定时任务,定时恢复默认规则为ACCPET
*/1 * * * * /usr/sbin/iptables -P INPUT ACCEPT
2.先在测试环境充分测试充足了,确定没有问题了再在生产环境部署
3.建议先保存当前防火墙的配置,基于配置文件去修改防火墙规则,然后将修改后的规则恢复进去