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
iptables -nL --line-numbers -v
管理规则
-
添加规则
-A:追加一条规则,添加到链的尾部
-I CHAIN [number]:插入一条规则,插入为CHAIN的第number条;number不写表示插入到第一条 -I INPUT -
删除规则
-D CHAIN [number]:删除指定链中的第number条规则 -
修改规则
-R CHAIN [number]:替换指定的规则 -
清空所有规则
-F [chain] -
修改链的默认规则
-P CHAIN <处理办法>
规则的匹配标准:
-
源IP地址
-s address[/mask]
! -s 192.168.1.1 -s 192.168.1.0/24
-
目的IP地址
-d address[/mask]
! -d 10.1.1.1 -d 10.1.1.0/24
-
协议
-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
-
匹配数据包进行的网卡接口
-i eth0
-
匹配数据包流出的网卡接口
-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报头
-
源端口
-
目的端口
-
序列号, sequence
-
确认号, ack
-
首部长度, TCP报头的大小
-
TCP协议的标志位
SYN:请求建立连接
ACK:确认
FIN:请求断开连接
RST:重置连接
PSH:推送
URG:紧急 -
窗口大小 windows size
-
TCP校验和
-
紧急指针
UDP报头
- 源端口
- 目的端口
- UDP长度
- UDP校验和
网络层IP报头
-
版本 4 ipv4
-
首部长度 20Bytes
-
服务类型 TOS
-
总长度
-
标识符、标志、段偏移量
-
TTL Time To Live 生存时间
64 Linux/Unix
128 Windows
255 网络设备 -
协议,标识上层协议
6 TCP
17 UDP -
首部校验和 checksum
-
源IP地址
-
目的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