TCP/IP数据包进入主机的流程: (协议层拆解肯定就不细说了,这个在计算机网络就有,现在学的是操作系统)
linux有两层防火墙:
1. 封包过滤防火墙:IP Filtering或Net Filter
要进入Linux本机的封包都会先通过Linux核心的预设防火墙,就是称为netfilter的咚咚,简单的说,就是 iptables这个软体所提供的防火墙功能。为何称为封包过滤呢?因为他主要是分析TCP/IP的封包表头来进行过滤的机制,主要分析的是OSI的第二、三、四层,主要控制的就是MAC, IP, ICMP, TCP与UDP的埠口与状态(SYN, ACK...)等
2.第二层防火墙:TCP Wrappers
通过netfilter之后,网路封包会开始接受Super daemons及 TCP_Wrappers的检验,那个是什么呢?说穿了就是/etc/hosts.allow与/etc/hosts.deny的设定档功能啰。这个功能也是针对TCP的Header进行再次的分析,同样你可以设定一些机制来抵制某些IP或Port ,好让来源端的封包被丢弃或通过检验;
PS:透过防火墙的管控,我们可以将大部分来自网际网路的垃圾连线丢弃,只允许自己开放的服务的连线进入本机
即使预设的防火墙是Linux的内建功能,但防火墙主要管理的是MAC, IP, Port等封包表头方面的资讯,如果想要控管某些目录可以进入,某些目录则无法使用的功能,那就得要透过权限以及伺服器软体提供的相关功能了。举例来说,你可以在httpd.conf这个设定档之内规范某些IP来源不能使用httpd这个服务来取得主机的资料,那么即使该IP通过前面两层的过滤,他依旧无法取得主机的资源喔!但要注意的是, 如果httpd这支程式本来就有问题的话,那么client端将可直接利用httpd软体的漏洞来入侵主机,而不需要取得主机内root的密码!因此主机开启的服务也可能存在漏洞。
因此躲避服务漏洞攻击的做法:
常见端口列表:
端口:
特权端口 : 需要取得root权限的端口 , 值小于1024
浏览器发送数据访问时,特定的80端口(通讯规范)就是httpd服务,而client则是用户这边的系统随机一个端口,不属于特权,端口值大于1024。
所谓的『监听』是某个服务程式会一直常驻在记忆体当中,所以该程式启动的port就会一直存在。只要伺服器软体启动的埠口不同,那就不会造成冲突。当用户端连接到此伺服器时,透过不同的埠口,就可以取得不同的服务资料啰。
端口查看命令: netstat [-tulnp]
端口也是一个程序,要关闭端口直接用kill 命令即可。
查看时,像 0.0.0.0:22 这样的IP/端口信息很多,这些网路服务其实仅针对本机的IO开放而已,网际网路是连接不到该埠口与服务的。
虽然端口也是一种程序,可以kill掉,但也可以通过停掉服务程序的方式关掉这个端口,直接systemctl stop 服务则对应的端口就关闭了。
因此,启动端口也就启动相应服务就可以了,一样使用systemctl系统服务命令工具。
防火墙:
相较于企业内网,外部的公网环境更加恶劣,罪恶丛生。在公网与企业内网
之间充当保护屏障的防火墙虽然有软件或硬件之分,但主要功能都是依据策略对
穿越防火墙自身的流量进行过滤。防火墙策略可以基于流量的源目地址、端口号、协议、应用
等信息来定制,然后防火墙使用预先定制的策略规则监控出入的流量,若流量与某一条策略
规则相匹配,则执行相应的处理,反之则丢弃。这样一来,就可以保证仅有合法的流量在企业
内网和外部公网之间流动了。
注意:RHEL 7 系统中,firewalld 防火墙取代了 iptables 防火墙。所以,只要学习这一款工具就足够了。因为配置防火墙的策略思想基本是一样的。
防火墙中的策略是从上到下加载的,并且当策略默认是拒绝所有流量时,就要设置某些放行(否则全部拒绝),默认放行流量时,就要设置拒绝(否则全部放行)。
查看 firewalld 服务当前所使用的区域:
[root@linuxprobe ~]# firewall-cmd --get-default-zone
public
查询 eno16777728 网卡在 firewalld 服务中的区域:
[root@linuxprobe ~]# firewall-cmd --get-zone-of-interface=eno16777728
public
把 firewalld 服务中 eno16777728 网卡的默认区域修改为 external,并在系统重启后生效。分
别查看当前与永久模式下的区域名称:
[root@linuxprobe ~]# firewall-cmd --permanent --zone=external --change-interface=
eno16777728
success
[root@linuxprobe ~]# firewall-cmd --get-zone-of-interface=eno16777728
public
[root@linuxprobe ~]# firewall-cmd --permanent --get-zone-of-interface=eno16777728
external
把 firewalld 服务的当前默认区域设置为 public:
[root@linuxprobe ~]# firewall-cmd --set-default-zone=public
success
[root@linuxprobe ~]# firewall-cmd --get-default-zone
public
启动/关闭 firewalld 防火墙服务的应急状况模式,阻断一切网络连接(当远程控制服务器
时请慎用):
[root@linuxprobe ~]# firewall-cmd --panic-on
success
[root@linuxprobe ~]# firewall-cmd --panic-off
success
查询 public 区域是否允许请求 SSH 和 HTTPS 协议的流量:
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=https
no
把 firewalld 服务中请求 HTTPS 协议的流量设置为永久允许,并立即生效:
[root@linuxprobe ~]# firewall-cmd --zone=public --add-service=https
success
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-service=https
success
[root@linuxprobe ~]# firewall-cmd --reload
success
把 firewalld 服务中请求 HTTP 协议的流量设置为永久拒绝,并立即生效:
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --remove-service=http
success
[root@linuxprobe ~]# firewall-cmd --reload
success
把在 firewalld 服务中访问 8080 和 8081 端口的流量策略设置为允许,但仅限当前生效:
[root@linuxprobe ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[root@linuxprobe ~]# firewall-cmd --zone=public --list-ports
8080-8081/tcp
把原本访问本机 888 端口的流量转发到 22 端口,要且求当前和长期均有效:
firewall-cmd --permanent --zone=< > --add-forward-port=port=
< >:proto=< >:toport=< >:toaddr=< IP >
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-forward-port=
port=888:proto=tcp:toport=22:toaddr=192.168.10.10
success
[root@linuxprobe ~]# firewall-cmd --reload
success
在客户端使用 ssh 命令尝试访问 192.168.10.10 主机的 888 端口:
[root@client A ~]# ssh -p 888 192.168.10.10
The authenticity of host '[192.168.10.10]:888 ([192.168.10.10]:888)' can't
be established.
ECDSA key fingerprint is b8:25:88:89:5c:05:b6:dd:ef:76:63:ff:1a:54:02:1a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.10.10]:888' (ECDSA) to the list of known hosts.
[email protected]'s password: root
Last login: Sun Jul 19 21:43:48 2017 from 192.168.10.10
firewalld 中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端
口号、源地址和目标地址等诸多信息进行更有针对性的策略配置。它的优先级在所有的防火
墙策略中也是最高的。比如,我们可以在 firewalld 服务中配置一条富规则,使其拒绝
192.168.10.0/24 网段的所有用户访问本机的 ssh 服务(22 端口):
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-rich-rule="
rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"
success
[root@linuxprobe ~]# firewall-cmd --reload
success
在客户端使用 ssh 命令尝试访问 192.168.10.10 主机的 ssh 服务(22 端口):
[root@client A ~]# ssh 192.168.10.10
Connecting to 192.168.10.10:22...
Could not connect to '192.168.10.10' (port 22): Connection failed.
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 969/rpcbind
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 969/rpcbind
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 969/rpcbind
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 969/rpcbind
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 969/rpcbind
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 969/rpcbind
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 969/rpcbind