iptables

表与链
  • iptables是4表伍链
  • 4表:filter表 nat表 raw表 mangle表
  • 伍链:INPUT OUTPUT FORWARD PREROUTING POSTROUTING
表的说明
filter表
  • 防火墙:屏蔽或准许 端口 ip

filter表

强调:主要和主机自身相关,真正负责主机防火墙功能(过滤流入流出主机的数据包)filter表示iptables默认使用的表,这个表定义了三个链(chains)企业工作场景:主机防火墙

INPUT

负责过滤所有目标地址是本机地址的数据包,通俗来说:就是过滤进入主机的数据包

FORWARD

负责转发刘静主机的数据包。起转发的作用,和NAT关系很大,后面会详细介绍LVS NAT模式,net.ipv4.ip_forward=0

OUTPUT

处理所有源地址是本机地址的数据包,通俗来讲:就是处理从主机发出的数据包。

nat表
  • 实现nat功能
  • 实现共享上网(内网服务器上外网)
  • 端口映射和ip映射

nat

负责网络地址转换的,即来源与目的IP地址和port的转换。

应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换服务相关。

工作场景:

1. 用于企业路由(zebra)或网关(iptables),共享上网(POSTROUTING)

2. 做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,ftp服务(PREROUTING)

3. WEB,单个端口的映射,直接映射80端口(PREOUTING)这个表定义了3个链,nat功能相当于网络的acl控制。和网络交换机acl类似。

OUTPUT

和主机放出去的数据包有关,改变主机发出数据包的目的地址。

PREROUTING

在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等

例如:把公网IP:XXX.XXX.XXX.XXX映射到局域网的XX.XX.XX.XX服务器上。

如果是web服务,可以将80转换为局域网的服务器9000端口上

POSTROUTING

在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址,源端口等。

例如:默认笔记本和虚拟机都是局域网地址,在出网的时候被路由器将源地址改为了公网地址。

生产应用:局域网共享上网。

环境准备及命令
iptables 服务安装,环境配置
# 安装服务
yum install -y iptables-servicesR

# 加载防火墙相关模块到内核中
cat >>/etc/rc.local<<EOF 
modprobe ip_tables 
modprobe iptable_filter 
modprobe iptable_nat 
modprobe ip_conntrack 
modprobe ip_conntrack_ftp 
modprobe ip_nat_ftp 
modprobe ipt_state 
EOF

# 关闭系统自带的firewalld防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service

# 启动iptables,并添加开机自动启
systemctl start iptables.service
systemctl enable iptables.service

## 查看
 lsmod |egrep 'filter|nat|ipt'
iptable_filter         12810  1 
xt_nat                 12681  1 
iptable_nat            12875  1 
nf_nat_ipv4            14115  1 iptable_nat
nf_nat                 26787  2 nf_nat_ipv4,xt_nat
nf_conntrack          133053  4 nf_nat,nf_nat_ipv4,xt_conntrack,nf_conntrack_ipv4
ip_tables              27126  2 iptable_filter,iptable_nat
libcrc32c              12644  3 xfs,nf_nat,nf_conntrack
3.2 iptables 相关命令
# 查看iptables规则
iptables -nL

参数

含义

-L

显示表中的所有规则

-n

不要把端口或ip反向解析为服务名或域名

-t

指定表 不指定时默认是filter表

-A

append追加 加入准许类规则 使用-A

-D

delete 删除 -D INPUT 1

-I

insert 拒绝类规则放在所有规则最上面 拒绝类 -I

参数

含义

-p

协议protocal tcp/udp/icmp/all

–dport

目标端口 dest destination 指定端口 加上协议-p tcp

–sport

源端口 source源

-s

–source 源ip

-d

–destination 目标ip

-m

指定模块 multiport

-i

input 输入的时候 从哪个网卡进来

-o

output输出的时候 从哪个网卡出去

参数

含义

-j

满足条件后的动作:DROP/ACCEPT/REJECT

DROP REJECT 拒绝

DROP 把数据丢掉 不会返回信息给 用户

REJECT 拒绝 返回拒绝信息

参数

含义

-F

清除所有规则,不会处理默认的规则

-X

删除用户自定义的链

-Z

链的计数器清零 (数据包计数器与数据包字节计数器)

配置filter表规则
  • 正式配置之前先清空规则
