该Linux运维笔记纯手打,所有命令都是在学习Linux时总结出来的,包括排版,摒弃用不到的命令,其主要目的是在生产环境中能够快速的定位并查询需要命令的参数,能够高效工作。
文章声明
该系列文章部分文字描述,整理于以下文献,化繁为简.
《鸟哥的Linux私房菜 (基础学习篇 第三版)》 - 作者:鸟哥
《Linux就该这么学》 - 作者:刘遄
Iptables的前身叫ipfirewall,这是一个作者从FreeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具.但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的).当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能.
IPTABLES是与 3.5 版本 Linux 内核集成的 IP 信息包过滤系统,如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器,则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置.
网络安全设备的分类:
基础类防火墙:通过数据包过滤加固服务器
IDS类防火墙:入侵检测系统,没有防护能力,仅仅提供事后日志的报告
IPS类防火墙:入侵防御系统
主动安全类防火墙:waf和daf
云盾:相当于代理服务器,有大量带宽,和性能,普通攻击无效
关于常见的DDOS攻击:
SYN攻击:发起最小syn包,通过频繁发送大量数据包,导致CPU消耗殆尽
CC攻击:请求大量请求,通过http协议发起大量正常连接,导致内存消耗殆尽
长连接攻击:通过http1.1协议,建立正常通信,一点一点的发送请求,导致网络带宽消耗殆尽
UDP攻击:DNS攻击,向DNS一直发送解析请求,导致瘫痪
死亡Ping:把你的外网带宽占满,正常主机就无法访问
QPS:代表每秒攻击数
防火墙的安装位置:
工作在主机边缘处或工作在网络边缘处,根据自定义规则或者默认规则对数据报文操作的组件
如果路由器性能比防火墙好,应把路由器放在前面(让路由器抗压)
如果防火墙性能比路由器好,应把防火墙放在前面(让交换机抗压)
如果装在主机与交换机之间,可以隔离内网,但一般不这样配置,不方便
Iptables 防火墙
Iptables的前身叫ipfirewall,这是一个作者从FreeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具,虽然现在新版系统中早已不在使用Iptables了,但时至今日其还具有顽强的生命力.
替换系统默认防火墙: 在Centos7系统中默认防火墙管理工具不是iptables,执行命令替换一下.
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# yum install -y iptables iptables-services
[root@localhost ~]# systemctl restart iptables
[root@localhost ~]# systemctl enable iptables
查询规则: 使用 -L -n --line-numbers
参数查看防火墙默认配置规则.
[root@localhost ~]# iptables -L -n --line-numbers
[root@localhost ~]# iptables -F # 临时清空规则
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
设置默认拒绝: 设置默认拒绝规则,把 INPUT
链设置为默认拒绝,也就是拒绝所有连接请求.
[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP) #这里可以看出INPUT链已变成DROP
num target prot opt source destination
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
开启ICMP: 在默认规则拒绝的情况下,设置开启ICMP测试,允许主机ping通.
[root@localhost ~]# iptables -I INPUT -p icmp -j ACCEPT
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
允许SSH连接: 在默认拒绝的情况下,设置开启22号端口,允许远程ssh连接到本机.
[root@localhost ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -I OUTPUT -p tcp --sport 22 -j ACCEPT
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22
删除指定规则: 在默认拒绝的情况下,删除INPUT链,第2条数据,删除ICMP规则.
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
[root@localhost ~]# iptables -D INPUT 2
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
指定允许网段访问: 在默认拒绝的情况下,设置只允许192.168.1.0/24
网段的主机访问本机的22号端口.
[root@localhost ~]# iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -I OUTPUT -s 192.168.1.0/24 -p tcp --sport 22 -j ACCEPT
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp dpt:22
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp spt:22
拒绝访问指定端口: 在INPUT规则链中,添加拒绝所有人访问本机的8888号端口.
[root@localhost ~]# iptables -I INPUT -p tcp --dport 8888 -j REJECT
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8888 reject-with icmp-port-unreachable
2 ACCEPT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp dpt:22
拒绝访问指定主机网段的端口: 在INPUT规则链中,添加拒绝192.168.1.20
主机访问本机的80端口.
[root@localhost ~]# iptables -I INPUT -p tcp -s 192.168.1.20 --dport 80 -j REJECT
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 REJECT tcp -- 192.168.1.20 0.0.0.0/0 tcp dpt:80 reject-with icmp-port-unreachable
2 REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8888 reject-with icmp-port-unreachable
3 ACCEPT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp dpt:22
拒绝访问指定端口范围: 在INPUT规则链中,添加拒绝所有主机访问本机1000-2000端口.
[root@localhost ~]# iptables -A INPUT -p tcp --dport 1000:2000 -j REJECT
[root@localhost ~]# iptables -A INPUT -p udp --dport 1000:2000 -j REJECT
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 REJECT tcp -- 192.168.1.20 0.0.0.0/0 tcp dpt:80 reject-with icmp-port-unreachable
2 REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8888 reject-with icmp-port-unreachable
3 ACCEPT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp dpt:22
4 REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:1000:2000 reject-with icmp-port-unreachable
5 REJECT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpts:1000:2000 reject-with icmp-port-unreachable
SNAT-源地址转换<内网-->公网>: 从本地发出的数据包,经过SNAT后,会自动伪装成公网的IP,并以公网IP访问指定服务.
#例:将本地 192.168.1.1 的请求自动伪装成外网地址 59.110.167.234
[root@localhost ~]# iptables -t nat -A POSTROUTING -o ens32 -s 192.168.1.1 -j SNAT --to-source 59.110.167.234
-o #指定外网接口,此处为ens32
-s #指定内网口地址,此处为192.168.1.1
--to-source #外网口的地址
DNAT-目标地址转换<公网-->内网>: 从公网接收的数据包,经过DNAT后,会自动将数据包转到指定的内网主机.
#例:将请求 59.110.167.234 且端口为 80 的数据包,自动映射到内网 192.168.1.10
[root@localhost ~]# iptables -t nat -A PREROUTING -i ens32 -d 59.110.167.234 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10
--to-destination #内网口地址,此处为192.168.1.1
-i #绑定外网接口,此处为ens32
-d #外网地址,此处为8.8.8.8
-dport #内网端口,此处为80
配置基本防火墙规则: 我们可以在新安装的系统中依次执行下方代码,来配置一个基本的防火墙规则.
# 删除已有规则
iptables --delete-chain
iptables --flush
# 默认禁止进,允许出,允许回环网卡
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的或相关连接的通行
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 限制80端口443端口的单个IP的最大连接数为10
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j DROP
iptables -I INPUT -p tcp --dport 443 -m connlimit --connlimit-above 10 -j DROP
# 允许80(HTTP)/873(RSYNC)/443(HTTPS)/20,21(FTP)/25(SMTP)端口的连接
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 873 -j ACCEPT
# 允许SSH端口的连接,放行SSH端口
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
# 允许ping
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
# 放行允许DNS解析端口
iptables -A OUTPUT -p udp -m udp -d 8.8.8.8 --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp -m udp -d 114.114.114.114 --dport 53 -j ACCEPT
# 保存规则
iptables-save
其他常用总结: 下面是收藏的一些生成环境下常用规则的配置.
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT #放行80端口
iptables -t filter -I INPUT -p tcp --dport 443-j ACCEPT #插入在顶端一条放行443端口的规则
iptables -t filter -I INPUT 2 -p tcp --dport 443 -j ACCEPT #在第二列插入一条443放行规则
iptables -t filter -A INPUT -p tcp --dport 80 -j DROP #丢弃80端口的请求
iptables -I INPUT 2 -p icmp -j DROP #丢弃ICMP请求
iptables -t filter -D INPUT 3 #删除第三条规则
iptables -t filter -P INPUT DROP #设置默认规则,拒绝所有
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT #放行80口
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT #放行22口
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT #放行22口
iptables -A FORWARD -s 192.168.1.10 -j REJECT #拒绝IP的转发请求
iptables -I INPUT -s 10.20.30.0/24 -j DROP #丢弃IP网段的入站请求
iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP #丢弃从eth1网卡流入,且地址匹配的数据包
iptables -A INPUT -o eth0 -s 192.168.1.0/24 -j DROP #丢弃从eth0网卡流出,且地址匹配的数据包
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT #放行20-21端口的数据包
iptables -I INPUT -p tcp -m multiport --dport 80-90,85 -j ACCEPT
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.10-192.168.1.100 -j ACCEPT
firewall 防火墙
在Centos7系统中默认集成了许多防火墙,其中firewalld服务是默认的防火墙工具,它拥有基于CLI和基于GUI的两种工作方式,相比于iptables防火墙firewall支持动态更新的技术并且加入的区域(zone)相关的概念.简单来说,区域就是firewall预先准备了几套防火墙策略的集合,从而实现防火墙之间策列的快速切换技术,从而极大地提升了防火墙的快速切换应用效率.
区域 | 默认策略规则 |
---|---|
trusted | 允许所有数据包 |
home | 拒绝流入流量,但是与ssh,mdns,ipp-client,dhcpv6-client服务则允许通过 |
internal | 等同于home区域 |
work | 拒绝流入流量,但是与ssh,ipp-client,dhcpv6-client服务则允许通过 |
public | 拒绝流入流量,但是与ssh,ipp-client,dhcpv6-client服务则允许通过 |
external | 拒绝流入流量,但是与ssh服务相关则允许通过 |
dmz | 拒绝流入流量,但是与ssh服务相关则允许通过 |
block | 拒绝流入流量,除非与流出的流量相关 |
drop | 拒绝流入流量,除非与流出的流量相关 |
状态显示相关:
[root@localhost ~]# firewall-cmd --state #显示运行状态
[root@localhost ~]# firewall-cmd --get-zones #显示所有zone区域
[root@localhost ~]# firewall-cmd --get-active-zones #显示当前使用的区域
[root@localhost ~]# firewall-cmd --get-default-zone #显示默认使用的区域
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32 #查看ens32网口的区域
[root@localhost ~]# firewall-cmd --zone=public --list-ports #显示public区域所有开放的端口
常用配置相关:
[root@localhost ~]# firewall-cmd --panic-on #拒绝所有包
[root@localhost ~]# firewall-cmd --panic-off #取消拒绝状态
[root@localhost ~]# firewall-cmd --query-panic #查看是否拒绝
查询服务相关:
[root@localhost ~]# firewall-cmd --get-services #显示服务列表
[root@localhost ~]# firewall-cmd --list-service #查询当前放行服务
[root@localhost ~]# firewall-cmd --reload #重新加载防火墙
[root@localhost ~]# firewall-cmd --add-service=nfs #临时允许nfs服务通过
[root@localhost ~]# firewall-cmd --add-service=nfs --permanent #永久允许nfs服务通过
端口管理相关:
[root@localhost ~]# firewall-cmd --add-port=443/tcp #临时开启443端口
[root@localhost ~]# firewall-cmd --add-port=3306/tcp --permanent #永久开启3306端口
[root@localhost ~]# firewall-cmd --remove-port=443/tcp #删除443端口
[root@localhost ~]# firewall-cmd --list-all #显示所有端口列表
[root@localhost ~]# firewall-cmd --add-service=mysql #开放mysql端口
[root@localhost ~]# firewall-cmd --remove-service=http #阻止http端口
[root@localhost ~]# firewall-cmd --list-services #查看开放的服务
[root@localhost ~]# firewall-cmd --add-port=3306/tcp #开放通过tcp访问3306
[root@localhost ~]# firewall-cmd --remove-port=80/tcp #阻止通过tcp访问3306
[root@localhost ~]# firewall-cmd --add-port=233/udp #开放通过udp访问233
[root@localhost ~]# firewall-cmd --list-ports #查看开放的端口
端口转发:
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 #将80端口的流量转发至8080
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.1.1.1 #将80端口的流量转发至192.168.1.1
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.1.1:toport=8080 #将80端口的流量转发至192.168.1.1的8080
区域查询: 查询firewall服务当前所使用的区域.
[root@localhost ~]# firewall-cmd --get-default-zone
public
特定区域查询: 查看ens32网卡的所在区域信息.
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32
public
修改默认区域: 修改ens32的public区域到external区域,并永久生效.
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32
public
[root@localhost ~]# firewall-cmd --zone=external --change-interface=ens32
[root@localhost ~]# firewall-cmd --zone=external --change-interface=ens32 --permanent
success
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32
external
设置默认区域: 把当前服务的默认区域设置为external.
[root@localhost ~]# firewall-cmd --get-default-zone
public
[root@localhost ~]# firewall-cmd --set-default-zone=external
success
[root@localhost ~]# firewall-cmd --get-default-zone
external
请求查询: 查询public区域是否允许请求SSH和HTTPS协议的流量.
[root@localhost ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@localhost ~]# firewall-cmd --zone=public --query-service=https
no
允许请求设置: 把public区域的https请求,永久允许通过.
[root@localhost ~]# firewall-cmd --zone=public --add-service=https
success
[root@localhost ~]# firewall-cmd --zone=public --add-service=https --permanent
success
拒绝请求设置: 把public区域的https请求,设置为永久拒绝.
[root@localhost ~]# firewall-cmd --zone=public --remove-service=https
success
[root@localhost ~]# firewall-cmd --zone=public --remove-service=https --permanent
success
放行端口: 临时放行8080端口,和8081端口.
[root@localhost ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[root@localhost ~]# firewall-cmd --zone=public --list-ports
8080-8081/tcp
端口转发: 在192.168.1.0/24
网络中的系统,访问本地端口5423
将被转发到本地的80
端口.
[root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.0/24 forward-port port=5423 protocol=tcp to-port=80' --permanent
放行端口: 另一种放行方法放行本地的3260端口.
[root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.0/24 port port=3260 protocol=tcp accept'
放行服务: 另一种方法,放行https服务数据包通过.
[root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.0/24 service name=httpd accept'
[root@localhost ~]# firewall-cmd --list-rich-rule
rule family="ipv4" source address="192.168.1.0/24" service name="https" accept
其他服务:
# 允许/移除 192.168.1.10 所有访问所有端口
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" accept' --permanent
firewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" accept' --permanent
firewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" drop' --permanent
# 允许/移除 192.168.2.0/24(0-255)所有访问所有端口
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.2.0/24" accept' --permanent
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject' --permanent
firewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject' --permanent