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