Iptables防火墙简介及企业实战演练

一、Iptables防火墙简介

  • NetFilter/Iptables(简称Iptables)是一款开源、免费的unix/linux操作系统防火墙软件系统,基于数据包过滤的防火墙工具,主要是工作在OSI七层模型中:二层(数据链路层)、三层(网络层)、四层(传输层)。
  • NetFilter主要是工作中内核空间(Kernel Space),属于Linux内核自带的系统模块,无需安装,默认集成的,主要是由各种过滤的信息表组成的,表主要用于存储后期各种策略规则,负责规则、策略的处理、数据包过滤等工作。
  • Iptables主要是工作中用户空间(User Space),属于Linux系统自带(自行安装)的系统工具,主要是用于管理底层Netfilter模块的,默认不能直接操作内核模块的,可以通过iptables工具管理Netfilter模块中过滤表,还可以通过iptables工具在表中添加策略规则等。
  • 在日常企业运维中,NetFilter和Iptables统称为Iptables防火墙,iptables防火墙默认有四张表:Raw、Mangle、NAT、Filter表,默认iptables是管理和使用Filter表。
  • 四张表总共包含5条链,每条链上可以没有规则,也可以有无数的规则,规则是用于限制、允许客户端访问服务器的策略定义的,规则和规则之间没有冲突,5条链:

在这里插入图片描述

二、iptables命令详解

1、命令图解:

在这里插入图片描述

2、命令参数详解

-A 	 #顺序添加,添加一条新规则
-I   #插入,插入一条新规则 -I 后面加一数字表示插入到哪行
-D   #删除,删除一条新规则 -D 后面加一数字表示删除哪行
-N   #新建一个链
-X   #删除一个自定义链,删除之前要保证次链是空的,而且没有被引用
-L   #查看
 iptables -L -n #以数字的方式显示
 iptables -L -v #显示详细信息
 iptables -L -x #显示精确信息
 
-E   #重命名链
-F   #清空链中的所有规则
-Z   #清除链中使用的规则
-P   #设置默认规则

2.匹配条件:
隐含匹配:
   -p  tcp udp icmp
   --sport #指定源端口
   --dport #指定目标端
   -s #源地址
   -d #目的地址
   -i #数据包进入的网卡
   -o #数据包出口的网卡
   
扩展匹配:
-m state --state   #匹配状态的
-m limit --limit 3/minute   #每三分种一次
-m mutiport --source-port   #端口匹配 ,指定一组端口
-m time --timestart 8:00 --timestop 12:00  #表示从哪个时间到哪个时间段
-m time --days    #表示那天
-m mac --mac-source xx:xx:xx:xx:xx:xx #匹配源MAC地址
-m layer7 --l7proto qq   #表示匹配腾讯qq的 当然也支持很多协议,这个默认是没有的,需要我们给内核打补丁并重新编译内核及iptables才可以使用 -m layer7 这个显示扩展匹配

#下面两个参数不知有何用途!
-m limit --limit-burst  5   只匹配5个数据包
-m string --string --algo bm|kmp --string"xxxx"  匹配字符串

3.动作:
-j
DROP   #直接丢掉
ACCEPT #允许通过
REJECT #丢掉,但是回复信息
LOG --log-prefix"说明信息,自己随便定义"  #记录日志

SNAT       #源地址转换,适用于多个内网用户使用一个公网地址
DNAT       #目标地址转换,SNAT的逆过程
#从内网访问外网服务器网关使用的是为SNAT,从外网服务器返回到内网用户使用的是DNAT!

REDIRECT   #重定向
MASQUERAED #地址伪装


#保存iptables规则
service iptables save
# 重启iptables服务
service iptables stop
service iptables start

3、重点提醒

(1)我们需要开启转发功能!firewalld、SElinux都需要关闭

 echo 1 > /proc/sys/net/ipv4/ip_forward

(2)NAT规则匹配顺序
从上至下,依次匹配,匹配成功,不再往下匹配。不管其匹配的精确程度!

三、Iptables之Filter表简介

Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:

  • INPUT链 – 处理来自外部的数据;
  • OUTPUT链 – 处理向外发送的数据;
  • FORWARD链 – 将数据转发到本机的其他网卡设备上。

实战演练

