目录
一、firewall
1.1 安装及开启
- 安装:centOS自带
- 服务:
# 防火墙 开启、开机启动、状态 systemctl start firewalld systemctl enable firewalld systemctl status firewalld # 防火墙 关闭、重启、关闭开机启动 systemctl stop firewalld systemctl restart firewalld systemctl disable firewalld
1.2 规则管理
1.2.1 常用参数
- 部分常用参数
参数选项 参数名 –permanent 永久生效,否则重启后失效 –zone=区域名 功能:指定规则生效区域,常规为public区域,开启ssh端口22,允许ping
获取所有区域名firewall-cmd --get-zones
不带此参数表示针对默认区域firewall-cmd --get-default-zone
设置默认区域firewall-cmd --set-default-zone=区域名
–timeout=秒数 指定此规则在设定秒数后清除 –reload 修改规则后,需要重新加载配置文件,服务不会中断
1.2.2 端口操作
- 此处端口打开指针对外网,本机端口不受限制
- 均针对默认区域
# 查询开启的端口 firewall-cmd --list-ports > 22/tcp # 临时开启端口用于测试,立即生效,不用reload firewall-cmd --add-port=1234/tcp --timeout=1m > success # 永久开启端口,可以指定区间1024-2048/tcp,必须reload,否则不生效 firewall-cmd --add-port=1024/tcp --permanent # 不断开连接的情况下,加载配置 firewall-cmd --reload > success # 删除端口 firewall-cmd --remove-port=1024/tcp
二、iptables
- 与firewall关系:firewall与iptables均为操作内核中的安全框架netfilter的工具,firewall操作端口的动作也是基于iptables,但是iptables中的端口等规则在firewall中无法查询,导致莫名的无法访问,特别是针对docker
- 功能:直接操作网络层的报文,包含对报文的过滤,改写,转发NAT,可作为网络防火墙主外(集体), 主机防火墙主内(个人)
- 本文参考博客:传送门,此处仅做总结归纳
2.1 报文流向
- 超重点
2.2 表、链、规则
关系:表中存链,链中存规则
- 四表
表名 功能 filter表 (常用)负责过滤功能,防火墙;内核模块:iptables_filter nat表 (常用)network address translation,网络地址转换功能;内核模块:iptable_nat mangle表 (不用)拆解报文,做出修改,并重新封装 的功能;iptable_mangle raw表 (不用)关闭nat表上启用的连接追踪机制;iptable_raw - 五链
- PREROUTING:常用来改写目的地址与端口(NAT相关)
- INPUT:常用于写过路由表后的入过滤规则
- FORWARD:常用于写NAT嵌入过滤规则(NAT相关)
- OUTPUT:常用于写过路由表后的出过滤规则
- POSTROUTING:常用来改写源地址与端口(NAT相关)
- 规则写法
- 规则执行:在链表中按从上到下依次匹配,若无匹配,执行默认策略
- 命令写法:
iptables [指定表] 指定链 匹配规则 指定动作
- 指定表:
-t nat
,默认为-t filter
可不写 - 指定链、匹配规则:见2.3节
- 指定动作
动作名 动作意义 ACCEPT 允许数据包通过 DROP 直接丢弃数据包,不给任何回应信息,客户端超时后断开链接 REJECT 拒绝数据包通过,客户端刚请求就会收到拒绝的信息 SNAT 源地址转换,解决内网用户用同一个公网地址上网的问题 MASQUERADE 是SNAT的一种特殊形式,适用于动态的、临时会变的ip上 DNAT 目标地址转换 REDIRECT 在本机做端口映射 LOG 在 /var/log/messages
文件中记录日志信息,不做其他动作,然后将数据包传递给下一条规则自定义链 将匹配到的报文转给自定义链
- 指定表:
2.3 基础命令
2.3.1 前期准备
- 关闭SELINUX:设置
/etc/sysconfig/selinux
中SELINUX=disabled,需重启 - 卸载防火墙
# 需要卸载firewall防火墙,启用iptables-services防火墙, # 否则docker的规则看不见但生效 systemctl stop firewalld systemctl disable firewalld systemctl status firewalld systemctl remove firewalld -y
- 安装iptables服务
# 功能:规则保存后,开机后不丢失,否则需要配置脚本 yum install iptables-services.x86_64 -y # iptables服务开启、开机启动、查看启动状态 systemctl start iptables systemctl enable iptables systemctl status iptables
2.3.2 查询操作
- 查询filter表 iptables [-t filter] -L
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination
- 查询nat表 iptables -t nat -L
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
- 不进行IP地址名称反解查询 iptables -nL
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ...
- 显示行号查询 iptables -L --line-number
Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ...
- 详细单链查询 iptables -vL INPUT
# policy ACCEPT:当前链的默认规则,即不匹配所有规则后执行此规则 # pkts\bytes:当前链已匹配到的包的数量\大小总和 # target:指定动作 # prot:协议 tcp\udp\icmp # opt:规则选项 # in/out:包流向的入网卡、出网卡 # source/destination:包流向的源地址、目标地址,最后为描述性文字 Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 55110 3601K ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED ...
总结
- 行号:常用于插入和删除前的操作
- 查询规则:常用iptables -nL
- 查询链操作:iptables -nL INPUT, 仅显示filter表的INPUT链
2.3.3 删除及保存
- 格式化表:
iptables [-t filter] -F
- 格式化链:
iptables [-t filter] -F INPUT
- 删除规则:
iptables [-t filter] -D INPUT 1
,数字1
为行号,–line-number获得的 - 保存策略:
service iptables save
,保存在/etc/sysconfig/iptables
中,可直接在里面写
2.4 功能实现
2.4.1 匹配条件
- 未指定:以下均指所有,ALL的意思
- ip匹配条件
写法 意义 -s 192.168.1.1 单个ip -s 192.168.1.1,192.168.1.2 离散ip -s 192.168.1.0/24 网段ip ! -s 192.168.1.123 取反,非后面的ip即可 -s 192.168.1.1 -d 192.168.1.2 同时符合源与目标地址才匹配 - 协议匹配条件:
-p tcp
,还包含tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh - 网卡接口匹配条件:
- 写法:
-i eth0 -o eth1
报文从eth0网卡流入,从eth1网卡流出 - 查询:
iptables -vL
中的in,out列可以显示网卡名
- 写法:
- 端口匹配条件
写法 意义 -p tcp [-m tcp] --sport 1234 单端口,模块与协议同名可省略,–dport为目标端口,其前为双横杠 -p tcp --sport 0:100 连续区间, 0:100
与:100
同义,互补区间100:
-p tcp -m multiport --sports 80,443 离散端口,也可 80,90:100
这种写法,注意是复数,–dports - time模块小应用
# 设置防火墙固定时间无法看网页 iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --monthdays 22,23 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT
2.4.2 单机防火墙
-
端口关闭/开放
# 测试机用运行:清空filter的所有链中的规则 iptables -F # 插入filter表INPUT链尾:访问本机的22端口均直接放行,端口必须指定协议 # -I INPUT 1可指定插入行位置 iptables -I INPUT -p tcp --dport 22 -j ACCEPT # 插入filter表INPUT链首:此源主机数据包均直接丢弃不给回复 # 针对所有协议,所以可以ping下测试 iptables -A INPUT -s 192.168.1.102 -j DROP # 添加到最尾部,有白名单效果 iptables -A INPUT -j DROP # 修改INPUT表的默认策略(若无其他ACCEPT策略,将失去ssh连接,常规别修改) # iptables -t filter -P INPUT DROP
以上操作效果:注意顺序,服务器除22端口开放=》源ip为192.168.1.102直接丢弃=》所有包丢弃,中间任一条匹配,后续都不再匹配
-
禁外部ping规则设定机操作
iptables -F # 102若ping当前机,会返回端口不可达,若为DROP,会返回超时 # 此处需加此参数8,否则当前机ping外部的返回报文也被拦截了 iptables -I INPUT -s 192.168.1.102 -p icmp --icmp-type 8 -j REJECT
以上操作效果:注意顺序,源ip为192.168.1.102的ping报文均拒绝=》所有报文均接受(INPUT链默认策略)
-
INPUT链第一条(因匹配频率最高,放首位)
# 常放在INPUT第一条:已建立连接的报文均直接放行 > iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT > iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
状态名 意义 NEW 连接中的第一个包,状态就是NEW,我们可以理解为新连接的第一个包的状态为NEW ESTABLISHED 我们可以把NEW状态包后面的包的状态理解为ESTABLISHED,表示连接已建立 RELATED FTP服务中建立连接后的相关状态 INVALID 如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是INVALID,我们可以主动屏蔽状态为INVALID的报文 UNTRACKED 报文的状态为untracked时,表示报文未被追踪,当报文的状态为Untracked时通常表示无法找到相关的连接
2.4.3 自定义链
- 应用:分类管理过滤条件,docker中大量应用
- 示例过程
> iptables -F # 自定义链名 > iptables -N IN_WEB > iptables -nL # 显示0 references,表示自定义链还没有被任何默认链所引用 Chain IN_WEB (0 references) # 给自定义链添加规则 > iptables -I IN_WEB -s 192.168.1.102 -p icmp -j REJECT # 引用自定义链 > iptables -I INPUT -j IN_WEB # 查看效果 > iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination IN_WEB all -- 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain IN_WEB (1 references) target prot opt source destination REJECT icmp -- 192.168.1.102 0.0.0.0/0 reject-with icmp-port-unreachable
报文流转:报文会从INPUT链进入IN_WEB链,执行完IN_WEB链,若未匹配到任何会返回INPUT链继续执行后续
- 删除自定义链
# 删自定义链,其必须为空 > iptables -F IN_WEB # 自定义链未被任何其他链引用 > iptables -D INPUT 1 # 删自定义链 > iptables -X IN_WEB
- 重命名自定义链:
iptables -E IN_WEB WEB
,引用的链会自动联动更新这个名字
2.4.4 网络防火墙及转发NAT
- 开启核心转发功能
- 临时开启:echo 1 > /proc/sys/net/ipv4/ip_forward,立即生效
- 永久开启:/usr/lib/sysctl.d/00-system.conf文件中net.ipv4.ip_forward设置为1,重启生效
- 防火墙功能(即转发中过滤报文)
# 白名单策略 > iptables -A FORWARD -j REJECT # 过滤语句:看2.1节图,转发数据流向,源地址为此网段,目的端口为80,均放行 > iptables -I FORWARD -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT # 已建立的连接直接放行 > iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
测试网络配置:传送门,比较繁杂,了解过程即可
# centOS7 路由表 > route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0 192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
路由寻址:对应2.1节的路由选择,先用报文的ip匹配路由表的(Destination/Genmask:目的地址/网络掩码),匹配就从相应网卡接口Iface送出去,没找到就从默认网关Flags(UG)送出,完整路由表会有匹配优先级项
- NAT转发功能
- 场景1:局域网有多个客户端,使用一个公网ip访问外网
# DHCP组网的:指定源地址段-s,报文流出的网卡接口,MASQUERADE进行动态的SNAT操作,自动维护nat表 > iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE # 静态ip组网的:效率更高 > iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 公网IP
核心:内网报文在向外网最终发出前,修改报文源ip为节点机器的公网IP,返回的报文会通过节点机维护的nat表找到内网机,2.1节表
- 场景2:局域网有多个服务器,使用一个公网ip给外网提供服务,即反向代理,Nginx和路由器端口映射都可以实现
# 服务器必须静态IP:报文流向是从外网=>PREROUTING =>内网,私网IP:端口号 > iptables -t nat -I PREROUTING -d 公网IP -p tcp --dport 公网端口 -j DNAT --to-destination 192.168.1.123:80
核心:外网报文进入节点机过路由表前,修改报文目标ip为内网指定IP,返回的报文会通过节点机维护的nat表找到外网机,2.1节表
- 场景1:局域网有多个客户端,使用一个公网ip访问外网