一.Firewalld域的了解
网络区名称 |
默认配置 |
trusted(信任) |
可接受所有的网络连接 |
home(家庭) |
用于家庭网络,仅接受ssh,mdns,ipp-client,samba-client,dhcpv6-client连接 |
internal(内部) |
用于内部网络,仅接受ssh,mdns,ipp-client,samba-client,dhcpv6-client连接 |
work(工作) |
用于工作区,仅接受ssh,ipp-client,dhcpv6-client服务连接 |
public(工作) |
用于工作区,仅接受ssh,ipp-client,dhcpv6-client服务连接 |
public(工作) |
在公共区域内使用,仅接受ssh或dhcpv6-client服务连接,是firewalld的默认区域 |
external(外部) |
出去的ipv4网络连接通过此区域为伪装或转发,仅接受ssh服务的连接 |
dmz(非军事区) |
仅接受ssh服务的连接 |
block(限制) |
拒绝所有网络的连接 |
drop (丢弃) |
任何接收的网络数据包都被丢弃,没有任何回复 |
二.firewalld的管理
实验环境 : Redhat7
实验主机IP:172.25.254.125
1.使用命令行接口配置防火墙
[root@base1 ~]# systemctl start firewalld
[root@base1 ~]# firewall-cmd --state # 查看火墙状态
running
[root@base1 ~]# firewall-cmd --get-default-zone # 查看火墙控制的域,默认为public
public
[root@base1 ~]# firewall-cmd --get-active-zones # 查看火墙当前生效的域
[root@base1 ~]# firewall-cmd --get-services # 列出可以控制的协议名称
[root@base1 ~]# firewall-cmd --list-all # 列出默认域的所有规则
[root@base1 ~]# firewall-cmd --zone=work --list-all # 查看work域所有规则
[root@base1 ~]# firewall-cmd --zone=public --list-all # 查看public域
[root@base1 ~]# firewall-cmd --list-all-zones # 列出所有域的状态
[root@base1 ~]# firewall-cmd --permanent --remove-service=http # 从默认域中永久移除http服务S
uccess
[root@base1 Desktop]# firewall-cmd --permanent --zone=trusted --add-source=172.25.254.78 # 从172.25.254.78上来的所有数据都是trusted
success
[root@base1 ~]# firewall-cmd --reload # 重新加载firewalld配置文件
success
[root@base1 Desktop]# firewall-cmd --list-all --zone=trusted # 查看
测试(在172.25.254.78这台主机上)
[root@base1 Desktop]# firewall-cmd --permanent --zone=trusted --remove-source=172.25.254.78 # 从trusted表中移除172.25.254.78这台主机
success
[root@base1 Desktop]# firewall-cmd --reload
success
[root@base1 Desktop]# firewall-cmd --permanent --zone=block --add-source=172.25.254.78 # 限制172.25.254.78这台主机连接本机,即当它连接我时,我直接回应拒绝它
success
[root@base1 Desktop]# firewall-cmd --reload
success
[root@base1 Desktop]# firewall-cmd --list-all --zone=block # 查看是否添加成功
测试(在172.25.254.78这台主机上)
[root@base1 Desktop]# firewall-cmd --permanent --zone=block --remove-source=172.25.254.78 # 从block表中移除172.25.254.78这台主机s
uccess
[root@base1 Desktop]# firewall-cmd --reload
success
[root@base1 Desktop]# firewall-cmd --permanent --zone=drop --add-source=172.25.254.78 # 丢弃172.25.254.78这台主机连接本机,即当它连接我时,我一直不给出回应
success
[root@base1 Desktop]# firewall-cmd --reload
success
[root@base1 Desktop]# firewall-cmd --list-all --zone=drop # 查看
测试 (在172.25.254.78这台主机上)
[root@base1 Desktop]# firewall-cmd --remove-interface=eth0 --zone=public # 删除public域上的eth0接口
[root@base1 Desktop]# firewall-cmd --reload
success
[root@base1 Desktop]# firewall-cmd --list-all --zone=trusted
[root@base1 Desktop]# firewall-cmd --add-interface=eth0 --zone=trusted # 把eth0接口添加到trusted策略里
success
[root@base1 Desktop]# firewall-cmd --reload
success
[root@base1 Desktop]# firewall-cmd --list-all --zone=trusted # 查看添加成功
[root@base1 Desktop]# firewall-cmd --get-active-zones # eth0在哪个策略里,哪个策略就生效
[root@base1 Desktop]# firewall-cmd --list-all # 查看public域,eth0已经不在了
[root@base1 Desktop]# firewall-cmd --change-interface=eth0 --zone=public # 修改eth0接口到public域上
success
[root@base1 Desktop]# firewall-cmd --reload
success
[root@base1 Desktop]# firewall-cmd --list-all
[root@base1 Desktop]# firewall-cmd --add-port=8080/tcp --zone=public # 临时添加8080端口,重启就会失效
success
[root@base1 Desktop]# firewall-cmd --list-all # 查看
[root@base1 Desktop]# firewall-cmd --reload # 重新加载
success
[root@base1 Desktop]# firewall-cmd --list-all # 8080端口消失
2.区分–reload和–comlete-reload
--reload # 不断开当前连接
--complete-reload # 把所有的连接中断,并刷新火墙策略
三. 三表五链
1.filter表
input |
Foward |
output |
经过内核 |
通过内核进行路由 |
经过内核 |
2.nat表
input |
prerouting |
postouting |
output |
不经过路由 |
路由前,目的地 地址转换(DNAT) |
路由之后,源地址转换(SNAT) |
不经过路由 |
3.mangle表(当filter和nat表不够用时,来进行说明,几乎不用)
input |
prerouting |
Foward |
postouting |
output |
|
|
|
|
|
4.direct rules # 火墙的高级规则,当某服务服务未开放时才生效
[root@base1 Desktop]# firewall-cmd --list-all
[root@base1 Desktop]# systemctl start httpd
[root@base1 Desktop]# firewall-cmd --direct --get-all-rules # 查看direct rules 里的所有规则
[root@base1 Desktop]# firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp -dport 80 -s 172.25.254.78 -j ACCEPT # 当从78上来的数据访问我本机的80端口时,允许访问,
filter # 添加表
INPUT 1 # 添加第一条链,从上到下依次访问
-p tcp # 添加tcp协议
--dport 80 # 目的地端口为
80-s # 设定被允许访问的ip
-j # 要执行的动作,ACCEPT表示接受,DROP表示丢弃,不回显,REJECT表示拒绝,回显
[root@base1 Desktop]# firewall-cmd --direct --get-all-rules # 查看所有规则
ipv4 filter INPUT 1 -p tcp --dport 80 -s 172.25.254.78 -j ACCEPT
# 测试(在172.25.254.78这台主机上)
[root@base1 Desktop]# firewall-cmd --direct --remove-rule ipv4 filter INPUT 1 -p tcp --dport 80 -s 172.25.254.78 -j ACCEPT # 删除这条规则
[root@base1 Desktop]# firewall-cmd --add-service=ssh # 允许ssh服务对外开放,即允许所有主机连接
[root@base1 Desktop]# firewall-cmd --list-all
[root@base1 Desktop]# firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.78 -j REJECT # 拒绝78这台主机连接,其他主机可以连接
# 测试
[root@foundation78 ~]# ssh [email protected] -X # 在78这台主机上不能连接
ssh: connect to host 172.25.254.125 port 22: Connection refused
[root@base3 Desktop]# ssh [email protected] # 在其他主机上可以连接
[email protected]'s password: Last login: Sun Dec 9 11:05:22 2018 from 172.25.254.178
[root@base1 ~]# ifconfig eth0 # 连接成功
四.端口转发和地址伪装
1.端口转发
[root@base1 Desktop]# firewall-cmd --add-masquerade --permanent # 打开路由功能
[root@base1 Desktop]# firewall-cmd --reload
[root@base1 Desktop]# firewall-cmd --list-all
[root@base1 Desktop]# firewall-cmd --add-forward-port=port=22:proto=tcp:toport=22:toaddr=172.25.254.24
[root@base1 Desktop]# firewall-cmd --list-all
测试
[root@foundation78 ~]# ssh [email protected] -X # 此处输入的密码是转发到的主机的密码,而不是172.25.254.125的密码
[root@foundation24 ~]# ifconfig br0
# 还原环境
[root@base1 Desktop]# firewall-cmd --remove-forward-port=port=22:proto=tcp:toport=22:toaddr=172.25.254.24
[root@base1 Desktop]# firewall-cmd --reload
2.地址伪装
# 配置服务端(添加双网卡)
[root@base1 Desktop]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
[root@base1 Desktop]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
[root@base1 Desktop]# systemctl restart network
[root@base1 Desktop]# ifconfig
[root@base1 Desktop]# firewall-cmd --list-all
# 配置客户端
[root@base3 Desktop]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
1 DEVICE=eth0
2 BOOTPROTO=none
3 ONBOOT=yes
4 IPADDR=192.168.0.225
5 PREFIX=24
6 GATEWAY=192.168.0.125 # 这是路由器ip
[root@base3 Desktop]# systemctl restart network
[root@base3 Desktop]# route -n
[root@base3 Desktop]# ping 172.25.254.78 # 可以ping 通不同网段的主机
[root@base3 Desktop]# ssh [email protected] 也可以连接上
[root@foundation78 ~]# w -i | cat # 客户端连接的78这台主机,查到的却是客户主机路由器的ip,说明伪装成功