iptables&firewalld

来源:互联网 发布:埋雷软件 编辑:程序博客网 时间:2024/05/16 03:49

一、iptables

1) iptables实验的环境配置:

为了避免防火墙之间互相影响,在作iptables的实验之前,先做一点准备工作:systemctl stop firewalldsystemctl disable firewalldsystemctl mask firewalldsystemctl unmask iptables.servicesystemctl strt iptables.servicesystemctl enable iptables.service

2) iptables火墙策略的读取顺序:

从上往下

3) iptables火墙策略的查看:

vim /etc/sysconfig/iptables                ##火墙信息记录文件

这里写图片描述

小小解说:比如 -A INPUT -p icmp -j ACCEPT 他表示的就是遵从icmp协议的服务是默认允许访问的

这里写图片描述

最常见的就是:ping

这里写图片描述

4) iptables的常用参数:

iptables          -L:list                ##解析后的列表获取,速度慢         -nL:numeric List       ##无解析的列表获取,速度快         -F:flush               ##刷新火墙,清空所有策略          -t:table                ##查看具体的某张表         -A:append              ##追加火墙策略,即添加在火墙的最后面         -I:insert              ##插入火墙策略,即添加在火墙的最前面         -R:replace             ##替换,也可以理解对符合条件的策略进行修改            ##-R: Replace a rule in the selected chain.If the source and/or destination names resolve to multiple addresses, the command will fail.Rules are numbered starting at 1.         -p:--protocol           ##协议              ##The protocol of the rule or of the packet to check.         -P:--policy                          ##chain target         -N:--new chain          ##自己创建新的链表         -E:--rename chain       ##只能修改已经创建的表的名称,系统原有的三张表没有改的资格         -X:--delete-chain      ##删除自定义的表             ##Delete the optional user-defined chain specified.

个别参数实验展示:

L

[root@localhost Desktop]# iptables -L         ##解析后的列表获取,速度慢Chain INPUT (policy ACCEPT)target     prot opt source               destination         ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHEDACCEPT     icmp --  anywhere             anywhere            ACCEPT     all  --  anywhere             anywhere            ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:sshREJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibitedChain FORWARD (policy ACCEPT)target     prot opt source               destination         REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT)target     prot opt source               destination 

nL

[root@localhost Desktop]# iptables -nL         ##无解析的列表获取,速度快Chain INPUT (policy ACCEPT)target     prot opt source               destination         ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHEDACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibitedChain FORWARD (policy ACCEPT)target     prot opt source               destination         REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT)target     prot opt source               destination    

F

这里写图片描述

5) iptables火墙策略的保存:

service iptables save           ##保存修改后的服务

6) 常用的iptables火墙策略模板:

iptables -A INPUT -i lo -j ACCEPT          ##回环接口所有服务全部接受##回环接口简单来说就好比是一个人的神经系统,他不需要询问外部任何东西,只听从自己的  iptables -A INPUT  -j REJECT               ##拒绝所有服务的接口 iptables -R INPUT 1 -s 172.25.254.208 -p tcp --dport 80 -j REJECT    ##符合条件的修改其相应策略  iptables -t nat -nL        ##查看具体的某张表的信息         iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT##允许网络端口为80的服务第一次时的访问

7) iptables三张表和五条链

三张表:filter nat mangle##filter(经过内核表):inputoutputforwards##nat(不经过内核表):inputoutputpostroutingprerouting ##mangle(附加表): 在前两张表无法满足的情况下,使用此表五条链:input output forward:(转告) postrouting:SNAT prerouting:DNAT

数据包匹配的4种状态:INVALID,ESTABLISH,NEW和RELATED

##INVALID:意味着这个包没有已知的流或连接与之关联,也可能是它包含的数据或包头有问题。##ESTABLISHED意思是包是完全有效的,而且属于一个已建立的连接,这个连接的两端都已经有数据发送。##NEW表示包将要或已经开始建立一个新的连接,或者是这个包和一个还没有在两端都有数据发送的连接有关。##RELATED说明包正在建立一个新的连接,这个连接是和一个已建立的连接相关的。

8) iptables策略的实战

1>通过设置火墙策略,实现服务器的访问
如果想要指定某些具体的服务开启或者关闭也是可以的,前提是,你必须要知道代表这些服务的端口是多少,所以,我们有必要提示一下,如何查找服务的网络端口:

cat /etc/service | grep xxx            

这里写图片描述

火墙策略如下:iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPTiptables -A INPUT -m state --state NEW -p tcp --dport 20 -j ACCEPTiptables -A INPUT -m state --state NEW -p tcp --dport 21 -j ACCEPTiptables -A INPUT -j REJECT
在其他主机下使用ftp进行访问:lftp 172.25.254.108               ##连接失败

这里写图片描述

   这个实验主要是想对比一下ftp的被动接受模式的bug,他在数据传输的过程中,除了2021端口,服务器端还会随机给客户端发送第三个随机端口来通知,这样一来,客户端再次从这个端口进去的时候,会因为火墙策略的原因而无法访问。   在这里,解决问题的突破口就是让默认端口可以通过火墙策略:   1>直接允许随机发送端口的数据的进入;   2>将随机端口具体话为某一唯一确定的端口,再写入此端口被允许的火墙策略,需要注意的是,默认端口大于1024   下面我们主要说第二种解决方法:   step1:   在服务端修改配置文件,将被动连接的最大和最小设置为相同的数字,比如6666   vim /etc/vsftpd/vsftpd.conf                   ##服务端   pasv_max_port = 6666   ##The maximum port to allocate for PASV data connections.   pasv_min_port = 6666   ##The minimum port to allocate for PASV data connections.   systemctl restart vsftpd                      ##重启服务   step2:   iptables -I INPUT -m state --state NEW -p tcp --dport 6666 -j ACCEPT                                           ##注意要插入到最后一条命令的前面,否则,还是不能读取   systemctl restart iptables                    ##重启服务   step3:   除此之外,SELinux必须关闭

这里写图片描述

关于ftp更加详细的解说:

   21端口用于连接,20端口用于传输数据  进行FTP文件传输中,客户端首先连接到FTP服务器的21端口,进行用户的认证,认证成功后,要传输文件时,服务器会开启一个新的端口为20来进行传输数据文件。   FTP中,PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。 PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。   按照上述的火墙策略:最后一条命令会让ftp用户连接失败,原因就是ftp的被动连接,会有第三个端口的出现,而iptables中的火墙策略只有ftp的两个端口被允许,并且拒绝了其他所有的端口,而默认端口是大于1024的,所以,我们需要编写配置文件让其被动访问的端口具体化,从而实现端口确定达到可以编辑火墙策略的目的。

2>通过编写火墙策略实现虚拟机的路由功能
step1:
三台计算机(两个虚拟机,一个真机):
【desktop】:eth0 172.25.8.208
【server】:eth0 172.25.8.108 ; eth1 172.25.254.108
【kiosk】:br0 172.25.254.8
step2:

vim /etc/sysctl.conf                     ##编辑内核路由文件 

这里写图片描述

step3:

sysctl -p                             ##内核刷新

172.25.8.208远程连接到172.25.254.8之后,再172.25.254.8上查看登录自己的却是:172.25.254.108,则实现了SNAT
这里写图片描述
等到172.25.254.8连接到172.25.254.108之后,查看IP,结果却是:172.25.254.208,则实现了DNAT
这里写图片描述

二、firewalld

为了避免防火墙之间互相影响,在作firewalld的实验之前,先做一点准备工作:systemctl stop iptables.servicesystemctl disable iptables.servicesystemctl mask iptables.servicesystemctl unmask firewalldsystemctl start firewalldsystemctl enable firewalld

1)firewall默认状态的查看、设置及路由

1>查看

firewall-cmd --get-zones           ##查看网络区的类别           

这里写图片描述

这里写图片描述

firewall-cmd --get-default-zone          ##查看默认网络区

这里写图片描述

2>设置
考虑到安全性的问题,默认为public,当然,默认网络区是可以自己手动设置的

firewall-cmd --set-default-zone=block           ##此设置即改即生效,并且,重启服务也是不会被刷掉记录的

这里写图片描述

firewall-cmd --list-all               ##查看当前的防火墙的策略firewall-cmd --add-service=http       ##添加Apache的服务

这里写图片描述

systemctl restart firewalld              ##重启服务后便会失效

这里写图片描述

永久修改:

firewall-cmd --permanent --add-service=httpfirewall-cmd --list-all                ##查看Apache并没有添加上去firewall-cmd --reload                  ##必须加载才能生效

这里写图片描述

