linux的火墙策略优化
实验环境
三台主机, 一个双网卡 ,两个单网卡
双网卡主机设定两个网段,192.168.43.100(和windows一个网段),172.25.254.100
单网卡主机 172.25.254.200
单网卡主机 192.168.43.79
数据库管理原理
iptables用来管理netfilter这个包,netfilter是内核上面数据过滤的一个插件。
iptables{firewalld iptables}两种控制方式。
企业七之前没有firewalld
iptables更趋近于对表格的管理,会精确到表得到每一条连接
火墙管理方式的切换
-
从firewall切换到iptables
dnf install iptables-services -y systemctl stop firewalld systemctl disable firewalld systemctl mask firewalld systemctl enable --now iptables ##此时就已经切换到iptables管理 iptables -nL用来查看
- 从iptables切换到firewall
systemctl stop iptables
systemctl disable --now iptables
systemctl mask iptables
systemctl unmask firewalld
systemctl enable --now firewalld
关于firewalld的域
trusted ##接受所有的网络连接
home ##用于家庭网络,允许接受ssh mdns ipp-client samba-client dhcp-client
work ##工作网络 ssh ipp-client dhcp-client
public ##公共网络 ssh dhcp-client
dmz ##军级网络 ssh
block ##拒绝所有
drop ##丢弃,所有数据全部丢弃无任何回复
internal ##内部网络 ssh madn ipp-client samba-client dhcp-client
external ##ipv4网络地址伪装转发 sshd
firewalld的管理方式
firewalld用域来进行管理,域就是管理的集合,在/etc/firewalld/zones中有文件,删掉这些文件相当于使用了命令进行了管理删除
把域设定成不同的样子,能访问的也不同
firewall-cmd --state ##查看火墙状态
firewall-cmd --get-default-zone ##查看默认域
firewall-cmd --get-active-zone ##查看当前火墙中生效的域
firewall-cmd --list-all ##查看默认域中的火墙策略
firewall-cmd --list-all --zone=work ##查看指定域中的火墙策略
firewall-cmd --list-all-zones ##列出所有域的信息
firewall-cmd --get-zones ##查看可以用的域
firewall-cmd --set-default-zone=trusted ##设定默认域,改了就生效,而且是永久的。但是在/etc/firewalld/zones中并没有显示出来。
firewall-cmd --permanent --add-service=ssh ##当我们添加一个设备的时候才会出现文件。实际上在我们更改域的时候,他是在/lib/firewalld中进行变化的。
--permanent的意思就是永久更改,并且保存在/etc/firewalld/zones中。
firewall-cmd --get-services ##查看所有允许的服务
firewall-cmd --add-service=http ##改了就生效,在浏览器可以访问生效,但是这是一次性的
firewall-cmd --reload ##输入此命令之后,上述修改就会消失
firewall-cmd --permanent --add-service=http ##使用此命令进行永久修改,修改之后需要进行reload
firewall-cmd --reload ##输入此命令让上述命令生效
firewall-cmd --permanent --remove-service=http ##移除服务
端口:
vim /etc/httpd/conf/httpd.conf
8080
systemctl restart httpd
netstat -antlupe | grep httpd
firewall-cmd --permanent --add-service=http ##开启了httpd服务,但是在/lib/firewalld/services/http.xml中默认的端口是80
firewall-cmd --reload
firewall-cmd --list-all ##此时在浏览器访问是不能访问到的
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
firewall-cmd --list-all ##此时在浏览器中可以访问到
firewall-cmd --permanent --remove-port=8080/tcp ##取消这个端口
firewall-cmd --permanent --add-source=172.25.254.0/24 --zone=block
firewall-cmd --reload
firewall-cmd --list-all --zone=block
firewall-cmd --permanent --remove-source=172.25.254.0/24 --zone=block
firewall-cmd --permanent --remove-interface=ens192 --zone=public
firewall-cmd --permanent --add-interface=ens192 --zone=trusted
firewall-cmd --reload
firewall-cmd --list-all
firewall-cmd --list-all --zone=trusted
firewall-cmd --permanent --change-interface=ens192 --zone=public ##一次性修改,不用先移除。
##火墙打开了,这些服务都保存在/etc/firewalld/zones这个目录中
##查看可用的域
##部署实验内容
火墙的三张表五条链及高级规则
某一个服务,只让某一个人不能访问,或者只能让某一个人访问。
火墙的内部规则,有三张表五条链。
-
高级规则
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 1 -p tcp --dport 80 -s 192.168.43.200 -j REJEC ##不允许ip为192.168.43.200的这个主机访问端口为80的服务 firewall-cmd --reload firewall-cmd --direct --get-all-rules ##查看规则
snat 172.25.254.0/24网段访问192.168.43.0/24
dnat 192.168.43.0/24网段访问172.25.254.0/24原地址转换:
在双网卡主机中:
打开地址伪装:firewall-cmd --permanent --add-masquerade firewall-cmd --reload firewall-cmd --list-all
打开内核路由功能:
sysctl -a | grep ip_forward ##如果是1,就表示已经打开,如果没开表示这个双网卡不在一个网段,是不能通信的,这个要可以通信依赖于一个内核路由功能 vim /etc/sysctl.conf ##如果是0,就编辑这个而文件为1 sysctl -p 让其生效
网关就是在双网卡中和单网卡属于同一个网段的ip。如果是172.25.254.9到192.168.43.200,我们就应该在192中设定网关192.168.43.100:
route -n ##查看网关 ip route add default via 192.168.43.100 ##临时添加网关,网卡重新启动,就会不见。
此时设定完成,在192单主机中。ping 172.25.254.9的单网卡主机,可以ping通,且可以连接ssh这个172.25.254.9
切换到172.25.254.9可以用w - i 查看是谁连接了他,此时 发现是172.25.254.100.目的地地址转换:
此时使用ssh @root172.25.254.100,发现真的连接到了172.25.254.100,但是我们需要转接到192.168.43.200,172.25.254.100只是有一个转接的作用,这就是目的地地址转换:firewall-cmd --permanent --add-forward-port=proto=tcp:port=22:toport=22:toaddr=192.168.43.200 firewall-cmd --reload firewall-cmd --list-all
此时在172.25.254.9上ssh root@172.25.254.100 发现连接到了192.168.43.200
iptables命令的基本使用方法
systenctl stop firewalld
systemctl disable firewalld
systemctl mask firewalld
systemctl enable iptables.service
/etc/sysconfig/iptables ##这个是他的策略文件
iptables -nL ##查看,n表示不做解析
iptables -F ##刷新
systemctl restart iptables.service ##重启
iptables -nL ##查看,发现没有保存之前的火墙策略。
iptables-save > /etc/sysconfig/iptables
service iptables save ##刷新之后,可以用这两种保存的方式,保存下来。
默认策略的5条链:
input ##输入
output ##输出
forward ##转发
postrouting ##路由之后
prerouting ##路由之前
默认的3张表:
filter ##经过本机内核的数据(input,output,forward)
nat ##不经过内核的数据(input,output,postrouting,prerouting)
mangle ##当上面的两个表不够用的时候使用
iptable命令
iptables
-t ##指定表的名称
-n ##不做解析
-L ##查看
-A ##添加策略
-p ##协议
--dport ##目的地端口
-s ##来源
-j ##动作
# ACCEPT允许
#DROP丢弃
#REJECT拒绝
#SNAT原地址转换
#DNAT目的地址转换
-N ##新建链
-E #更改链名称
-X ##删除链
-D ##删除规则
-I ##插入规则
-R ##更改规则
-P ##更改默认规则
iptables -t filter -nL
iptables -t mangle -nL
iptables -t nat -nL
iptables -A INPUT -p tcp --dport 22 -j ACCEPT ##22端口的服务被允许
iptables -I INPUT 1 -p tcp --dport 22 -s 172.25.254.200 -j REJECT
##将这个命令插入到第一条,表示200这个用户不能使用这个命令。
iptables -D INPUT 2
iptables -R INPUT 1 -p tcp --dport 22 -s 172.25.254.200 -j DROP ## 这个状态不能用ssh连接,数据包丢失了
iptables -R INPUT 1 -p tcp --dport 22 -s 192.168.43.222 -j REJECT
iptables -N westo新建链接
iptables -E westo westos更改
iptables -X westos删除
iptables -P INPUT DROP更改策略,一般都是ACCEPT
iptables -P INPUT ACCEPT
iptables中数据包状态的跟踪
数据包的状态:
RELATED表示已经连接过,,ESTABLISHED表示正在连接,new表示新的
火墙的优化:
iptables -F
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i lo -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -j REJECT
iptables-save > /etc/sysconfig/iptables
service iptables save
在192.168.43.200中ping 172.25.254.9发现不通,网关已经设定,不通的原因就是双网卡主机的火墙策略没有设定,此时nat,forwart表都是空的
在双网卡之中开启内核功能,之前也已经做过。如果要让192.168.43.200可以Ping172.25.254.9,应该设定一下nat 中的postrouting ,路由之后
iptables -t nat -A POSTROUTING -o ens160 -j SNAT --to-source 172.25.254.100
ens160表示 从双网卡的172网段出去的网卡名字。所有从ens160这个网卡出去的都吧地址伪装成172.25.254.100
IPtables -t nat -nL
此时在192.168.43.200中ping 172.25.254.9可以ping通
此时在192.200中ssh root @172.25.254.9连接
切换到172.25.254.9中使用w-i查看,是172.25.254.100连接过来的。
此时需要在172.9中连接172.100的时候连接到192.200
这就是dnat
iptable -t nat -A PREROUTING -i ens160 -j DNAT --to-dest 192.168.43.200
##从172.100这个的网卡 进来的都转换到192.200
iptable -t nat -A PREROUTING ! -s 172.25.254.9 -i ens160 -j DNAT --to-dest 192.168.43.200
##除了172.25.254.9这个ip,其他的从172.100这个的网卡 进来的都转换到192.200
此时在9中ssh root@172.25.254.100