connect to host gpdb_b port 22: Connection timed out

1.环境

1.1一台服务器,两个docker容器,内容如下:

gpdb_a(主机):

docker run --privileged=true -itd \
  --name gpdb_a \
  --hostname gpdb_a \
  --network gpnet \
  --ip 172.19.0.2  \
  -v gpmaster_a:/opt/greenplum/data \
  -v gpdata_a:/data \
  -v /sys/fs/cgroup:/sys/fs/cgroup \
  -p 5433:5432 \
  -p 2222:22 \
  -p 28080:28080 \
  -e TZ=Asia/Shanghai \
  lhrbest/greenplum:7.2.0 \
  bash -c "systemctl disable systemd-modules-load.service dnf-makecache.service && /usr/sbin/sshd  && tail -f /dev/null"

gpdb_b:

docker run --privileged=true -itd \
  --name gpdb_b \
  --hostname gpdb_b \
  --network gpnet \
  --ip 172.19.0.3 \
  -v gpdata_b:/data \
  -v gpmaster_b:/opt/greenplum/data \
  -v /sys/fs/cgroup:/sys/fs/cgroup \
  -p 5434:5432 \
  -p 2224:22 \
  -p 28081:28080 \
  -e TZ=Asia/Shanghai \
  lhrbest/greenplum:7.2.0 \
  bash -c "systemctl disable systemd-modules-load.service dnf-makecache.service && /usr/sbin/sshd  && tail -f /dev/null"

  1. 1.2更新 /etc/hosts 文件

echo "172.19.0.2 gpdb_a" >> /etc/hosts

echo "172.19.0.3 gpdb_b" >> /etc/hosts

echo "172.19.0.2 gpdb7" >> /etc/hosts

1.3修改sshd_config 配置

#vi /etc/ssh/sshd_config

 # 启用 root 登录(默认可能被禁用)

PermitRootLogin yes

# AllowUsers 是白名单机制:只有列出的用户才能通过 SSH 登录。用户名之间用 空格 分隔。

AllowUsers gpadmin root

PasswordAuthentication yes

ChallengeResponseAuthentication yes

# 使用 PAM 进行认证(通常保持开启)

UsePAM yes

1.4 修改/etc/pam.d/sshd配置

vi  /etc/pam.d/sshd 

注释掉或删除以下行(如果存在):

auth       required     pam_nologin.so

 

2.现象

在 gpdb_a执行如下命令,实现ssh免密登录:
ssh-keygen -t rsa -b 4096 -N '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
for host in gpdb_a gpdb_b; do ssh-copy-id $host; done

报如下错误:

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.

(if you think this is a mistake, you may want to use -f option)

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: ERROR: ssh: connect to host gpdb_b port 22: Connection timed out

3.原因 

宿主机内核禁用了桥接网络通信。

3.1编辑/etc/sysctl.conf

#vi  /etc/sysctl.conf

net.bridge.bridge-nf-call-iptables = 0

net.bridge.bridge-nf-call-ip6tables = 0

net.bridge.bridge-nf-call-arptables = 0

注:如果这些参数被设置为 1,那么 iptables 会拦截桥接流量,导致容器之间无法通信。因此都改成0.

3.2再执行

sysctl -p

3.3最后执行

for host in gpdb_a gpdb_b; do ssh-copy-id $host; done

实现ssh免密登录

4.sysctl.conf内容详细解读

安全相关

kernel.sysrq=0

作用:禁用 SysRq 键功能。

解释:SysRq 是一个特殊的键盘组合键,可以发送指令给内核。设为 0 表示完全禁用,提高安全性。

建议值:生产环境建议保持 0。

net.ipv4.ip_forward = 1

作用:启用 IPv4 路由转发。

解释:允许本机作为路由器转发 IP 数据包,常用于网关、Docker、Kubernetes 等环境。

建议值:需要做 NAT 或容器网络时设为 1。

net.ipv4.conf.all.send_redirects=0

net.ipv4.conf.default.send_redirects=0

作用:禁止发送 ICMP 重定向报文。

解释:防止被利用进行中间人攻击(MITM)。

建议值:默认设为 0 更安全。

net.ipv4.conf.all.accept_source_route=0

net.ipv4.conf.default.accept_source_route=0

作用:拒绝源路由数据包。

解释:源路由是一种旧的机制,容易被用来绕过防火墙等安全措施。

建议值:始终设为 0。

