iptables 防火墙

Linux System Environment

[root@mn01 ~]# cat /etc/redhat-release                     #==》系统版本
CentOS release 6.7 (Final)
[root@mn01 ~]# uname –r                                   #==》内核版本
3.10.0-862.el7.x86_64
[root@mn01 ~]# uname -m                                    #==》系统架构
x86_64
[root@mn01 ~]# echo $LANG                                  #==》系统字符集
En_US.UTF-8
[root@mn01 ~]# iptables –V                                #==》iptables版本
iptables v1.4.21

iptables简介

iptables是Linux系统自带的采用数据包过滤机制的开源防火墙,以此过滤主机网络与外部主机网络之间的数据包,达到一种比较安全的控制。CentOS 6.9以前的版本(包括CentOS 6.9版本)系统自带的是iptables防火墙,而CentOS 7.0以后的版本,使用的是firewalld防火墙,iptables和firewalld两者区别不大,iptables在CentOS 7以后的任何版本都可以使用,底层都是调用的命令仍然是iptalbes,本教程以iptables防火墙为主进行讲解。

iptables生产应用场景

1、服务器防火墙功能(主要使用filter表控制),适用IDC机房具备有外网IP的服务器。
2、局域网共享上网(主要使用nat表的POSTROUTING规则控制),适用做企业局域网nat转发上网以及IDC机房内的nat转发上网。
3、局域网端口映射(主要使用nat表的PREROUTING规则控制),适用做企业局域网端口映射到外网端口。
4、局域网IP映射(主要使用nat表的PREROUTING规则控制),适用于企业局域网指定的某一个IP映射到指定的外网IP。

iptables名词和术语
标注:iptables名词和术语用一句话记住:iptables(Netfiter)是一个装了四表五链多规则的大容器

1、什么是容器?
容器是指定用来装东西的器具。

2、什么是iptables(Netfilter)?
Netfilter是表(tables)容器,iptables和Netfilter是相同意思。

3、什么是表(tables)?
表(tables)是链的容器,即所有的链(chains)都属于其对应的表(tables),表包含有四种表Filter表、Nat表、Mangle表、Raw表。

4、什么是链(chains)?
链是规则的容器,链包含有五种:INPUT链、OUTPUT链、FORWARD链、PREROUTING链、POSTROUTING链。

5、什么是规则(rules)?
规则就是在iptables里设置的一条条命令的规则,例如 : iptables -A INPUT –p  tcp –dport 3306 –j  DROP

iptables防火墙表(tables)和链(chains)关系图

iptables防火墙五种链的作用
标注:所有的链名称者要大写

INPUT链            #==》负责过滤所有目标地址是本机地址的数据包,通俗的讲,就是过滤进入主机的数据包。
FORWARD链          #==》负责转发流经主机的数据包,起转发的作用。
OUTPUT链           #==》处理所有源地址是本机地址的数据包,通俗的讲,就是处理从主机发出去的数据包。
PREROUTING链       #==》在数据包到达防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等。
POSTROUTING链      #==》在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址、源端口等。

iptables工作原理图

Iptables注意事项

1、链名称要大写
2、iptables是层层过滤,实际是按照配置规则顺序从上到下,从前到后过滤
3、如果所有规则没有明确表明是阻止还是通过,也没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
4、防火墙默认规则是对应链的所有规则执行完才会执行的。

Iptables防火墙规则永久保存
标注:重启系统后iptables规则会自动清失