#查看iptables规则并编号
iptables -L -n --line-numbers
#WEB服务器,开启80端口; 
iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT #这里-I参数指定了插入到第二条规则
#指定多端口,开启邮件服务器25,110端口;  
iptables -A INPUT -p tcp -m multiport --dport 110,25 -j ACCEPT
#允许icmp包通过,也就是允许ping
iptables -A OUTPUT -p icmp -j ACCEPT (Input方向也要做,此处省略)
#友好的拒绝其访问
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited
#FORWARD链的作用:一般与nat表一起使用,这里开启forward转发,nat表再转发!
#规则删除
1、按表删除
iptables -t nat -F #清空nat表的所有链
2、按链的类型加编号删除 #先明确你要删除那个链里的那条规则!
iptables -D INPUT 1


#iptables规则配置文件中默认规则,最后匹配
:INPUT ACCEPT [0:0] 
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [602:39593]
			   [请求数:所有请求的数据包的总大小]

四、Iptables之NAT表简介

1、NAT使用场景

NAT (网络地址转换) 技术在平时是很多见的,如家庭中在使用路由器共享上网时,一般用的就是 NAT 技术,它可以实现众多内网 IP 共享一个公网 IP 上网。

2、NAT 的原理

简单的说就是当内网主机访问外网时,当内网主机的数据包要通过路由器时,路由器将数据包中的源内网 IP 地址改为路由器上的公网 IP 地址,同时记录下该数据包的消息;

3、SNAT、DNAT解析

外网服务器响应这次由内而外发出的请求或数据交换时,当外网服务器发出的数据包经过路由器时,原本是路由器上的公网 IP 地址被路由器改为内网 IP 。
SNAT 和 DNAT 是 iptables 中使用 NAT 规则相关的的两个重要概念。如上图所示,如果内网主机访问外网而经过路由时,源 IP 会发生改变,这种变更行为就是 SNAT;反之,当外网的数据经过路由发往内网主机时,数据包中的目的 IP (路由器上的公网 IP) 将修改为内网 IP,这种变更行为就是 DNAT 。

4、NAT表有三种内建链

  • POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
  • PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ipaddress),通常用于DNAT(destination NAT)。
  • OUTPUT链 – 处理本机产生的数据包。

5、NAT映射实战演练

内网主机IP:192.168.0.1:8080,本局域网网关主机IP:39.97.176.117,你要访问106.54.72.122:80,在网关处配置规则如下;

#--to-source指定转换后的源IP地址,如果是udp/tcp的报文,可以指定转换后的端口号
iptables -t nat -A POSTROUTING -s 192.168.0.1/32  -p tcp --sport 8080 -j SNAT --to-source 39.97.176.117:8080

#--to-destination指定转换后的目标ip地址,如果是udp/tcp的报文,可以指定转换后的端口号
iptables -t nat -A PREROUTING -d 39.96.176.117/32 -p tcp --dport 8080 -j DNAT --to-destination 192.168.0.1:8080

#开启forward转发
iptables -A FORWARD -s 192.168.0.1 -p tcp --sport 8080 -j ACCEPT

6、iptables规则存储及阿里云线上服务器规则展示

iptables-save >/root/iptables
# Generated by iptables-save v1.4.21 on Sun Mar 29 09:32:13 2020
*mangle
:PREROUTING ACCEPT [4956702:403757221]
:INPUT ACCEPT [4956702:403757221]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4951017:201160024]
:POSTROUTING ACCEPT [4951028:201162271]
-A POSTROUTING -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
COMMIT
# Completed on Sun Mar 29 09:32:13 2020
# Generated by iptables-save v1.4.21 on Sun Mar 29 09:32:13 2020
*nat
:PREROUTING ACCEPT [4933337:295987301]
:INPUT ACCEPT [4933337:295987301]
:OUTPUT ACCEPT [3006:227717]
:POSTROUTING ACCEPT [3006:227717]
-A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
COMMIT
# Completed on Sun Mar 29 09:32:13 2020
# Generated by iptables-save v1.4.21 on Sun Mar 29 09:32:13 2020
*filter
:INPUT ACCEPT [4956714:403758096]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4951029:201160679]
-A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT
COMMIT
# Completed on Sun Mar 29 09:32:13 2020

在这里插入图片描述
7、腾讯云线上服务器iptables配置实例