net.ipv4.conf.all.accept_redirects=0

net.ipv4.conf.default.accept_redirects=0

作用:禁止接受 ICMP 重定向报文。

解释:防止本地路由表被恶意修改。

建议值:始终设为 0。

net.ipv4.conf.all.secure_redirects=0

net.ipv4.conf.default.secure_redirects=0

作用:是否只接受来自当前网关的 ICMP 重定向。

解释:即使开启也会限制来源,但设为 0 可彻底关闭此功能以减少攻击面。

建议值:设为 0 更安全。

net.ipv4.icmp_echo_ignore_broadcasts=1

作用:忽略 ICMP 广播请求(Ping 广播地址)。

解释:防止 Smurf 攻击(利用广播放大攻击目标)。

建议值:始终设为 1。

net.ipv4.icmp_ignore_bogus_error_responses=1

作用:忽略伪造的 ICMP 错误响应。

解释:防止 DoS 或欺骗性攻击。

建议值:始终设为 1。

net.ipv4.conf.all.rp_filter = 0

net.ipv4.conf.default.rp_filter = 0

作用:关闭反向路径过滤(Reverse Path Filtering)。

解释:

rp_filter=0:不检查源地址合法性;

rp_filter=1:严格模式,丢弃不符合路由的包;

rp_filter=2:宽松模式,记录日志但不丢弃。

适用场景:多宿主服务器或负载均衡环境下建议设为 2;否则可设为 1 提高安全性。

net.ipv4.tcp_syncookies=1

作用:启用 SYN Cookies 技术防御 SYN Flood 攻击。

解释:当连接队列满时,内核会尝试用加密 Cookie 响应 SYN 请求。

建议值:始终设为 1。

kernel.dmesg_restrict=1

作用:限制非特权用户访问内核日志(dmesg)。

解释:防止攻击者通过查看 dmesg 获取漏洞信息。

建议值:生产环境建议设为 1。

IPv6 安全

net.ipv6.conf.all.accept_redirects=0

net.ipv6.conf.default.accept_redirects=0

作用:禁止接受 IPv6 的 ICMPv6 重定向报文。

解释:与 IPv4 类似,防止路由劫持。

建议值:始终设为 0。

桥接/容器网络配置

net.bridge.bridge-nf-call-arptables = 0

net.bridge.bridge-nf-call-ip6tables = 0

net.bridge.bridge-nf-call-iptables = 0

作用:控制桥接接口是否调用 iptables 规则。

解释:

1:桥接流量经过 iptables,适合更严格的防火墙策略;

0:跳过 iptables,适用于高性能容器环境(如 Docker/K8s)。

建议值:在容器环境中建议设为 0,避免性能损耗。

⚙️ 网络性能调优

net.ipv4.ip_local_reserved_ports = 30000-32767

作用:保留一部分端口供系统内部使用。

解释:避免应用程序占用这些端口。

建议值:根据业务需求调整。

net.core.netdev_max_backlog = 65535

作用:设置进入的数据包队列长度上限。

解释:在网络负载高的情况下防止丢包。

建议值:高并发服务建议增大该值。

net.core.rmem_max = 33554432

net.core.wmem_max = 33554432

作用:设置最大接收和发送套接字缓冲区大小。

解释:提升 TCP 性能,尤其是大带宽延迟产品(BDP)环境。

单位:字节(B),这里约为 32MB。

建议值:高吞吐量场景建议增大。

net.core.somaxconn = 32768

作用:设置监听队列的最大连接请求数。

解释:影响 listen() 函数的 backlog 参数上限。

建议值:高并发服务建议增大。

net.ipv4.tcp_max_syn_backlog = 1048576

作用:设置半连接队列的最大数量(SYN_RECV)。

解释:抵御 SYN Flood 攻击,支持更多并发连接。

建议值:大并发服务建议设为 1M 左右。

ARP 缓存优化

net.ipv4.neigh.default.gc_thresh1 = 512

net.ipv4.neigh.default.gc_thresh2 = 2048

net.ipv4.neigh.default.gc_thresh3 = 4096

作用:控制 ARP 缓存条目数的软限、硬限和最大值。

解释:

gc_thresh1:最小缓存条目数;

gc_thresh2:软上限,超过后开始清理;

gc_thresh3:硬上限,最多缓存多少条 ARP 条目。

建议值:大规模局域网或多网卡服务器建议适当调高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值