#==》永久保存iptables
[root@rsync ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

#==》iptables防火墙配置规则文件
[root@rsync ~]# ls -l /etc/sysconfig/iptables
-rw------- 1 root root 452 Sep  2 17:48 /etc/sysconfig/iptables

iptables命令参数

-V                  #==》查看iptables版本
-L                  #==》列表显示所有的链
-n                  #==》以数字形式显示IP和端口
-t                  #==》指定表,默认指定filter表
-F                  #==》清除所有的规则,不会处理默认的规则
-X                  #==》删除用户自定义的链
-D                  #==》删除链上的规则
-Z                  #==》链的计数器清零(数据包计数器与数据包字节计数器)
-A                  #==》把规则添加到指定的链上,默认添加到最后一行
-I                  #==》把规则添加到指定的链上,默认添加到第一行
-s                  #==》指定源地址或网段,前面加!感叹号表示取反
-d                  #==》指定目的地址
-i                  #==》指定进入的网络接口(eth0/eth1等)
-o                  #==》指定出去的网络接口(eth0/eth1等)
-j                  #==》对规则的具体处理方法(ACCEPT/DROP/REJECT/SNAT/DNAT)
-p                  #==》指定过滤的协议,例如tcp/udp/icmp等协议
- - dport           #==》指定目标端口
- - sport           #==》指定源端口
- - line-number     #==》显示链上规则的号码

一、安装iptables
标注:本教程系统是CentOS 7.5版本默认安装了firewalld防火墙,但没有安装iptables防火墙

1、配置阿里云yum源

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum makecache

2、yum安装iptables

[root@m01 ~]# yum -y install iptables-services
[root@m01 ~]# rpm -qa iptables
iptables-1.4.21-28.el7.x86_64

3、加载防火墙内核模块并检查

#==》加载防火墙内核模块
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state

#==》检查加载情况
[root@m01 ~]# lsmod | egrep 'filter|nat|ipt'

4、关闭firewalld防火墙

[root@m01 ~]# systemctl stop firewalld
[root@m01 ~]# systemctl disable firewalld
[root@m01 ~]# systemctl status firewalld

5、启动iptables防火墙并设置开机自启动

[root@m01 ~]# systemctl start iptables.service
[root@m01 ~]# systemctl enable iptables.service
[root@m01 ~]# systemctl status iptables.service

二、iptables基本操作

1、查看防火墙规则

#==》默认查看的是filter表
[root@mn01 ~]# iptables -L -n
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   
target     prot opt source               destination   
   
#==》指定查看nat表   
[root@mn01 ~]# iptables -L -n -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  

2、清除防火墙规则

[root@mn01 ~]# iptables –F          #==》清除所有规则,不会处理默认的规则
[root@mn01 ~]# iptables –X          #==》删除用户自定义的链
[root@mn01 ~]# iptables –Z          #==》链的计数器清零

3、添加防火墙规则

[root@mn01 ~]# iptables -t filter -A INPUT -p tcp --dport 555 -j DROP
[root@mn01 ~]# iptables -t filter -A INPUT -p tcp --dport 666 -j DROP

4、删除指定的规则

[root@mn01 ~]# iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:555
2    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:666
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination    
     
[root@mn01 ~]# iptables -t filter -D INPUT 2

[root@mn01 ~]# iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:555
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination    

三、iptables实战

1、禁用某个端口访问

iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
规则拆分说明

-t filter       #==》指定表,默认指定是filter表
-A INPUT        #==》把规则添加到指定的链上,默认添加到最后一行
-p tcp          #==》指定协议
- - dropt 22    #==》指定目标端口
-j DROP         #==》对规则的具体处理方法(ACCEPT/DROP/REJECT/SNAT/DNAT)

2、禁用连续或指定多个的端口范围

iptables -t filter -A INPUT -p tcp --dport 20:30 -j DROP
iptables -t filter -A INPUT -p tcp -m multiport --dport 20,21,22,23 -j DROP
规则拆分说明
-t filter       #==》指定表,默认指定是filter表
-A INPUT        #==》把规则添加到指定的链上,默认添加到最后一行
-p tcp          #==》指定协议
-m multiport    #==》指定多个端口
- - dropt 22    #==》指定目标端口
-j DROP         #==》对规则的具体处理方法(ACCEPT/DROP/REJECT/SNAT/DNAT)

3、禁用某个IP或网段访问

iptables -t filter -A INPUT -p tcp -s 10.0.0.100 -j DROP
iptables -t filter -A INPUT -p tcp ! -s 10.0.0.100 -j DROP
iptables -t filter -A INPUT -p tcp -i eth0 -s 10.0.0.100 -j DROP
iptables -t filter -A INPUT -p tcp -i eth0 -s 10.0.0.0/24 -j DROP
规则拆分说明

-t filter           #==》指定表,默认指定是filter表
-A INPUT            #==》把规则添加到指定的链上,默认添加到最后一行
-p tcp              #==》指定协议
-i eth0             #==》指定网络接口
-s  10.0.0.100      #==》指定源IP地址10.0.0.100
! – s 10.0.0.100    #==》排除源IP地址 10.0.0.100的除外的所有IP地址
-j DROP             #==》对规则的具体处理方法(ACCEPT/DROP/REJECT/SNAT/DNAT)

4、禁用某个协议(禁用icmp协议)

iptables -t filter -I INPUT -p icmp --icmp-type 8 -i eth0 -s 10.0.0.100 -j DROP
iptables -t filter -A INPUT -p tcp -s 10.0.0.100 -j DROP
iptables -t filter -A INPUT ! -p udp -s 10.0.0.100 -j DROP
规则拆分说明

-t filter           #==》指定表,默认指定是filter表
-A INPUT            #==》把规则添加到指定的链上,默认添加到最后一行
-p icmp             #==》指定协议
--icmp-type 8       #==》指定icmp的类型大小
-i eth0             #==》指定网络接口
-s  10.0.0.100      #==》指定源IP地址10.0.0.100
-j DROP             #==》对规则的具体处理方法(ACCEPT/DROP/REJECT/SNAT/DNAT)

5、禁用指定的网络连接状态

Iptables –t filter -A INPUT -m state --state ESTABLISHED -j DROP
规则拆分说明

-t filter           #==》指定表,默认指定是filter表
-A INPUT            #==》把规则添加到指定的链上,默认添加到最后一行
-m state            #==》匹配网络连接状态
- - state           #==》指定匹配的网络连接状态类型
-j DROP             #==》对规则的具体处理方法(ACCEPT/DROP/REJECT/SNAT/DNAT)

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

三、iptables部署相对安全的防火墙方案(应用之一)

2种思路:
1、设置白名单列表,默认规则设置不允许状态。(本教程使用此方法演示)
2、设置黑名单列表,默认规则设置允许状态。

1、清空防火墙规则

[root@test ~]# iptables -F
[root@test ~]# iptables -X
[root@test ~]# iptables -Z

2、设置白名单列表

[root@mn01 ~]# iptables -t filter -A INPUT -p all -s 10.0.0.0/24 -j ACCEPT
[root@mn01 ~]# iptables -t filter -A INPUT -p all -s 10.34.23.165/27 -j ACCEPT
[root@mn01 ~]# iptables -t filter -A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT
[root@mn01 ~]# iptables -t filter -A INPUT -i lo -j ACCEPT

3、设置默认规则为不允许

[root@mn01 ~]# iptables -t filter -P INPUT DROP
[root@mn01 ~]# iptables -t filter -P OUTPUT ACCEPT
[root@mn01 ~]# iptables -t filter -P FORWARD DROP

4、查看iptables规则

[root@mn01 ~]# iptables -L -n
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0           
ACCEPT     all  --  10.34.23.160/27      0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 22,80,443
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

四、iptables局域网共享上网(应用之二)

1、内部服务器网卡设置

[root@test ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
IPADDR=172.16.1.100
NETMASK=255.255.255.0
GATEWAY=172.16.1.60
ONBOOT=yes

2、iptables route服务器网卡设置

#==》eth0 网卡
[root@mn01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
IPADDR=10.0.0.60
NETMASK=255.255.255.0
GATEWAY=10.0.0.2
DNS1=223.6.6.6
ONBOOT=yes

#==》eth1 网卡
[root@mn01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=static
NAME=eth1
DEVICE=eth1
IPADDR=172.16.1.60
NETMASK=255.255.255.0
ONBOOT=yes

3、iptables route服务器加载iptables内核模块

#==》iptables加载内核模块
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state

#==》查看内核加载情况
[root@mn01 ~]# lsmod | egrep 'filter|nat|ipt'
nf_nat_ftp             12770  0 
nf_conntrack_ftp       18638  1 nf_nat_ftp
iptable_nat            12875  0 
nf_nat_ipv4            14115  1 iptable_nat
nf_nat                 26787  2 nf_nat_ftp,nf_nat_ipv4
ipt_REJECT             12541  0 
nf_reject_ipv4         13373  1 ipt_REJECT
nf_conntrack          133053  7 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,xt_conntrack,nf_conntrack_ftp,nf_conntrack_ipv4
iptable_filter         12810  0 
ip_tables              27126  2 iptable_filter,iptable_nat
libcrc32c              12644  3 xfs,nf_nat,nf_conntrack

4、开启iptables防火墙filter表FORWARD链允许转发功能

[root@mn01 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@mn01 ~]# tail -1 /etc/sysctl.conf 
net.ipv4.ip_forward = 1

5、关掉iptables防火墙filter功能或设置全允许,否则影响到测试

[root@mn01 ~]# systemctl stop iptables.service

6、设置局域网共享上网规则(nat表)
标注:设置局域网共享上网规则有两种方法

#==》适合于有固定IP的外网地址(带固定IP的光纤)
[root@mn01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.60
[root@mn01 ~]# iptables -L -n -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         
SNAT       all  --  172.16.1.0/24        0.0.0.0/0            to:10.0.0.60

#==》适合动态IP地址的外网地址(ADSL)
[root@mn01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
[root@mn01 ~]# iptables -L -n -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         
MASQUERADE  all  --  172.16.1.0/24        0.0.0.0/0        

7、内部服务器测试

[root@mn01 ~]# ping -c 3 www.baidu.com
PING www.a.shifen.com (163.177.151.110) 56(84) bytes of data.
64 bytes from 163.177.151.110 (163.177.151.110): icmp_seq=1 ttl=128 time=8.87 ms
64 bytes from 163.177.151.110 (163.177.151.110): icmp_seq=2 ttl=128 time=9.63 ms
64 bytes from 163.177.151.110 (163.177.151.110): icmp_seq=3 ttl=128 time=9.60 ms
--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2007ms
rtt min/avg/max/mdev = 8.877/9.371/9.633/0.367 ms

[root@mn01 ~]# traceroute www.baidu.com
traceroute to www.baidu.com (163.177.151.110), 30 hops max, 60 byte packets
 1  gateway (10.0.0.2)  0.140 ms  0.070 ms  0.080 ms

五、iptables端口映射 (应用之三)

1、设置前测试

[root@master ~]# curl 172.16.1.100
web01
[root@master ~]# curl 10.0.0.60
curl: (7) Failed connect to 10.0.0.60:80; Connection refused

2、设置iptables端口映射服务器

[root@mn01 ~]# iptables -t nat -A PREROUTING -d 10.0.0.60 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.100:80 
[root@mn01 ~]# iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  0.0.0.0/0            10.0.0.60            tcp dpt:80 to:172.16.1.100:80

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         

3、测试

[root@master ~]# curl 172.16.1.100
web01
[root@master ~]# curl 10.0.0.60
web01
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容