iptables防火墙

iptables防火墙

硬件防火墙
软件防火墙
	netfilter 网络过滤器   (模块)
		iptables, rhel6/centos6 
		iptables/firewalld,   rhel7/centos7

网络基础:

TCP/IP模型:

	应用层   传输层    网络层    数据链路层     物理层 

数据封装:
	MAC帧头+IP报头+TCP/UDP报头+HTTP请求

	数据帧
	
	TCP/UDP报头:
		源端口号: >1024随机端口    5689
		目的端口号: 80

	IP报头:
		源IP地址
		目的IP地址

	MAC帧头:
		源MAC地址
		目的MAC地址

端口号Port:

作用: 标识不同的应用程序 
数字: 0-----65535,  小于1024称为著名端口

常用端口:

	http		tcp/80
	https		tcp/443
	SSH			TCP/22
	TELNET		TCP/23
	FTP			TCP/21(命令连接), 数据连接(TCP/20)
	TFTP		UDP/69
	MYSQL		TCP/3306
	SMTP		TCP/25
	POP3		TCP/110
	IMAP4		TCP/143
	DNS			TCP/53, UDP/53
	DHCP		UDP/67(服务端), UDP/68(客户端)
	SAMBA		TCP/139, TCP/445, UDP/137, UDP/138 
	NTP			UDP/123 
	iSCSI		tcp/3260

ARP-----Address Resolution Protocol 地址解析协议

作用:根据已知的IP地址获取对应的MAC地址 

Linux iptables防火墙

作用:
	进行数据过滤	(IP报头, TCP/UDP报头)
	为数据打标记 	(LVS负载均衡集群)
	网络地址转换	(NAT)


Linux防火墙
	内核集成的模块netfilter 
	iptables工具
		实现添加, 删除, 修改, 查看防火墙规则 



iptables四表五链:
	
	filter(数据过滤)	三层、四层报头
		INPUT
		OUTPUT
		FORWARD
	nat(网络地址转换)
		PREROUTING
		OUTPUT
		POSTROUTING
	mangle(数据打标记)
		INPUT 
		FORWARD
		OUTPUT
		PREROUTING
		POSTROUTING
	raw
		PREROUTING
		OUTPUT

iptables工具的使用:

iptales

命令command

查看类:
-L:显示指定表中的规则
-n:以数字的格式显示IP及端口号
-v:显示规则相关的详细信息(显示规则的计数器)
-x:显示计数器时显示精确的数字
--line-numbers:显示规则的号码
-t

:指定表名,默认为filter表

iptables -nL --line-numbers -v

管理规则

  1. 添加规则

    -A:追加一条规则,添加到链的尾部
    -I CHAIN [number]:插入一条规则,插入为CHAIN的第number条;number不写表示插入到第一条 -I INPUT

  2. 删除规则
    -D CHAIN [number]:删除指定链中的第number条规则

  3. 修改规则
    -R CHAIN [number]:替换指定的规则

  4. 清空所有规则
    -F [chain]

  5. 修改链的默认规则

    -P CHAIN <处理办法>

规则的匹配标准:

  1. 源IP地址

    -s address[/mask]

     ! -s 192.168.1.1
     -s 192.168.1.0/24
    
  2. 目的IP地址

    -d address[/mask]

     ! -d 10.1.1.1
     -d 10.1.1.0/24
    
  3. 协议

    -p tcp
    -sport port1[:port2] -p tcp --dport 22 -p tcp --dport 80:443
    -dport port1[:port2]

    -p udp
    -sport port1[:port2]
    -pport port1[:port2]

    -p icmp

     --icmp-type 8			echo-request 
     --icmp-type 0			echo-reply 
    
  4. 匹配数据包进行的网卡接口

    -i eth0

  5. 匹配数据包流出的网卡接口

    -o eth1

数据包的处理行为 -j target

ACCEPT	允许 
REJECT	拒绝
DROP	丢弃
LOG		记录日志

先堵后通

示例1: 允许客户端访问SSH服务

[root@node1 ~]# iptables -A INPUT -s 10.1.2.101 -d 10.1.2.1 -p tcp --dport 22 -j ACCEPT
[root@node1 ~]# iptables -A OUTPUT -s 10.1.2.1 -d 10.1.2.101 -p tcp --sport 22 -j ACCEPT

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

示例2:允许所有客户端访问WEB服务 

[root@node1 ~]# iptables -I INPUT -d 10.1.2.1 -p tcp --dport 80 -j ACCEPT
[root@node1 ~]# iptables -I OUTPUT -s 10.1.2.1 -p tcp --sport 80 -j ACCEPT

示例3: 允许客户端10.1.2.101 ping服务器 

