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.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 条目。
建议值:大规模局域网或多网卡服务器建议适当调高。
3517

被折叠的 条评论
为什么被折叠?



