firewalld:
1.firewall-cmd:编辑防火墙策略的工具
2.firewalld使用命令行接口配置火墙
(1)firewall-cmd --state ###查看火墙状态
firewall-cmd --get-active-zones ###查看当前活动的域
firewall-cmd --set-default-zone=trusted ###设置默认域为trusted域
firewall-cmd --get-services ###显示所有火墙提供的服务
firewall-cmd --zone=public --list-all ###显示public域的信息
firewall-cmd --get-zones ###显示所有工作域
firewall-config ###图形管理界面
firewall-cmd --list-all-zones ###列出所有工作域的信息
(2)防火墙工作的域以及允许连接的服务ROL
block(限制) ###拒绝所有网络连接
dmz(非军事区) ###仅接受ssh服务
drop(丢弃) ###任何接受的数据包都被丢弃,没有任何回复
external(外部) ###出去的ipv4网络连接通过此区域伪装和转发,仅接受ssh服务
home(家庭) ###仅接受ssh,mdns,ipp-client,samba-client,或dhcpv6-client
internal(内部) ###仅接受ssh,mdns,ipp-client,samba-client,dhcpv6-client
public(公共) ###仅接受ssh,dhcpv6-client
trusted(信任) ###接受所有连接
work(工作) ###仅接受ssh,ipp-client或dhcpv6-client
注意:/usr/lib/firewalld/services/ ###有火墙提供所有服务的信息,以xml(可扩展标记语言)记录
(1)server(双网卡)
eth0:172.25.254.104
eth1:192.168.0.104
firewall-cmd --change-interface=eth1 --zone=trusted ###把eth1加入信任区
firewall-cmd --remove-interface=eth1 ###把eth1从信任区移除
firewall-cmd --add-interface=eth1 --zone=public ###把eth1加入public区
echo 172.25.254.104 > /var/www/html/index.html ###为了区分,的确从eth1
访问到了apache的发布内容,所以把eth0的IP作为默认发布文件
(2)client IP:172.25.254.204
客户端本来不能访问http的默认发布文件,把网卡eth1加入防火墙信任区,客户端就可以通过eth1去访问http
实现了一台主机控制两个工作域,eth1受trusted控制,eth0受public控(客户端本来不能通过172.25.254.204经由服务端的网卡eth1去访问服务端的默认发布文件,但把服务端的eth1加入信任区,即可访问)
4.对源IP的管控
server:(把之前添加到信任区trusted的网卡eth1移除,不然会对下面的实验有影响)
firewall-cmd --add-source=192.168.0.0/24 --zone=trusted ###添加192.168.0.0/24的网段到信任区
firewall-cmd --get-active-zones
ROL
sources: 172.25.0.252/32
public
interfaces: eth0 eth1
trusted
sources: 192.168.0.0/24192.168.0.0/24
client IP:192.168.0.204(192.168.0.0/24网段的源IP已经加入信任区,所以客户端可以访问)
5.防火墙中服务的添加
(1)配置文件的修改
firewall-cmd --zone=public --add-service=http
vim /etc/httpd/conf/httpd.conf
:
Listen 8080
systemctl restart httpd.service
测试:
client IP:172.25.254.204
firefox http://172.25.254.104:8080(把http服务添加到了防火墙,端口改为8080,还是无法访问,因为防火墙的默认文件中http是80端口)
server:
vim /usr/lib/firewalld/services/http.xml
systemctl restart firewalld.service ###重启防火墙服务
成功访问
防火墙添加了http服务,但是火墙默认http端口还是80,修改了火墙默认端口为8080后,就可以访问
(2)端口的添加
server:(把火墙默认端口重新改回成80,不影响后面的实验)
vim /usr/lib/firewalld/services/http.xml ###把默认端口改成80
:80
firewall-cmd --zone=public --add-port=8080/tcp ###添加8080端口,http配置文件也要修改端口为8080
client:
client:ssh@root172.25.254.104 ###先连接server
server:
firewall-cmd --zone=public --permanent --remove-service=ssh ###把ssh服务永久移除
firewall-cmd --reload ###在刷新之前建立的连接,即使已经移除ssh服务,客户端依旧可以和服务端通信
firewall-cmd --complete-reload ###在刷新之前建立的连接,移除服务,完全刷新后断开连接
7.火墙高级规则(直接端口模式添加规则优先应用防火墙高级规则,如果不熟悉iptables,使用直接接口非常危险)firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -s 172.25.254.204 -p tcp --dport 8080 -j REJECT ##从172.25.254.204来的数据包通过8080端口全部拒绝
firewall-cmd --direct --get-all-rules ###查看添加的规则
firewall-cmd --direct --remove-rule ipv4 filter INPUT 0 -s 192.168.0.204 -p tcp --dport 80 -j REJECT ##移除规则
firewall-cmd --direct --add-rule ipv4 filter INPUT 0 ! -s 172.25.254.204 -p tcp --dport 80 -j REJECT ###除了//192.168.0.204,别的都不能访问http
client IP:172.25.254.204成功访问
真机IP:172.25.254.78不能访问
8.端口转发
server:
firewall-cmd --permanent --zone=public --add-forward-port=port=22:proto=tcp:toport=22:toaddr=172.25.254.5 ###通过22端口连接的都转到172.25.254.5
firewall-cmd --permanent --add-masquerade ###开启伪装功能
firewall-cmd --reload ###刷新
client IP:192.168.0.204
连接server,转到172.25.254.78
9.地址伪装
server:
firewall-cmd --permanent --zone=public --remove-forward-port=port=22:proto=tcp:toport=22:toaddr=172.25.254.5
firewall-cmd --permanent --remove-masquerade ###移除伪装功能
firewall-cmd --add-rich-rule='rule family=ipv4 masquerade' ###添加高级规则
client:
ssh root@172.25.254.78 ###连接真机
w -i ##看到是172.25.254.104在连接,实际上是192.168.0.204在连接,实现了地址的伪装
tcpwrap(tcp护照)
白名单权限高于黑名单
vim /etc/hosts.deny
ALL:ALL ##所有服务的所有请求都拒绝,所以真机不能连接服务端
vim /etc/hosts.allow
:
sshd:172.25.254. :spawn echo `date` from %c to %s > /dev/pts/1 ###把登录的信息发送到/dev/pts/0也就是当前所在的shell(ps查看当前设备)
真机连接服务端,直接弹出登录信息
sshd:172.25.254. :spawn echo `date` from %c to %s | mail -s waring root ##把登录的信息发到root的邮箱
在服务端mail查看邮箱
sshd:172.25.254. :spawnecho `date` from %c to %s >> /var/log/messages ##发送到日志
服务端日志显示8:41:19来自于172.25.254.78的ssh连接
sshd:172.25.254. EXPECT 172.25.254.104 ##172.25.254.网段除了172.25.254.104都可以ssh服务
172.25.254.78不能连接服务端
mail ##查看邮箱
ldd /usr/sbin/sshd ###查看sshd的插件,有wrap,selinux,保护ssh服务
服务的连接大致需要通过以下几步权限:
firewalld-->tcpwrap-->守护程序(xinetd)-->service(服务本身)-->selinux-->文件系统的权限
守护进程(xinetd):
yum install telnet -y ###类似于sshd服务,企业6之前使用,要使用telnet-server服务就要安装telnet服务
yum install telnet-server -y ###telnet服务器
yum install xinetd -y ###守护进程
systemctl start xinetd.service ###开启进程
systemctl stop firewalld.service ##关闭火墙,让火墙允许telnet服务,方便下面实验
vim /etc/xinetd.d/telnet
:
service telnet
{
socket_type = stream
protocol = tcp
user = root
server = /usr/sbin/in.telnetd
disable = no
flags = REUSE
wait = no
}
vim /etc/xinetd.conf ###这个是xinetd的主配置文件,受守护进程(xinetd)保护的服务都可以生效,也可以把配置文件写到每个服务里都可以生效
systemctl restart xinetd.service ###重启守护进程
no_access = 172.25.254.204 ###黑名单
only_from = 172.25.254.78 ###白名单
max_load=5 ###最大负载超过系统的百分之五时,崩掉
cps = 3 2 ###并发执行 3表示3秒内不能连接; 2表示同时连接telnet的服务用户数,因为无法同时操控几台主机,这里不再演示
instances = 10 ###最大连接数
per_source = 2###同一客户端(同一ip)最大连接数
chkconfig --list ###查看守护进程管控的服务
telnet localhost | IP ###连接本地,root用户默认黑名单 | 远程通过IP连接
SElinux对端口的影响
查看http开启的端口
vim /etc/httpd/conf/httpd.conf
: Listen 666
systemctl restart httpd ###重启服务不能启动
查看日志,给出了解决方案是selinux的权限问题,
setsebool -P httpd_can_network_connect 1 ###把所有的http端口都开启,显然不安全
可以把自定义端口666,加到selinux允许的http端口
重启http服务成功,同时selinux也没有被关闭,更加安全
删除自定义的http端口666,服务又不能启动了
权限是一层套一层,每一步都很重要,少开启了哪个权限,服务都不能启动,运维重要的就是安全,开启最少的权限能实现要求即可,权限越大越不安全