[root@node1 ~]# iptables -A INPUT -s 10.1.2.101 -d 10.1.2.1 -p icmp --icmp-type 8 -j ACCEPT
[root@node1 ~]# iptables -A OUTPUT -s 10.1.2.1 -d 10.1.2.101 -p icmp --icmp-type 0 -j ACCEPT

示例4: 允许服务器ping其他主机

[root@node1 ~]# iptables -A OUTPUT -s 10.1.2.1 -p icmp --icmp-type 8 -j ACCEPT
[root@node1 ~]# iptables -A INPUT -d 10.1.2.1 -p icmp --icmp-type 0 -j ACCEPT

示例5: 允许服务器ping本机

[root@node01 ~]# iptables -A INPUT -i lo -j ACCEPT
[root@node01 ~]# iptables -A OUTPUT -o lo -j ACCEPT

示例6: 允许DNS服务器解析所有主机名 

[root@node1 ~]# iptables -A INPUT -d 10.1.2.1 -p udp --dport 53 -j ACCEPT
[root@node1 ~]# iptables -A OUTPUT -s 10.1.2.1 -p udp --sport 53 -j ACCEPT

[root@node1 ~]# iptables -A OUTPUT -s 10.1.2.1 -p udp --dport 53 -j ACCEPT
[root@node1 ~]# iptables -A INPUT -d 10.1.2.1 -p udp --sport 53 -j ACCEPT

[root@node1 ~]# iptables -A INPUT -d 10.1.2.1 -p tcp --dport 53 -j ACCEPT
[root@node1 ~]# iptables -A OUTPUT -s 10.1.2.1 -p tcp --sport 53 -j ACCEPT

[root@node1 ~]# iptables -A OUTPUT -s 10.1.2.1 -p tcp --dport 53 -j ACCEPT
[root@node1 ~]# iptables -A INPUT -d 10.1.2.1 -p tcp --sport 53 -j ACCEPT

保存防火墙规则 

Centos 6:

[root@node1 ~]# service iptables save
iptables:将防火墙规则保存到 /etc/sysconfig/iptables: [确定]

CentOS 7:

[root@node01 ~]# iptables-save > /iptables.rule

恢复规则:

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

示例7: 删除规则

[root@node1 ~]# iptables -D INPUT 3

示例8:修改规则 

[root@node01 ~]# iptables -R INPUT 7 -d 192.168.122.101 -p icmp --icmp-type 0 -j ACCEPT

iptables模块

1、multiport 离散多端口

-m multiport 

	--sports port1,port2,port3
	--dports port1,port2,port3 

[root@node01 ~]# iptables -I INPUT -s 192.168.122.1 -d 192.168.122.101 -p tcp -m multiport --dports 80,139,445,22 -j ACCEPT

2、iprange

-m iprange 

	--src-range IP1[-IP2]
	--dst-range IP2[-IP2]

[root@node01 ~]# iptables -A INPUT -m iprange --src-range 192.168.1.1-192.168.1.10 -d 192.168.122.101 -p tcp --dport 80 -j ACCEPT

3、state 状态模块 (根据连接状态进行数据的过滤)

-m state --state 

state状态:
	NEW      首次访问
	ESTABLISHED
		后续的访问请求
		服务器的响应数据 
	RELATED(ftp)
	INVALID  无效的链接(假设就是我服务器没有收到任何的请求,但是服务器往外直接发送了一个响应数据,被称之为无效的链接)

ftp的工作方式有两种
1:主动链接
2:被动链接

当客户端访问我ftp的时候,首先客户端向服务器的21号端口,发起请求建立命令链接,通过服务器的验证,这个时候在服务器本地产生一个大于1024的随机端口,
而且这个端口产生之后,ftp服务器通过刚才建立的命令链接告诉客户端这个随机的端口以及来当我的数据连接,客户端收到这个端口信息后,再次向ftp的这个随机端口,发送请求,建立数据连接,
传输数据;
其中这个随机端口值得是,当建立命令连接之后,每次输入不同的命令就会产生一个随机的端口,

[root@node01 ~]# iptables -I OUTPUT -s 192.168.122.166 -m state --state ESTABLISHED -j ACCEPT

[root@node01 ~]# iptables -I INPUT -d 192.168.122.166 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@node01 ~]# iptables -I INPUT -d 192.168.122.166 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

示例:允许ftp服务的访问

首先需要装载ip_nat_ftp和ip_conntrack_ftp模块

[root@node01 ~]# yum install -y iptables-services

vim /etc/sysconfig/iptables-config

IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"

systemctl restart iptables

[root@node01 ~]# iptables -I INPUT -d 192.168.122.166 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@node01 ~]# iptables -I INPUT 2 -d 192.168.122.166 -m state --state RELATED,ESTABLISHED -j ACCEPT

FORWARD链的使用

[root@nat-device ~]# iptables -A FORWARD -p icmp -j DROP

nat表的使用 (IP地址转换) 

NAT 网络地址转换 

	PREROUTING		路由前的操作
	POSTROUTING		路由后的操作 

动作:

	-j SNAT 
	-j MASQUERADE 		转换数据包中的源IP地址
	
	-j DNAT 			转换数据包中的目的IP地址 

示例1:SNAT

[root@NAT-device ~]# iptables -t nat -A POSTROUTING -s 192.168.87.0/24 -j SNAT --to-source 20.1.1.254

示例2: MASQUERADE

[root@NAT-device ~]# iptables -t nat -A POSTROUTING -s 192.168.87.0/24 -j MASQUERADE

示例3: DNAT

[root@NAT-device ~]# iptables -t nat -A PREROUTING -d 20.1.1.254 -j DNAT --to-destination 192.168.87.101

[root@NAT-device ~]# iptables -t nat -A PREROUTING -d 20.1.1.254 -p tcp --dport 8888 -j DNAT --to-destination 192.168.87.101:80
端口映射/重定向

TCP报头

  1. 源端口

  2. 目的端口

  3. 序列号, sequence

  4. 确认号, ack

  5. 首部长度, TCP报头的大小

  6. TCP协议的标志位

    SYN:请求建立连接
    ACK:确认
    FIN:请求断开连接
    RST:重置连接
    PSH:推送
    URG:紧急

  7. 窗口大小 windows size

  8. TCP校验和

  9. 紧急指针

UDP报头

  1. 源端口
  2. 目的端口
  3. UDP长度
  4. UDP校验和

网络层IP报头

  1. 版本 4 ipv4

  2. 首部长度 20Bytes

  3. 服务类型 TOS

  4. 总长度

  5. 标识符、标志、段偏移量

  6. TTL Time To Live 生存时间

    64 Linux/Unix
    128 Windows
    255 网络设备

  7. 协议,标识上层协议

    6 TCP
    17 UDP

  8. 首部校验和 checksum

  9. 源IP地址

  10. 目的IP地址

iptables模块

1、-m tos 根据IP报头TOS字段实现数据过滤

-m tos --tos value

[root@node01 ~]# iptables -A INPUT -s 192.168.122.102 -d 192.168.122.101 -m tos --tos 0x8 -j DROP

通过抓包工具查看tos值

[root@node01 ~]# tcpdump -i eth0 -nn port 22 -vvv

2、-m tcp 根据TCP报头的标志位进行数据过滤

--tcp-flags mask comp

	--tcp-flags SYN,ACK,FIN SYN

[root@node01 ~]# iptables -A INPUT -s 192.168.122.102 -d 192.168.122.101 -p tcp -m tcp --tcp-flags SYN,ACK,FIN,RST SYN -j ACCEPT

[root@node01 ~]# iptables -A INPUT -s 192.168.122.102 -d 192.168.122.101 -p tcp -m tcp --syn -j ACCEPT

3、-m limit 限速

-m limit --limit avg

单位:/sec /minute /hour /day

[root@node01 ~]# iptables -A INPUT -s 192.168.122.102 -p icmp -m limit --limit 5/minute -j ACCEPT
[root@node01 ~]# iptables -A INPUT -s 192.168.122.102 -p icmp -j DROP

4、-m connlimit 限制同一个客户端的最大连接数

--connlimit-above n

[root@node01 ~]# iptables -A INPUT -s 192.168.122.1 -d 192.168.122.101 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP

5、-m time 根据时间限制访问

[root@node01 ~]# iptables -A INPUT -s 192.168.122.102 -d 192.168.122.101 -p icmp -m time --timestart 11:30:00 --timestop 11:50:00 -j DROP

6、-m comment 为规则添加描述信息

-m comment --comment "描述信息"

[root@node01 ~]# iptables -A INPUT -s 192.168.122.102 -d 192.168.122.101 -p icmp -m limit --limit 5/minute -m comment --comment "limit ping" -j ACCEPT

7、-m mark 根据数据的mark值进行过滤

-m mark --mark <mark>

[root@node01 ~]# iptables -t mangle -A PREROUTING -s 192.168.122.102 -d 192.168.122.101 -p icmp -j MARK --set-mark 9
[root@node01 ~]# iptables -A INPUT -m mark --mark 9 -j DROP

=-j LOG 记录日志===

--log-prefix prefix

[root@node01 ~]# iptables -A INPUT -s 192.168.122.102 -d 192.168.122.101 -p icmp -j LOG --log-prefix "192.168.122.102_ping"

启动kernel日志

[root@node01 ~]# vim /etc/rsyslog.conf

kern.*     /var/log/kernel.log

[root@node01 ~]# systemctl restart rsyslog.service

验证结果:

[root@node01 log]# tail -f kernel.log

Aug 29 12:10:20 node01 kernel: 192.168.122.102_pingIN=eth0 OUT= MAC=52:54:00:71:3b:1c:52:54:00:71:3b:2c:08:00 SRC=192.168.122.102 DST=192.168.122.101 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=64707 DF PROTO=ICMP TYPE=8 CODE=0 ID=2734 SEQ=1 MARK=0x9

===============================================

centos7 firewalld 防火墙

依赖于firewalld服务 

配置工具:
	firewall-config 	图形化工具
	firewall-cmd		命令行工具

1、查看所有区域名称

[root@node01 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
[root@node01 ~]#

2、查看默认区域

[root@node01 ~]# firewall-cmd --get-default-zone
public

3、查看某区域规则的设置

[root@node01 ~]# firewall-cmd --list-all --zone=public
public (default, active)
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

4、更改默认区域

[root@node01 ~]# firewall-cmd --set-default-zone=work
success
[root@node01 ~]# firewall-cmd --reload
success
[root@node01 ~]# firewall-cmd --get-default-zone
work

示例01:配置public区域允许http访问

方法1)

[root@node01 ~]# firewall-cmd --permanent --add-service=http --zone=public
success
[root@node01 ~]# firewall-cmd --reload
success

方法2)

[root@node01 ~]# firewall-cmd --permanent --add-port=80/tcp --zone=public
fsuccess
[root@node01 ~]# firewall-cmd --reload
success
[root@node01 ~]# firewall-cmd --list-all --zone=public
public (default, active)
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports: 80/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

[root@node01 ~]#

示例02:配置192.168.122.102访问请求进入work区域,并允许其访问http服务

[root@node01 ~]# firewall-cmd --permanent --add-source=192.168.122.1 --zone=work
success
[root@node01 ~]# firewall-cmd --permanent --add-service=http --zone=public --zone=work

[root@node01 ~]# firewall-cmd --reload
success

示例03:在work区域禁止ping

[root@node01 ~]# firewall-cmd --permanent --add-icmp-block=echo-request --zone=work
success
[root@node01 ~]# firewall-cmd --reload
success
[root@node01 ~]# firewall-cmd --list-all --zone=work
work
interfaces:
sources: 192.168.122.102
services: dhcpv6-client http ipp-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks: echo-request
rich rules:

示例04:配置端口转发规则,192.168.122.102访问192.168.122.101的8888端口时,转发到本地的22端口

[root@node01 ~]# firewall-cmd --permanent --add-forward-port=port=8888:proto=tcp:toport=22 --zone=work
success
[root@node01 ~]# firewall-cmd --reload
success
[root@node01 ~]# firewall-cmd --list-all --zone=work
work
interfaces:
sources: 192.168.122.102
services: dhcpv6-client http ipp-client ssh
ports:
masquerade: no
forward-ports: port=8888:proto=tcp:toport=22:toaddr=
icmp-blocks: echo-request
rich rules:

[root@node01 ~]#

示例05:验证block/drop区域

[root@node01 ~]# firewall-cmd --permanent --add-source=192.168.122.102 --zone=block
success
[root@node01 ~]# firewall-cmd --reload
success
[root@node01 ~]# firewall-cmd --list-all --zone=block
block
interfaces:
sources: 192.168.122.102
services:
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

示例06:验证trusted区域

[root@node01 ~]# firewall-cmd --permanent --add-source=192.168.122.102 --zone=trusted
success
[root@node01 ~]# firewall-cmd --reload
success
[root@node01 ~]# firewall-cmd --list-all --zone=trusted
trusted
interfaces:
sources: 192.168.122.102
services:
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

TCPWrapper 防火墙

/etc/hosts.allow 
/etc/hosts.deny

注意:只有加载了tcpwrapper库文件的应用程序才可以使用tcpwrapper进行访问控制

[root@node01 ~]# ldd /usr/sbin/vsftpd | grep wrap
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f064d366000)

示例01: 禁止192.168.122.102访问ftp服务

[root@node01 ~]# vim /etc/hosts.deny

vsftpd:192.168.122.102

示例02:禁止192.168.122.0网段主机访问ftp服务

[root@node01 ~]# vim /etc/hosts.deny

vsftpd:192.168.122.0/255.255.255.0

vsftpd:192.168.122.0/255.255.255.0 except 192.168.122.1
posted @ 2020-05-07 23:37  知秋一叶9527  阅读(279)  评论(0编辑  收藏  举报