1、概述
动态防火墙后台程序 firewalld提供了一个动态管理的防火墙,用以支持网络 “zones”,以分配对一个网络及其相关链接和界面一定程度的信任。它具备对ipv4和ipv6防火墙设置的支持。支持以太网桥,并有分离运行时间和永久性配置选择。还具备一个通向服务或者应用程序以直接增强防火墙规则的接口。
防火墙
三表五链,即三张表,五条链
五条链:input, output, prerouting, postouting, forward
三张表:filter ,nat, mangle
filter中包括input, output,forward ##要进入内核处理
nat中包括input, output, prerouting, postouting ##只是经过,不需要内核处理,postouting是源地址解析,即先看到ip地址然后对ip地址进行转换,路由之后。prerouting是目的地址解析,即对看到的ip先转换,然后在进入,在路由之前。
mangle中包括input, output, prerouting, postouting, forward ##附加的权限
有两种对防火墙的配置方式:firewalld和iptables,二者之间的本质不同在于iptables在/etc/sysconfig/iptables中存储配置,firewalld将配置存储在/usr/lib/firewalld/和/etc/firewalld/中的各种xml文件里。
2、管理SELinux端口标签
semanage port -a -t http_port_t -p tcp 6666 ##添加6666端口
semanage port -d -t http_port_t -p tcp 6666 ##删除6666端口
semanage port -l |grep http ##列出apache端口列表
semanage port -l ##列出所有端口
实验:
服务机上
getenforce
Enforcing
yum install httpd -y
semanage port -l |grep http ##查看端口列表
vim /etc/httpd/conf/httpd.conf
42 Listen 6666 ##修改apache端口为6666
systemctl restart httpd
Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details. ##服务不能正常启动
semanage port -a -t http_port_t -p tcp 6666 ##添加6666端口,-a表示添加
semanage port -l |grep http ##查看端口
systemctl restart httpd ##重启apache服务,正常启动
vim /etc/httpd/conf/httpd.conf
42 Listen 80 ##修改为默认80端口
systemctl restart httpd
semanage port -d -t http_port_t -p tcp 6666 ##删除6666端口,-d表示删除
semanage port -l |grep http
3、firewalld
配置防火墙的命令
搭建环境
147主机两块网卡 172.25.254.147 和1.1.1.147
另一台主机 1.1.1.247
启用firewalld
systemctl start firewalld
systemctl enable firewalld
systemctl disable firewalld
systemctl stop firewalld ##关闭
-
firewalld的配置命令
firewall-cmd --state ##查看防火墙状态 firewall-cmd --get-active-zones ##查看当前活跃的域 firewall-cmd --get-default-zone ##查看默认域
firewall-cmd --get-zones ##查看所有域
firewall-cmd --zone=public --list-all ##查看public域运行的列表
firewall-cmd --list-all ##查看默认域允许的列表
firewall-cmd --get-services ####查看所有可设置的服务
firewall-cmd --list-all-zones ##查看所有域的管理范围信息
firewall-cmd --set-default-zone=work ##修改火墙的域
firewalld的域
firewall-cmd --zone=trusted --add-source=172.25.254.47 ##47使用trusted域,其他使用默认
firewall-cmd --get-active-zones
firewall-cmd --zone=public --remove-interface=eth1 ##eth1从public上去掉
firewall-cmd --zone=trusted --add-interface=eth1 ##eth1使用trusted域
firewall-cmd --list-all --zone=trusted ##看trusted域的列表
firewall-cmd --list-all --zone=public
firewall-cmd --add-service=dns ##临时添加dns
firewall-cmd --remove-service=dns ##临时删除dns
firewall-cmd --remove-service=dns --permanent ##永久删除
firewall-cmd --reload ##重启服务
firewall-cmd --complete-reload ##重启服务,当前连接断开
-
Direct Rules
通过firewall-cmd 工具,可是使用 --direct选项在运行时间里增加或者移除链。直接端口模式是用于服务或者程序,以便在运行时间内增加特定的防火墙规则firewall-cmd --list-all ##查看
firewall-cmd --remove-service=ssh ##临时删除使用ssh服务
firewall-cmd --list-all
firewall-cmd --direct --get-all-rules ##显示添加的规则
iptables -t filter -nL ##查看防火墙的表链中的现有设定
实验,先临时删除ssh,47测试,进行配置,47测试,实验结束重启服务,恢复临时删除的ssh服务
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.47 -j ACCEPT ##只有47主机可以使用ssh,-s表示数据来源,1表示优先级第一位,ACCEPT表示允许,--dport指端口,22即ssh的端口
firewall-cmd --direct --get-all-rules
在47上测试:
firewall-cmd --direct --remove-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.47 -j ACCEPT ##删除47主机使用ssh
在47上测试:
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 22 ! -s 172.25.254.47 -j ACCEPT ##除了47其他的都能使用
在47上测试:
在247上测试:
firewall-cmd --direct --remove-rule ipv4 filter INPUT 1 -p tcp --dport 22 ! -s 172.25.254.47 -j ACCEPT ##删除除了47其他的都能使用
3)Rich Rules
通过“rich language”语法,可以用比直接接口方式更易理解的方法建立复杂防火墙规则。此外,还能永久保留设置。这种语言使用关键词值,是iptables工具的抽象表示。这种语言可以用来配置分区,也仍然支持现行的配置方式
4、iptables
启用iptables
systemctl start iptables ##启用
systemctl stop iptables ##关闭
systemctl mask iptables ##上锁
1)基本配置 可扩展工作语言xml语言,系统中做数据封装
-t ##指定表名称
-n ##不做解析
-L ##列出制定表中的策略
-A ##增加策略
-p ##网络协议
--dport ##端口
-s ##数据来源
-j ##动作
ACCEPT ##允许
REJECT ##拒绝
DROP ##丢弃
-N ##增加链
-E ##修改链名称
-X ##删除链
-D ##删除指定策略
-I ##插入
-R ##修改策略
-P ##修改默认策略
iptables -nL ##查看
iptables -F ##把策略刷新掉,刷掉之前的
service iptables save ##保存当前策略
iptables -P INPUT DROP ##修改默认,只有ACCEPT和 DROP两种
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT ##设置所有都可以使用22端口
iptables -A INPUT -p tcp --dport 22 -s 172.25.254.47 -j ACCEPT ##设置47可以使用22端口,此处没有加-t filter是因为默认在filter表中
iptables -D INPUT 2 ##删除第二条策略
iptables -I INPUT 1 -s 172.25.254.47 -p tcp --dport 22 -j ACCEPT ##第一条插入策略
iptables -R INPUT 1 -s 172.25.254.250 -p tcp --dport 22 -j ACCEPT ##替换掉第一条策略
iptables -N redhat ##增加链
iptables -E redhat WESTOS ##修改链名称
iptables -X WESTOS ##删除链
2)伪装与转发
<1>伪装
实验
双网卡147主机
iptables -t nat -nL
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.147 ##设置从eth0出时,地址伪装为172.25.254.147, POSTROUTING路由后伪装,即先看到路由然后伪装
iptables -t nat -nL
sysctl -a |grep forward ##查看内核路由功能是否开启
net.ipv4.ip_forward = 1 ##1表示开启
如果不是1,修改为1
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
在247主机
修改网关为1.1.1.147
ssh 172.25.254.47 ##连接47主机
在47主机 w -i
看到147主机连接,但是实际是1.1.1.247主机连接的
ssh 172.25.254.147
连接到147主机而不是1.1.1.247主机
<2>转发
双网卡主机
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-dest 1.1.1.247 ##PREROUTING表示设置从eth0进的地址先伪装成1.1.1.247,再进入。此处即端口转发
iptables -t nat -nL
在47主机再次连接172.25.254.147
连接到的实际是1.1.1.247主机
3)
iptables -F ##刷新掉之前配置
iptables -nL ##查看
service iptables save ##保存
iptables -A INPUT -i lo -m state --state NEW -j ACCEPT ##允许本机回环访问
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ##允许正在访问和之前访问过的
cat /etc/services |grep iscsi ##查看服务的端口
iptables -A INPUT -m state --state NEW -p tcp --dport 445 -j ACCEPT ##允许samba
iptables -A INPUT -m state --state NEW -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 3260 -j ACCEPT ##允许iscsi
iptables -A INPUT -m state --state NEW -j REJECT ##其余的拒绝
iptables -t nat -F
iptables -t nat -nL
测试: