代码之家  ›  专栏  ›  技术社区  ›  YogeshR

无法绑定IPv4套接字:权限被拒绝

  •  1
  • YogeshR  · 技术社区  · 6 年前

    我正试图在一台机器上建立一个PostgreSQL 9.6的新实例。我在另一台机器上测试过,它在那台机器上运行良好。但同样的过程并不适用于新机器。下面是我使用的步骤

    • 用下面的命令创建了一个新的数据目录

      /opt/rh/rh-postgresql96/root/bin/initdb -D /var/lib/pgsql/9.6/data/ 
      
    • 创建了服务文件 /etc/systemd/system/rh-postgresql96-inst2.service 包含以下内容

      .include /lib/systemd/system/rh-postgresql96-postgresql.service
      [Service]
      Environment=PGDATA=/var/lib/pgsql/9.6/data/
      Environment=PGPORT=5433
      User=postgres
      Group=root
      
    • 使用命令注册的服务 systemctl enable rh-postgresql96-inst2
    • 现在使用命令 systemctl start rh-postgresql96-inst2 启动服务。

    所有这些步骤在一台机器上运行良好,但在第二台机器上运行不正常。

    在第二台机器上启动服务时出现以下错误

    rh-postgresql96-inst2.service - PostgreSQL database server
       Loaded: loaded (/etc/systemd/system/rh-postgresql96-inst2.service; enabled; vendor preset: disabled)
       Active: failed (Result: exit-code) since Mon 2018-06-18 09:59:01 UTC; 10s ago
      Process: 7552 ExecStart=/opt/rh/rh-postgresql96/root/usr/libexec/postgresql-ctl start -D ${PGDATA} -s -w -t ${PGSTARTTIMEOUT} (code=exited, status=1/FAILURE)
      Process: 7550 ExecStartPre=/opt/rh/rh-postgresql96/root/usr/libexec/postgresql-check-db-dir %N (code=exited, status=0/SUCCESS)
    
    HINT:  Is another postmaster already running on port 5433? If not, wait a few seconds and retry.
    LOG:  could not bind IPv4 socket: Permission denied
    HINT:  Is another postmaster already running on port 5433? If not, wait a few seconds and retry.
    WARNING:  could not create listen socket for "localhost"
    FATAL:  could not create any TCP/IP sockets
    LOG:  database system is shut down
    systemd[1]: rh-postgresql96-inst2.service: control process exited, code=exited status=1
    systemd[1]: Failed to start PostgreSQL database server.
    systemd[1]: Unit rh-postgresql96-inst2.service entered failed state.
    systemd[1]: rh-postgresql96-inst2.service failed.
    

    但是,我可以使用 pg_ctl .

    另外,我已经用netstat,lsof命令检查了是否有其他postgresql实例正在端口5433上运行,但事实并非如此。

    事实上我也试过54315434个端口,但服务器没有启动

    2 回复  |  直到 6 年前
        1
  •  2
  •   YogeshR    6 年前

    这个问题与selinux有关。 当我运行命令时 sestatus 两台机器的输出都有点不同。 一个服务器有 Current mode: permissive 第二个有 Current mode: enforcing . 所以我在第二台机器上用命令将当前模式改为允许 setenforce 0 .

    解决了权限相关的问题。现在我可以启动第二个实例了。

        2
  •  0
  •   user2984205    6 年前

    您应该允许Postgres绑定到Selinux中的5433端口,而不是旋转Selinux。

    有一个端口参数 PostgreSQL端口 默认情况下有端口5432和9898。

    semanage port -l | grep post
    postgresql_port_t              tcp      5433, 9898
    

    您可以做的只是将端口5433添加到此列表中。

    semanage port -a -t postgresql_port_t 5433 -p tcp
    semanage port -l | grep post
    postgresql_port_t              tcp      5433, 5432, 9898
    

    之后,您可以启动Postgres服务器,监听端口5433

    systemctl enable rh-postgresql96-postgresql
    systemctl start rh-postgresql96-postgresql
    
    netstat -tulpn
    tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      2847/postgres       
    tcp        0      0 127.0.0.1:5433          0.0.0.0:*               LISTEN      2775/postgres   
    

    还有一个叫做audit2allow的工具可以帮助调试selinux问题。

    audit2allow -m whatiswrong < /var/log/audit/audit.log > /root/showme.te
    

    文件 表演 告诉您为什么selinux不允许服务做您需要的事情。

    你不应该仅仅因为很难理解或者不知道selinux是如何工作的就关掉它。相反,你应该学习:)

    我在红帽峰会上重温了这堂课 https://www.redhat.com/en/about/videos/summit-2018-security-enhanced-linux-mere-mortals