iptables介绍

iptables是开源的基于数据包过滤的防火墙工具

iptables企业应用场景

  1. 主机防火墙(filter表的INPUT链)
  2. 局域网共享上网(nat表的POSTROUTING链).半个路由器,NAT功能老男孩教育59期脱产班-Iptables防火墙实战.pdf
  3. 端口及IP映射(nat表的PREROUTING链),硬防的NAT功能
  4. IP一对一映射

iptables工作流程

iptables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机.

  1. 防火墙是一层层过滤的.实际是按照配置规则的顺序从上到下,从前到后进行过滤的.
  2. 如果匹配上了规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新规则了.
  3. 如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过.
  4. 防火墙的默认规则是对应链的所有的规则执行完以后才会执行的(最后执行的规则)

iptables四表五链

实际iptables包含4张表和五个链,但主要记住两张表即可filter和nat表即可

14248468-58da03a179b40672.png

  • FILTER表

14248468-b418ec2a196015e8.png

  • NAT表

14248468-1f52b22fab1683cd.png

iptables工作原理示意图

iptables包处理流程图树状.jpg

iptables表和链画图及说明.jpg

iptables环境准备

安装iptables管理命令

yum install iptables-services -y

加载防火墙的内核模块

modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state

#查看已加载的模块
lsmod |egrep 'filter|nat|ipt'

启动防火墙

#关闭firewalld
systemctl stop firewalld
systemctl disable firewalld

#启动iptables
systemctl start iptables.service
systemctl enable iptables.service

iptables基本操作命令

#查看防火墙规则
iptables -nL

#清除防火墙规则

#清除所有规则,不会处理默认的规则
iptables -F
#删除用户自定义的链
iptables -X
#链的计数器清零(数据包计数器与数据包字节计数器)
iptables -Z

#添加防火墙规则
#指定表(default:filter)
iptables -t
#把规则添加到指定的链上,默认添加到最后一行
iptables -A
#插入规则,默认插入到第一行(封IP)
iptables -I
#删除链上的规则
iptables -D

#删除某个规则
#查看规则号码
iptables -nL --line-numbers
#删除指定链上的指定序号
iptables -D INPUT 1

#网络连接状态
#NEW:已经或将启动新的连接
#ESTABLISHED:已建立的连接
#RELATED:正在启动的新连接
#INVALID:非法或无法识别的

iptables实战

  1. 从上往下依次匹配
  2. 一但匹配上,就不在往下匹配了
  3. 默认的情况,默认规则是放行所有

禁止某个端口访问

规则解释

  • -p : 指定过滤的协议-p(tcp,udp,icmp,all)
  • --dport : 指定目标端口(用户请求的端口)
  • -j : 对规则的具体处理方法(ACCEPT,DROP,REJECT,SNAT/DNAT)
  • --sport : 指定源端口
#禁止所有地址访问22端口
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP

禁止某个IP访问

规则解释

  • -s : 指定源地址或网段(192.168.1.0/24)
  • ! -s : 取反指定源地址或网段(192.168.1.0/24)
  • -d : 指定目的地址(nat表prerouting)
  • -i : 进入的网络接口(eth0,eth1)
  • -o : 出去的网络接口(eth0,eth1)
#禁止10.0.0.71访问
iptables -I INPUT -p tcp -s 10.0.0.71 -i eth0 -j DROP
#禁止除10.0.0.71访问
iptables -A INPUT -p tcp ! -s 10.0.0.71 -i eth0 -j DROP
#禁止除10.0.0.0/24访问
iptables -A INPUT -p tcp ! -s 10.0.0.0/24 -i eth0 -j DROP

匹配端口范围

#禁用21,22,23,24端口,使用该方式配置需要添加-m multiport参数
iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j DROP
#放行3306-8809端口
iptables -I INPUT -p tcp --dport 3306:8809 -j ACCEPT
#禁用18-80端口
iptables -I INPUT -p tcp --dport 18:80 -j DROP

匹配ICMP类型

#禁用icmp类型为8(禁用ping)
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP
iptables -A FORWARD -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT

iptables企业案例

部署一个安全的防火墙

默认全部禁止,放行个别请求,即使用白名单

  • 特别注意:如果你的默认规则设置了拒绝所有,又执行了iptables -F,那就意味着所有的请求全部都拒绝了,原因是-F不会改变默认规则
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.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 -nL

局域网共享上网

web01服务器通过防火墙服务器访问外网

  • -t nat : NAT表
  • -A POSTROUTING : POSTROUTING链
  • -s 172.16.1.0/24 : 源地址172.16.1.0/24
  • -j SNAT : SNAT改写源地址
  • --to-source 10.0.0.81 : 将源地址改写成10.0.0.81
#防火墙服务器
#设置转发规则
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.81
#设置允许内核转发
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
#使配置生效
sysctl -p

web01服务器配置

#内网网卡设置网关
#将网关设置为10.0.0.81服务器

vi /etc/sysconfig/network-scripts/ifcfg-eth1

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=172.16.1.7
PREFIX=24
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth1
DEVICE=eth1
ONBOOT=yes
AUTOCONNECT_PRIORITY=-999
#添加网关指向防火墙服务器
GATEWAY=10.0.0.81

#重启网卡查看路由情况
systemctl restart network
route -n

DNS解析

  • 如果访问域名会提示Name or service not known,需要在/etc/resolv.conf配置dns信息
vi /etc/resolv.conf

# Generated by NetworkManager
nameserver 114.114.114.114

FORWARD链默认为DROP的时候共享上网失效

  1. 添加2条放行规则
iptables -A FORWARD -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -d 172.16.1.0/24 -j ACCEPT
  1. 修改FORWARD链默认规则为ACCEPT
iptables -P FORWARD ACCEPT

端口映射

访问10.0.0.61的9000端口,跳转到172.16.1.7的22端口,改写数据包的目标IP和端口,用到的是PREROUTING链

#访问10.0.0.61的9000端口,跳转到172.16.1.7的22端口
iptables -t nat -A PREROUTING -d 10.0.0.81 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22

命令解释

  • nat : 表
  • PREROUTING : 链
  • 10.0.0.81 : 请求IP
  • 9000 : 请求端口
  • tcp : 协议
  • DNAT : 动作
  • 172.16.1.7 : 目标IP
  • 22 : 目标端口

IP映射

访问10.0.0.82,跳转到172.16.1.7

#没有多余的ip所以添加一个ip
ip a add 10.0.0.82/24 dev eth0 label eth0:0
#设置映射
iptables -t nat -A PREROUTING -d 10.0.0.62 -j DNAT --to-destination 172.16.1.7

iptables规则保存

重启iptables默认读取/etc/sysconfig/iptables文件中的配置,可以将配置写入该文件

  • iptables-save : 查看防火墙配置
  • iptables-save > iptables_20200615 : 将防火墙规则保存到文件中
  • iptables-restore < iptables_20200615 : 从配置文件里载入防火墙配置
  • iptables-save > /etc/sysconfig/iptables : 将防火墙规则保存到默认配置文件中(注意备份)