在centos7上启动firewall-cmd无效(启动后端口无法拦截)

背景

博主在阿里云服务器部署程序时,systemctl start firewalld打开防火墙,这个时候理应所有端口都不能访问(因为firewalld默认关闭所有端口),但是博主的22端口却依然能连接

问题

为什么firewalld打开后没有阻拦22端口和80端口

调研|测试|分析

  • 使用nmap从本地测试服务器端口,发现是开放的
  • 使用docker部署完web应用,没有在防火墙打开80端口,但是外网可以直接访问服务器的web服务!
  • 在外网的机子上运行nmap -p 1-65535 115.29.188.135扫描所以端口,发现只有22端口和80端口是开放的;
  • 执行systemctl status firewalld -l查看防火墙状态,发现WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -F DOCKER-ISOLATION-STAGE-2' failed: iptables: No chain/target/match by that name.
  • web服务器可以访问而不被防火墙拦截的原因找到了,因为firewalld没有关于docker的拦截配置文件,而且博主运行容器时加了参数-p 80:80,因此firewalld没有成功拦截80端口的服务;
  • 使用Python在阿里服务器上写一个简单的脚本,监听9011端口
import threading
import socket
 
 
encoding = 'utf-8'
BUFSIZE = 1024
 
 
# a read thread, read data from remote
class Reader(threading.Thread):
    def __init__(self, client):
        threading.Thread.__init__(self)
        self.client = client
        
    def run(self):
        while True:
            data = self.client.recv(BUFSIZE)
            if(data):
                string = bytes.decode(data, encoding)
                print(string, end='')
            else:
                break
        print("close:", self.client.getpeername())
        
    def readline(self):
        rec = self.inputs.readline()
        if rec:
            string = bytes.decode(rec, encoding)
            if len(string)>2:
                string = string[0:-2]
            else:
                string = ' '
        else:
            string = False
        return string
 
 
# a listen thread, listen remote connect
# when a remote machine request to connect, it will create a read thread to handle
class Listener(threading.Thread):
    def __init__(self, port):
        threading.Thread.__init__(self)
        self.port = port
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.sock.bind(("0.0.0.0", port))
        self.sock.listen(0)
    def run(self):
        print("listener started")
        while True:
            client, cltadd = self.sock.accept()
            Reader(client).start()
            cltadd = cltadd
            print("accept a connect")
 
 
lst  = Listener(9011)   # create a listen thread
lst.start() # then start
  • 在阿里服务器和外网上分别执行nmap -p 9000-9100 115.29.188.135, nmap -p 9000-9100 127.0.0.1,发现在外网扫描后没有开放的端口,在阿里的执行后9011是开放的
  • 在服务器上使用防火墙开放9011端口,再在外网扫描下端口,发现9011端口是开放的,在服务器的防火墙关闭9011端口,再在外网扫描,发现是关闭的,由此可知,防火墙是有效的,可以有效拦截端口!!

结论

  1. 防火墙systemctl start firewalld后是可以有效拦截所有端口的!
  2. 防火墙不能拦截22端口是因为阿里的centos镜像做了优化或者说服务器系统上的防火墙默认开放22端口的,因为不开放用户就无法控制服务器,至于谁优化的不确定,我们知道这一点即可;
  3. 防火墙不能拦截80端口的原因是,博主使用docker部署的应用,且run -p 80:80,而防火墙无拦截docker的规则,因此拦不住

参考

  • https://blog.csdn.net/u011846257/article/details/54707864
  • https://blog.csdn.net/qq_41262248/article/details/80790993
  • https://blog.csdn.net/fanren224/article/details/79693756
发布了130 篇原创文章 · 获赞 105 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/THMAIL/article/details/104082383