iptables -F
iptables -X
iptables -Z
禁止访问22端口
iptables -t filter -I INPUT -p tcp --dport 22 -j DROP
显示规则编号
iptables -nL --lint-number
删除第1编号的规则
iptables -D INPUT 1   # 精确删除规则,可以用此方法
封ip 屏蔽某个ip(属于源ip)
iptables -I INPUT -s 10.0.0.7 -j DROP
禁止网段连入(禁止10.0.0.0/24网段访问 8888 端口)
iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 8888 -j DROP
只允许指定网段连入(允许10.0.0.0网段)
# 方法1:利用 ! 
# 只准许 10.0.0.0/24 访问,除了10.0.0.0/24  都拒绝
iptables -I INPUT ! -s 10.0.0.0/24 -j DROP

# 方法2: 修改链默认规则 修改为拒绝  添加准许
# 先配置准许规则,再修改默认规则,不然会将自己屏蔽
iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
iptables -P INPUT DROP

# 将默认规则改回允许
iptables -P INPUT ACCEPT
指定多个端口拒绝访问(拒绝8888 9999)
iptables -I INPUT -P tcp --dport 8888 -j DROP
iptables -I INPUT -p tco --dport 9999 -j DROP
同时指定多个端口拒绝访问(拒绝80和443)
iptables -I INPUT -p tcp -m multiport 80,443 -j DROP
同时指定连续端口拒绝访问(1到1024)
# 如果是连续端口,可以不加-m multiport
iptables -I INPUT -p tcp --dport 1:1024 -j DROP
匹配ICMP类型
  • ICMP (Internet Control Message Protocol) Internet控制报文协议 ping
  • 整个网站的核心部分可以拒绝ping
通过防火墙规则,控制禁止被ping
iptables -I INPUT -p icmp --icmp-type 8 -j DROP
通过内核参数,控制禁止被ping
# 修改为1,禁止被ping;修改为0,允许被ping
[root@m01 ~]# cat /etc/sysctl.conf 
#/proc/sys/net/ipv4/icmp_echo_ignore_all
net.ipv4.icmp_echo_ignore_all = 1

# sysctl -p 生效
[root@m01 ~]# sysctl -p   
net.ipv4.icmp_echo_ignore_all = 1
匹配网络状态(TCP/IP连接状态)
  • -m state --state
    NEW:已经或将启动新的连接
    ESTABLISHED:已建立的连接
    RELATED:正在启动的新连接
    INVALID:非法或无法识别的
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
限制并发及速率
  • -m limit 限制模块
# 前5个正常,之后按每6秒的速度生成数据包,--limit-burst后不接数字时默认为5
iptables -I INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
iptables -A INPUT -p tcp --dport -j ACCEPT
iptables -P INPUT DROP
防火墙规则的保存于恢复
  • iptables-save 默认输出到屏幕,后接文件可备份规则到文件
  • iptables-restore 后接文件标准输入 可恢复规则
# 写入到/etc/sysconfig/iptables
ptables-save >/etc/sysconfig/iptables
# 从备份文件恢复规则
iptables-restore </etc/sysconfig/iptables
# systemctl restart iptables 时将默认从/etc/sysconfig/iptables读取配置,如果手动用iptables-restore恢复可以指定任意备份文件
实际生产用法
# 允许22端口访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许本机回环lo接口数据流量流出与流入
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 放行80  443端口
iptables -A INPUT -m multiport -p tcp --dport 443,80 -j ACCEPT

# 配置默认规则
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 允许需要的网段访问,包括VPN网段
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 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 

# 配置完成后保存配置
iptables-save >/root/online.iptables
nat
  • 共享上网
  • 端口转发/端口映射
  • ip映射
查看nat表
iptables -t nat -nL
共享上网
# 修改的是POSTROUTING链      源ip是172.16.1.0/24  经过防火墙处理  修改为10.0.0.61
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61

# 修改eth0,将ONBOOT=yes改为NOBOOT=no

# 修改eth1,增加GATEWEY=172.16.1.61;增加DNS1=223.5.5.5

#重启网卡

# 修改/etc/sysctl.conf
net.ipv4.ip_forward = 1

# 重新载入sysctl变量
sysctl -p
端口映射
# 将10.0.0.61的9000 转发为 172.16.1.7:22
iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22

# 测试 [d:\~]$ ssh root@10.0.0.61 9000 相当于ssh root@172.16.1.7 22
ip映射
# 将10.0.0.62 映射为 172.16.1.7
iptables -t nat -A PREROUTING -d 10.0.0.62 -j DNAT --to-destination 172.16.1.7