脚本内容

#!/bin/bash
set -e

# ====== 配置区域 ======
WHITELIST_IPS=("1.2.3.4" "8.8.8.8")
KNOCK_OPEN="11111,22222,33333"
KNOCK_CLOSE="33333,22222,11111"
KNOCK_TIMEOUT=15
BANTIME=604800  # 秒,7天

echo "[+] 安装必要组件..."
yum install -y epel-release iptables ipset iptables-services knock fail2ban

# ====== 初始化 iptables 规则 ======
echo "[+] 初始化 iptables..."

systemctl stop firewalld || true
systemctl disable firewalld || true
systemctl enable iptables
systemctl start iptables

iptables -F
iptables -X
iptables -Z

# ipset: 记录白名单和敲门授权IP
ipset create whitelist hash:ip -exist
ipset create knockallow hash:ip timeout 3600 -exist
ipset create blacklist hash:ip timeout $BANTIME -exist

# 添加白名单 IP
for ip in "${WHITELIST_IPS[@]}"; do
    ipset add whitelist "$ip" -exist
done

# 默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Loopback & 已建立连接允许
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 白名单允许全部
iptables -A INPUT -m set --match-set whitelist src -j ACCEPT

# 黑名单直接拒绝
iptables -A INPUT -m set --match-set blacklist src -j DROP

# 敲门后授权IP允许访问所有端口
iptables -A INPUT -m set --match-set knockallow src -j ACCEPT

# 默认仅开放 80 端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# === 允许 ICMP (ping),可选 ===
iptables -A INPUT -p icmp -j ACCEPT

service iptables save

# ====== 配置 knockd ======
echo "[+] 配置 knockd..."
cat >/etc/knockd.conf <<EOF
[options]
    UseSyslog

[openports]
    sequence = ${KNOCK_OPEN}
    seq_timeout = ${KNOCK_TIMEOUT}
    command = /usr/sbin/ipset add knockallow %IP%
    tcpflags = syn

[closeports]
    sequence = ${KNOCK_CLOSE}
    seq_timeout = ${KNOCK_TIMEOUT}
    command = /usr/sbin/ipset del knockallow %IP%
    tcpflags = syn
EOF

sed -i 's/^OPTIONS=.*/OPTIONS="-i eth0"/' /etc/sysconfig/knockd || true
systemctl enable knockd
systemctl restart knockd

# ====== 配置 fail2ban ======
echo "[+] 配置 fail2ban..."
cat >/etc/fail2ban/jail.local <<EOF
[DEFAULT]
bantime = $BANTIME
findtime = 60
maxretry = 2
backend = auto
ignoreip = 127.0.0.1/8 $(IFS=" "; echo "${WHITELIST_IPS[*]}")

[sshd]
enabled = true

[apache-portscan]
enabled = true
filter = apache-portscan
action = iptables-ipset[name=blacklist, port=all, protocol=all]
logpath = /var/log/httpd/access_log
maxretry = 2
EOF

# 创建自定义 filter
cat >/etc/fail2ban/filter.d/apache-portscan.conf <<EOF
[Definition]
failregex = <HOST>.*"(GET|POST|HEAD).*(phpmyadmin|\.env|\.git|\.svn|wp-admin|wp-login|etc|passwd|\/\.\.)"
ignoreregex =
EOF

systemctl enable fail2ban
systemctl restart fail2ban

echo "[✔] 配置完成!iptables 模式已启用"
echo "→ 默认仅 80 开放"
echo "→ 敲门开放指令: knock your.ip ${KNOCK_OPEN//,/ }"
echo "→ 关闭访问指令: knock your.ip ${KNOCK_CLOSE//,/ }"

执行方式

chmod +x iptables_secure.sh
sudo ./iptables_secure.sh

出现报错信息:

sed: can’t read /etc/sysconfig/knockd: No such file or directory
Failed to enable unit: Unit file knockd.service does not exist.

报错解决:

CentOS 默认 不包含 knockd,需要你手动安装并配置。下面是解决步骤:


✅ 步骤一:安装 knockd

CentOS 官方源没有提供 knockd,你可以通过以下方式安装:

🧩 方法 1:使用 EPEL + 源码构建

yum install -y epel-release git gcc make libpcap-devel

cd /usr/local/src
git clone https://github.com/jvinet/knock.git knockd
cd knockd
./configure
make
make install

⏩ 安装后会自动将 knockd 可执行文件放在 /usr/local/bin/knockd


✅ 步骤二:手动创建 systemd 启动文件

创建 knockd.service 文件:

cat >/etc/systemd/system/knockd.service <<EOF
[Unit]
Description=Port-knock Daemon
After=network.target

[Service]
ExecStart=/usr/local/bin/knockd -D -c /etc/knockd.conf
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

✅ 步骤三:配置 knockd(如前所示)

cat >/etc/knockd.conf <<EOF
[options]
    UseSyslog

[openports]
    sequence = 11111,22222,33333
    seq_timeout = 15
    command = /usr/sbin/ipset add knockallow %IP%
    tcpflags = syn

[closeports]
    sequence = 33333,22222,11111
    seq_timeout = 15
    command = /usr/sbin/ipset del knockallow %IP%
    tcpflags = syn
EOF

✅ 步骤四:启动并启用服务

systemctl daemon-reexec
systemctl daemon-reload
systemctl enable knockd
systemctl start knockd

✅ 验证 knockd 是否工作

ps aux | grep knockd

你应该能看到 knockd 正在运行。

Windows电脑Knock.exe客户端下载和使用

下载链接:https://github.com/sebastienwarin/Knock/releases/download/1.0/Knock.exe

使用方式

开启:

knock.exe 192.168.0.1 11111 22222 33333

关闭:

knock.exe 192.168.0.1 33333 22222 11111

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注