iptables

1. 防火墙种类及使用说明

  • 硬件
  • 华为
  • 华三
  • 深信服
  • 软件
  • iptables
  • firewalld
  • 云防火墙
  • 阿里云:安全组(默认的是白名单,防火墙规则是拒绝)

2. 必须熟悉的名词

  • 容器:瓶子 存放东西
  • 表(table):存放链的容器
  • 链(chain):存放规则的容器
  • 规则(poliy) :准许或拒绝规则 ACCEPT DROP

3. iptables执行过程

工作流程

  1. 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下从前到后进行过滤的。
  2. 如果​匹配​上规则,明确表示是**​阻止还是通过,数据包就不再向下匹配新的规则​**。
  3. 如果规则中没有明确表明是阻止还是允许的,也就是没有匹配规则,向下进行匹配,知道匹配默认规则得到明确的阻止还是通过。
  4. 防火墙的默认规则是所有规则执行完成后才执行的。

iptables 防火墙_端口映射

4. 表与链

  • 表:
  • filter(默认,防火墙允许,拒绝)
  • nat表 nat地址映射
  • 内网服务器上外网(共享上网)
  • 端口映射

4.1 filter表

chain

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

INPUT

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

FORWARD

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

OUTPUT

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

4.2 NAT表

chain

负责网络地址转换,即来源于目的ip地址和port的转换

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

工作场景:

G1.用户企业路由(zebra)或网关(iptables),共享上网(POSTROUTING)>

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

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

OUTPUT

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

PREROUTING

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

就是收到信时,根据规则重写收件人的地址

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

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

POSTROUTING

一般情况下,POSTROUTING应用在普通的NAT中(也就是SNAT)

[外链图片存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jJWVaSKC-1597582900345)(F:\Linux\老男孩文档\image\image-20200814162947022.png)]

4 环境准备及命令

iptables iptabls启动或关闭命令

yum -y install iptables-services
[root@localhost ~]# rpm -ql iptables-services
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables
/usr/lib/systemd/system/ip6tables.service
/usr/lib/systemd/system/iptables.service #防火墙配置文件
/usr/libexec/iptables/ip6tables.init
/usr/libexec/iptables/iptables.init #防火墙配置文件(命令)

#防火墙相关模块 加载到内核中
#加载到防火前的内核模块
临时生效
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state

永久生效
vim /etc/rc.local
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state

[root@localhost ~]# lsmod | egrep 'filter|nat|ipt'
nf_nat_ftp 12770 0
nf_conntrack_ftp 18638 1 nf_nat_ftp
xt_nat 12681 36
br_netfilter 22256 0
iptable_mangle 12695 1
ipt_MASQUERADE 12678 9
nf_nat_masquerade_ipv4 13412 1 ipt_MASQUERADE
iptable_nat 12875 9
nf_nat_ipv4 14115 1 iptable_nat
nf_nat 26787 4 nf_nat_ftp,nf_nat_ipv4,xt_nat,nf_nat_masquerade_ipv4
nf_conntrack 133095 8 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ftp,nf_conntrack_ipv4
ipt_REJECT 12541 2
nf_reject_ipv4 13373 1 ipt_REJECT
bridge 151336 1 br_netfilter
ebtable_filter 12827 0
ebtables 35009 1 ebtable_filter

ip6table_filter 12815 0
ip6_tables 26912 1 ip6table_filter
iptable_filter 12810 1
ip_tables 27126 3 iptable_filter,iptable_mangle,iptable_nat
libcrc32c 12644 3 xfs,nf_nat,nf_conntrack

systemctl stop firewalld && systemctl disable firewalld

4.1 iptables 命令参数

参数

含义

-L

显示表中所有规则

–line-numbers 显示行号

-n

不要把端口或IP反向解析为名字

-t

指定表

-A

append追加 准许

-D

delete删除

-l

insert 在最前面添加规则

参数

含义

-p

protocal协议 tcp/udp/icmp/all

–dport

目标端口

–sport

源端口

-s

–source 源ip

-d

–destination 目标ip

-m

指定模块

!

取反

-i 网卡名称

–input 匹配从这块网卡流入的数据

-o 网卡名称

–output 匹配从这块网卡流出的数据

参数

含义

-j

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

处理动作在iptables中被称为target(这样说并不准确,我们暂且这样称呼),动作也可以分为基本动作和扩展动作。

-j 处理动作

  • ACCEPT​:允许数据包通过。
  • DROP​:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
  • REJECT​:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
  • SNAT​:源地址转换,解决内网用户用同一个公网地址上网的问题。
  • MASQUERADE​:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
  • DNAT​:目标地址转换。
  • REDIRECT​:在本机做端口映射。
  • LOG​:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。

参数

含义

-F,–flush

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

-X

删除用户自定义链

-Z

[root@localhost ~]# 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