*nat
:PREROUTING ACCEPT [15:616]
:INPUT ACCEPT [15:616]
:OUTPUT ACCEPT [312:18734]
:POSTROUTING ACCEPT [312:18734]
:DOCKER - [0:0]
:KUBE-MARK-DROP - [0:0]
:KUBE-MARK-MASQ - [0:0]
:KUBE-NODEPORTS - [0:0]
:KUBE-POSTROUTING - [0:0]
:KUBE-SEP-CDLPKQDAWGXXULF3 - [0:0]
:KUBE-SEP-WDXYE4D5Z7MA4KDL - [0:0]
:KUBE-SERVICES - [0:0]
:KUBE-SVC-NPX46M4PTMTKRN6Y - [0:0]
:KUBE-SVC-XGLOHA7QRQ3V22RZ - [0:0]
-A PREROUTING -m comment --comment "kubernetes service portals" -j KUBE-SERVICES
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -m comment --comment "kubernetes service portals" -j KUBE-SERVICES
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.21.0/24 ! -o docker0 -j MASQUERADE
-A POSTROUTING -m comment --comment "kubernetes postrouting rules" -j KUBE-POSTROUTING
-A DOCKER -i docker0 -j RETURN
-A KUBE-MARK-DROP -j MARK --set-xmark 0x8000/0x8000
-A KUBE-MARK-MASQ -j MARK --set-xmark 0x4000/0x4000
-A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -m mark --mark 0x4000/0x4000 -j MASQUERADE
-A KUBE-SEP-CDLPKQDAWGXXULF3 -s 172.17.77.241/32 -m comment --comment "default/kubernetes:https" -j KUBE-MARK-MASQ
-A KUBE-SEP-CDLPKQDAWGXXULF3 -p tcp -m comment --comment "default/kubernetes:https" -m recent --set --name KUBE-SEP-CDLPKQDAWGXXULF3 --mask 255.255.255.255 --rsource -m tcp -j DNAT --to-destination 172.17.77.241:6443
-A KUBE-SEP-WDXYE4D5Z7MA4KDL -s 172.17.21.2/32 -m comment --comment "kube-system/kubernetes-dashboard:" -j KUBE-MARK-MASQ
-A KUBE-SEP-WDXYE4D5Z7MA4KDL -p tcp -m comment --comment "kube-system/kubernetes-dashboard:" -m tcp -j DNAT --to-destination 172.17.21.2:9090
-A KUBE-SERVICES -d 10.254.0.1/32 -p tcp -m comment --comment "default/kubernetes:https cluster IP" -m tcp --dport 443 -j KUBE-SVC-NPX46M4PTMTKRN6Y
-A KUBE-SERVICES -d 10.254.214.163/32 -p tcp -m comment --comment "kube-system/kubernetes-dashboard: cluster IP" -m tcp --dport 80 -j KUBE-SVC-XGLOHA7QRQ3V22RZ
-A KUBE-SERVICES -m comment --comment "kubernetes service nodeports; NOTE: this must be the last rule in this chain" -m addrtype --dst-type LOCAL -j KUBE-NODEPORTS
-A KUBE-SVC-NPX46M4PTMTKRN6Y -m comment --comment "default/kubernetes:https" -m recent --rcheck --seconds 10800 --reap --name KUBE-SEP-CDLPKQDAWGXXULF3 --mask 255.255.255.255 --rsource -j KUBE-SEP-CDLPKQDAWGXXULF3
-A KUBE-SVC-NPX46M4PTMTKRN6Y -m comment --comment "default/kubernetes:https" -j KUBE-SEP-CDLPKQDAWGXXULF3
-A KUBE-SVC-XGLOHA7QRQ3V22RZ -m comment --comment "kube-system/kubernetes-dashboard:" -j KUBE-SEP-WDXYE4D5Z7MA4KDL
COMMIT
# Completed on Sun Mar 29 09:41:43 2020
# Generated by iptables-save v1.4.21 on Sun Mar 29 09:41:43 2020
*filter
:INPUT ACCEPT [425:21221]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [401:28541]
:DOCKER - [0:0]
:DOCKER-ISOLATION - [0:0]
:KUBE-FIREWALL - [0:0]
:KUBE-SERVICES - [0:0]
-A INPUT -j KUBE-FIREWALL
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A OUTPUT -m comment --comment "kubernetes service portals" -j KUBE-SERVICES
-A OUTPUT -j KUBE-FIREWALL
-A DOCKER-ISOLATION -j RETURN
-A KUBE-FIREWALL -m comment --comment "kubernetes firewall for dropping marked packets" -m mark --mark 0x8000/0x8000 -j DROP
COMMIT
# Completed on Sun Mar 29 09:41:43 2020

在这里插入图片描述

发布了188 篇原创文章 · 获赞 150 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_44571270/article/details/104734269