通过直接编辑firewalld配置文件的方式修改默认开启的服务:vim /etc/firewalld/zones/public.xml          ##将Apache服务写进去

这里写图片描述

修改完上述文件后,可以在重启服务前后分别查看火墙策略,这样效果的对比比较明显~
这里写图片描述

 cd /usr/lib/firewalld/services/ ls                              ##可以添加到firewalld的服务

这里写图片描述

vim ftp.xml             ##ftp服务的访问方式比较特殊,属于被动访问,在访问完成后,数据进行交换时,服务端会给客户端再发送一个信号,让其从一个端口(大于1024)进到内部进行数据交换,而这一端口将会因为下图中注释的一行起到ACCEPT的效果##下图的注释方式是错误的,仅仅只是为了截图方便,切勿模仿!

这里写图片描述

大家都知道Apache访问的默认访问端口是80,其实,我们可以通过火墙策略改变Apache的访问端口vim /etc/http/conf/httpd.conf/##Listen默认为80,我们在这里将其修改为8080

这里写图片描述
重启服务之前,通过Apache进行访问可知,服务确实是:80
这里写图片描述
这里写图片描述

重启服务之后,再次使用8080端口进行访问,Apache访问成功~

systemctl restart httpd

这里写图片描述

在实际应用中,有些客户我们需要给他更他的权限,方便起见,可以直接给他分配不同的网络区:
IP服务的指定,reload即可

温馨提示:firewall-cmd --reload          ##在线更新,服务不中断firewall-cmd --complete-reload ##中断当前所有的服务,再更新

增加:firewall-cmd --permanent --add-source=172.25.254.8 --zone=trusted
这里写图片描述
查看火墙策略中,并没有允许Apache的访问,如果在172.25.254.8这台主机上访问成功,则说明策略成功
这里写图片描述

删除:firewall-cmd --permanent --remove-source=172.25.254.8 --zone=trusted
这里写图片描述
再次在172.25.254.8这台主机上访问Apache,如果失败,则说明策略成功
这里写图片描述

端口改变zone,必须要重启服务(restart)

假如某台虚拟机上有两块网卡,那么,我们可以给两块网卡不同的网络区,从而实现让某个用户可以享受更多不一样的功能

step1:添加两块网卡:eth0和eth1step2:将eth0的网络区设置为public:firewall-cmd --permanent  --add-interface=eth0 --zone=public将eth1的网络区设置为trusted:firewall-cmd --permanent  --add-interface=eth1 --zone=trustedstep3:systemctl restart firewalld

Direct:策略读取方式,自上而下

firewall-cmd --direct --get-all-rules    ##获得direct的策略,此策略通过firewall-cmd --list-all是查看不到的firewall-cmd --permanaent --direct --add-rule ip4 filter INPUT 1 172.25.254.0/24 -p tcp --dport 80 -j REJECT    ##添加策略格式firewall-cmd --permanaent --direct --remove-rule ip4 filter INPUT 1 172.25.254.0/24 -p tcp --dport 80 -j REJECT    ##删除策略格式firewall-cmd --reload   ##加载服务

这里写图片描述
火墙策略为拒绝所有172.25.254.0/24这个网段的用户的连接
这里写图片描述
将火墙策略改为允许所有172.25.254.0/24这个网段的用户的连接
这里写图片描述

3>路由

firewall-cmd --permanent --permanent --add-masqueradesystemctl restart firewalld.service[root@localhost yum.repos.d]# firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=172.25.254.8 forward-port port=22 protocol=tcp to-port=22 to-addr=172.25.8.208"success[root@localhost yum.repos.d]# firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=172.25.254.108 masquerade"success

这里写图片描述

这里写图片描述

这里写图片描述

三、管理SELinux端口标签

SELinux中对于特定服务有内定的一些端口,如果我们自己随便修改配置文件可能会导致服务起不来,对此,我们要将端口添加进去~查看:semanage port -l | grep xxx添加:semanage port -a -t xxx -p tcp xxx当然,也可以直接关闭SELinux的功能(Disabled | permissive)

我们的实验以http为例:

vim /etc/httpd/conf/httpd.conf    ##将Listen改为:666

这里写图片描述

systemctl restart httpd            ##重启是失败的,因为端口不在SELinux允许的范围内

这里写图片描述

semanage port -a -t http_port_t -p tcp 666     ##添加

这里写图片描述
再次重启即可成功~

原创粉丝点击