5. 配置filter表规则

5.1 禁止访问22端口

[root@localhost ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP

iptables 防火墙_端口映射_02

5.2 禁止某个ip地址访问22端口

[root@localhost ~]# iptables -t filter -A INPUT -s 192.168.1.1/32 -p tcp --dport 22 -j DROP

5.3 删除一个规则

-D 删除

[root@localhost ~]# iptables -t filter -D INPUT 1

5.4 只允许10.1.1.0网段访问 (白名单)

! 取反

[root@localhost ~]# iptables -I INPUT ! -s 10.1.1.0/24 -j DROP

5.5 指定多个端口

只允许访问1024-65534之间的端口

[root@localhost ~]# iptables -A INPUT  -p tcp ! --dport 1024:65535 -j DROP

只允许访问本机100和200端口

防火墙默认不支持多个独立的端口,需要添加模块 -m multipotrt

[root@localhost ~]# iptables -A INPUT   -p tcp -m multiport ! --dport 100,200 -j DROP

5.6 匹配ICMP类型

  • ping

  • tracert (路由跟踪)

  • ICMP​(Internet Control Message Protocol) internet控制报文协议

通过内核参数控制禁止被ping

[root@localhost ~]#  echo "net.ipv4.icmp_echo_ignore_all = 1" >>/etc/sysctl.conf 
[root@localhost ~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 1
[root@localhost ~]#

通过防火墙规则 控制禁ping

[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type any -j DROP
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP

iptables 防火墙_共享上网_03

5.7 匹配网络状态(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

5.8 限制并发及速率

iptables -I INPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT

5.9 防火墙规则保护与恢复

# 当前正在使用的防火墙规则输出
iptables-slave
# 将输出结果保存到iptables配置文件中 实现永久保存
iptables-slave > /etc/sysconfig/iptables
或者使用 service iptables save

iptables 防火墙_linux_04

演示恢复规则
iptables -F
恢复:前提已经将规则保存到/etc/sysconfig/iptables中
重新启动iptables恢复
systemctl restart iptables

iptables-restart

5.10 实际生产用法

1、首先允许外部访问本机22端口

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

iptables 防火墙_服务器_05

2、设置允许本机地址通讯规则**

这两条策略会使iptables允许由服务器本身请求的数据通过。

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables 防火墙_linux_06

3、更改完之后将filter链默认改为DROP

[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -P OUTPUT ACCEPT
[root@localhost ~]# iptables -P FORWARD DROP

iptables 防火墙_linux_07

4、设置允许规则

iptables -A INPUT -s 192.168.154.0/24 -j ACCEPT
iptables -A INPUT -p tcp -m multiport -dport 80,443 -j ACCEPT
.............

注意:设置完规则切记保存 iptables-slave > /etc/sysconfig/iptables

6. NAT

nat表案例

共享上网(没有公网ip的服务器上网)

端口映射(转发)

ip映射

参数

说明

–to-source

一般用于SNAT 将指定地址段转法时转换为–to-source地址

–to-destination

一般用于DNAT端口映射。

6.0 环境设置

iptables -F
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

6.1 实现共享上网

iptables 防火墙_端口映射_08

1、公网IP固定地址

#将源地址172.16.20.0/24访问互联网 转换为225.225.225.9访问互联网
iptables -t nat -A POSTROUTING -s 172.16.20.0/24 -j SNAT --to-source 225.225.225.9

注意:FOWRARD、INPUT 默认拒绝的情况下使用

#允许172.16.20.0/24被转发
iptables -A FORWARD -d 172.16.20.0/24 -j ACCEPT
iptables -A FORWARD -s 172.16.20.0/24 -j ACCEPT

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

2、公网IP不固定:更换

# 将源地址172.16.20.0/244访问互联网从MASQUERADE出去
iptables -t nat -A POSTROUTING -s 172.16.20.0/24 -j MASQUERADE

注意:FOWRARD 默认拒绝的情况下使用
iptables -A FORWARD -d 172.16.20.0/24 -j ACCEPT
iptables -A FORWARD -s 172.16.20.0/24 -j ACCEPT

3、开启FORWARD发内核

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 
sysctl -p

客户机配置

# 将设备网关指向防火墙互联接口ip地址

4.2 实现端口转发

iptables 防火墙_端口映射_09

端口

# 将225.225.225.9:8888转发到172.16.20.80:80
iptables -t nat -A PREROUTING -d 225.225.225.9 -p tcp --dport 8888 -j DNAT --to-destination 172.16.20.80:80
# 设置SNAT地址转换
iptables -t nat -A POSTROUTING -j MASQUERADE

IP级别一对一映射

创建虚拟IP
ip addr add 192.168.154.128/24 dev ens33 label ens33:0
iptables -t nat -A PREROUTING -d 192.168.154.128 -j DNAT --to-destination 172.16.20.80