查看当前selinux的状态

[root@apenglinux-001 ~]# getenforce

临时关闭selinux

[root@apenglinux-001 ~]# setenforce 0

永久关闭selinux

[root@apenglinux-001 ~]# vim /etc/selinux/config  
 将SELINUX=enforcing 改成 SELINUX=disabled
 重启系统

关闭firewalld,开启iptables

#systemctl stop firewalld.service
#systemctl disable firewalld.service
#yum install -y iptables-services
#systemctl enable iptables.service
#systemctl start iptables.service

iptables规则

-A 在指定链的末尾添加(--append)一条新的规则
-D 删除(--delete)指定链中的某一条规则,按规则序号或内容确定要删除的规则
-I 在指定链中插入(--insert)一条新的规则,若未指定插入位置,则默认在链的开关插入
-R 修改,替换(--replace)一条新的规则,按规则序号或内容确定要替换的规则
-L 列出(--list)指定链中所有的规则进行查看,若未指定链名,则列出表中所有链的内容
-F 清空(--flush)指定链中的规则,若未指定链名,则清空表中所有链的内容
-N 新建(--new-chain)一条用户自己定义的规则链
-X 删除指定表中用户自定义的规则链(--delete-chain)
-P 设置指定链的默认策略(--policy)
-n 使用数字形式(--numeric)显示输出结果,如显示主机的ip地址而不是主机名
-v 查看规则列表时显示详细(--verbose)信息
-V 查看iptables命令工具的版本(--version)信息
-h 查看命令帮助信息(--help)
--line-numbers 查看规则列表时,同时显示规则在链中的顺序号
-Z 表示把包以及流量计数器置零

规则表

filter表,包含三个规则链:INPUT,FORWARD,OUTPUT。
    filter表主要用于对数据包进行过滤,根据具体的规决定是否放行该数据包
nat表,包含三个规则链:PREROUTING,POSTROUTING,OUTPUT.
    nat表主要用于修改数据包的ip地址、端口号等信息
mangle表,包含五个规则链:PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD.
    mangle表主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)值以及数据包设置Mark标记,实现Qos(Quality of Service,质量服务)调整以及策略路由等应用
raw表,包含两条规则链:OUTPUT,PREROUTING.
    raw表主要用于决定数据包是否被状态跟踪机制处理。
security表

netfilter的五个链

PREROUTING: 数据包进入路由表之前
INPUT: 通过路由表目的地为本机
FORWARD: 通过路由表后,目的地不为本机
OUTPUT: 由本机产生,向外转发
POSTROUTING: 发送到网卡接口之前

查看filter表中各链的规则

[root@apenglinux-001 ~]# iptables -t filter -nvL  // [-t filter]可省略
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  369 27373 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
    1    40 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
    5  1145 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 294 packets, 48378 bytes)
 pkts bytes target     prot opt in     out     source               destination

清空filter表中的各链中的规则,然后将清除后的规则保存

#iptables -t filter -F;service iptables save

防火墙规则保存在/etc/sysconfig/iptables

添加及插入规则

在filter表的INPUT链的末尾添加一条防火墙规则

[root@apenglinux-001 ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT

在filter表的INPUT链中插入一条防火墙规则

[root@apenglinux-001 ~]# iptables -I INPUT -p udp -j ACCEPT

在filter表的INPUT链中插入一条防火墙规则作为链中的第二条规则

[root@apenglinux-001 ~]# iptables -t filter -I INPUT 2 -p icmp -j ACCEPT

查看规则列表 

查看filter表INPUT链中的所有规则,同时显示各规则的顺序号

[root@apenglinux-001 ~]# iptables -t filter -nvL INPUT [#一个数字,表示链中的第几条规则] --line-number

删除、清空规则

删除filter表INPUT链中的第2条规则

[root@apenglinux-001 ~]# iptables -D INPUT 2

清空filter表、nat表、mangle各链中的所有规则

[root@apenglinux-001 ~]# iptables -F;iptables -t nat -F;iptables -t mangle -F

设置规则链的默认策略

将filter表中FORWARD规则链的默认策略设为DROP

[root@apenglinux-001 ~]# iptables -t filter -P FORWARD DROP

将filter表中OUTPUT规则链的默认策略设为ACCEPT

[root@apenglinux-001 ~]# iptables -t filter -P OUTPUT ACCEPT

新增、删除自定义规则链

在raw表中新增一条自定义的规则链,链名为TCP_PACKETS

[root@apenglinux-001 ~]# iptables -t raw -N TCP_PACKETS

清空raw表中用户自定义的所有规则链

[root@apenglinux-001 ~]# iptables -t raw -X

通用条件匹配

协议匹配

[root@apenglinux-001 ~]# iptables -I INPUT -p icmp -j REJECT    //拒绝进入防火墙的所有icmp协议数据包
[root@apenglinux-001 ~]# iptables -I FORWARD ! -p icmp -j ACCEPT //允许防火墙转发除icmp协议以外的所有数据包

地址匹配

拒绝转发来自192.168.1.11主机的数据,允许转发来自192.168.0.0/24网段的数据

[root@apenglinux-001 ~]# iptables -A FORWARD -s 192.168.1.11 -j DROP 
[root@apenglinux-001 ~]# iptables -A FORWARD  -s 192.168.0.0/24 -j ACCEPT

网络接口匹配

丢弃从外网接口ens33进入防火墙本机的源地址为私网地址的数据包

[root@apenglinux-001 ~]# iptables -A INPUT -i ens33 -s 192.168.0.0/16 -j DROP 
[root@apenglinux-001 ~]# iptables -A INPUT -i ens33 -s 172.16.0.0/12 -j DROP 
[root@apenglinux-001 ~]# iptables -A INPUT -i ens33 -s 10.0.0.0/8 -j DROP

管理员在网关服务器上检测到来自某个ip网段(192.168.2.0/24)的频繁扫描,希望设置iptables规则封堵ip地址段,两小时后解封

[root@apenglinux-001 ~]# iptables -I INPUT -s 192.168.2.0/24 -j DROP 
[root@apenglinux-001 ~]# iptables -I FORWARD -s 192.168.2.0/24 -j DROP 
[root@apenglinux-001 ~]# at now +2 hours
at> iptables -D INPUT 1
at> iptables -D FORWARD 1
at> <EOT>
job 4 at Thu Feb 22 16:43:00 2018
[root@apenglinux-001 ~]# atq
4	Thu Feb 22 16:43:00 2018 a root

隐含条件匹配

端口匹配

仅允许系统管理员从192.168.221.0/24网段使用ssh方式远程登录防火墙主机

[root@apenglinux-001 ~]# iptables -A INPUT -p tcp --dport 22 -s 192.168.221.0/24 -j ACCEPT
[root@apenglinux-001 ~]# iptables -A INPUT -p tcp --dport 22 -j DROP

允许本机开放从tcp端口20-1024提供的应用服务

[root@apenglinux-001 ~]# iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT 
[root@apenglinux-001 ~]# iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT

作为网关使用时,允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包

[root@apenglinux-001 ~]# iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT 
[root@apenglinux-001 ~]# iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT

TCP标记匹配

拒绝从外网接口直接访问防火墙本机的数据包

[root@apenglinux-001 ~]# iptables -P INPUT DROP
[root@apenglinux-001 ~]# iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -j REJECT

ICMP类型匹配

禁止其他主机ping防火墙主机,但是允许从防火墙上ping其他主机(允许接收ICMP回应数据)

[root@apenglinux-001 ~]# iptables -A INPUT -p icmp --icmp-type Echo-Request -j DROP
[root@apenglinux-001 ~]# iptables -A INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
[root@apenglinux-001 ~]# iptables -A INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT

显示条件匹配

MAC地址匹配

禁止转发来自MAC地址为00-50-56-c0-00-08的主机的数据包

[root@apenglinux-001 ~]# iptables -A FORWARD -m mac --mac-source 00:50:56:c0:00:08 -j DROP

多端口匹配

允许防火墙本机对外开放tcp端口20、21、25、110以及被动模式ftp端口1250-1280

[root@apenglinux-001 ~]# iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT

多ip地址匹配

禁止转发源ip地址为192.168.1.20-192.168.1.99的tcp数据包

[root@apenglinux-001 ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP

状态匹配

禁止转发与正常TCP连接无关的非--syn请求数据包(如网络中可能存在的一些非法***数据包)

[root@apenglinux-001 ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP

拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包

[root@apenglinux-001 ~]# iptables -A INPUT -p tcp -m state --state NEW -j DROP 
[root@apenglinux-001 ~]# iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

在服务器中设置防火墙策略,只开放本机的web服务80端口、ftp服务(21、20、20450-20480),放行外部主机发往服务器其他端口的应答数据包,将其他入站数据包均予以丢弃处理

[root@apenglinux-001 ~]# iptables -I INPUT -p tcp -m multiport --dport 20,21,80,20450:20480 -j ACCEPT 
[root@apenglinux-001 ~]# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT 
[root@apenglinux-001 ~]# iptables -P INPUT DROP

需求:只针对filter表,预设策略INPUT链DROP,其他两个链ACCEPT,然后对192.168.221.0/24开通22端口,对所有网段开放80端口和21端口(写一个脚本)

[root@apenglinux-001 sbin]# cat iptables.sh 
#!/bin/bash
#

ipt="/usr/sbin/iptables"
$ipt -F
$ipt -P INPUT DROP
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -A INPUT -s 192.168.221.0/24 -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -p tcp -m multiport --dport 80,21 -j ACCEPT
[root@apenglinux-001 sbin]# sh /usr/local/sbin/iptables.sh

开机启动就初始化防火墙规则

#echo '/bin/sh /usr/local/sbin/iptables.sh' >> /etc/rc.d/rc.local
#chmod +x /etc/rc.d/rc.local
#init 6

image.png

需求:A机器有两块网卡ens33,ens37。ens33可以上网,ip地址为192.168.221.10,ens37的ip为192.168.2.100/24。B机器只有一块网卡ens37,ip为192.168.2.200/24,可以ping通A机器的ens37,实现让B机器也能上网?

A机器
 #iptables -F
 #echo 1 > /proc/sys/net/ipv4/ip_forward
 #iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o ens33 -j MASQUERADE
B机器
 #iptables -F
 #route add defaults gw 192.168.2.100

这要就B机器就可以实现上网的功能。

需求:A机器两块网卡ens33,ens37,ens33可以上网,ip为192.168.221.10,ens37的ip为192.168.2.100/24.B机器只有一块网卡,ip为192.168.2.200/24,不能上网,实现B机器能上网且通过A机器可以直接连通B机器的22端口。

A机器
    #echo 1 > /proc/sys/net/ipv4/ip_forward
    #iptables -t nat -A PREROUTING -d 192.168.221.10 -p tcp --dport 100 -j DNAT --to 192.168.2.200:22
    #iptables -t nat -A POSTROUTING -s 192.168.2.200 -j SNAT --to 192.168.221.10
B机器
    #route add default gw 192.168.2.100

导出、导入防火墙规则

iptables软件包提供了两个命令iptables-save、iptables-restore,分别用于保存和恢复防火墙规则,使用这两个命令可以很方便地导出和导入规则

设定的防火墙规则只保存在内存中,并没有保存到某个文件中。也就是说,当系统重启后以前设定的规则就没有了,所以设定好规则后要先保存一下,默认保存到/etc/sysconfig/iptables中,可以将防火墙规则保存到自定义的文件中

[root@localhost sbin]# service iptables save  //导出防火墙规则到系统默认的文件/etc/sysconfig/iptables
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  确定  ]
[root@localhost sbin]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Fri Feb 23 09:09:31 2018
*filter
:INPUT DROP [22:1825]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [64:6336]
-A INPUT -s 192.168.221.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m multiport --dports 21,80 -j ACCEPT
COMMIT
# Completed on Fri Feb 23 09:09:31 2018
[root@localhost ~]# iptables-save > /root/iptables.rule  //导出防火墙规则到自定义的/root/iptables.rule文件中

先清空防火墙规则

[root@localhost sbin]# iptables -F;

导入防火墙规则

[root@localhost ~]# iptables-restore < /root/iptables.rule

查看防火墙规则

#iptables-save  //默认输出到屏幕