#!/bin/bash
# 日志文件和目录
LOG_DIR="/var/log/docker-iptables"
LOG_FILE="$LOG_DIR/add_ips.log"
# 创建日志目录(如果不存在)
mkdir -p $LOG_DIR
# 定义日志函数
log_message() {
local message=$1
echo "$(date +"%Y-%m-%d %H:%M:%S") - $message" >> $LOG_FILE
}
# 获取容器的 IPv4 地址
get_container_ip() {
local container_name=$1
docker inspect $container_name | jq -r '.[0].NetworkSettings.Networks["这里是容器所在的网络"].IPAddress'
}
# 获取容器的 IPv6 地址
get_container_ipv6() {
local container_name=$1
docker inspect $container_name | jq -r '.[0].NetworkSettings.Networks["这里是容器所在的网络"].GlobalIPv6Address'
}
# 最大等待时间为 240 秒,每 1 秒检查一次
MAX_WAIT=240
INTERVAL=1
TIME_WAITED=0
# 定义容器名称和端口
declare -A CONTAINERS
CONTAINERS=(
["容器名称1-端口1"]="端口1"
["容器名称2-端口2"]="端口2"
["容器名称3-端口3"]="端口3"
# 添加更多容器和端口
)
# 等待 iptables DOCKER-USER 链可用
while [ $TIME_WAITED -lt $MAX_WAIT ]; do
if iptables -L DOCKER-USER &> /dev/null; then
# 创建 ipset 地址合集(如果不存在)
ipset list allowed_ips &> /dev/null || ipset create allowed_ips hash:ip
ipset list allowed_ipv6_ips &> /dev/null || ipset create allowed_ipv6_ips hash:ip family inet6
ipset list allowed_其他特殊规则_ips &> /dev/null || ipset create allowed_其他特殊规则_ips hash:ip
ipset list allowed_其他特殊规则_ipv6_ips &> /dev/null || ipset create allowed_其他特殊规则_ipv6_ips hash:ip family inet6
# 手动添加 IP 地址到 ipset 合集
ipset add allowed_ips 需要放行的 IPv4 地址 || true
ipset add allowed_ipv6_ips 需要放行的 IPv6 地址 || true
ipset add allowed_其他特殊规则_ips 需要放行的 IPv4 地址 || true
ipset add allowed_其他特殊规则_ipv6_ips 需要放行的 IPv6 地址 || true
for key in "${!CONTAINERS[@]}"; do
# 分离容器名称和端口
container_name=$(echo $key | sed 's/-[0-9]*$//')
port=${CONTAINERS[$key]}
# 获取容器的 IP 地址
CONTAINER_IP=$(get_container_ip $container_name)
CONTAINER_IPV6=$(get_container_ipv6 $container_name)
if [ -z "$CONTAINER_IP" ] || [ -z "$CONTAINER_IPV6" ]; then
log_message "Container IP address or IPv6 address not found for $container_name."
continue
fi
if [[ "$container_name" == "其他特殊规则容器名称" && "$port" == "端口" ]]; then
# 定义 其他特殊 规则
log_message "Applying 其他特殊规则 IPv4 rules for $container_name on port $port"
iptables -I DOCKER-USER 1 -m set --match-set allowed_其他特殊规则_ips src -d $CONTAINER_IP -p tcp --dport $port -j ACCEPT
iptables -I DOCKER-USER 2 -d $CONTAINER_IP -p tcp --dport $port -j DROP
log_message "Applying 其他特殊规则 IPv6 rules for $container_name on port $port"
ip6tables -I DOCKER-USER 1 -m set --match-set allowed_其他特殊规则_ipv6_ips src -d $CONTAINER_IPV6 -p tcp --dport $port -j ACCEPT
ip6tables -I DOCKER-USER 2 -d $CONTAINER_IPV6 -p tcp --dport $port -j DROP
else
# 定义常规规则
log_message "Applying general IPv4 rules for $container_name on port $port"
iptables -I DOCKER-USER 1 -m set --match-set allowed_ips src -d $CONTAINER_IP -p tcp --dport $port -j ACCEPT
iptables -I DOCKER-USER 2 -d $CONTAINER_IP -p tcp --dport $port -j DROP
log_message "Applying general IPv6 rules for $container_name on port $port"
ip6tables -I DOCKER-USER 1 -m set --match-set allowed_ipv6_ips src -d $CONTAINER_IPV6 -p tcp --dport $port -j ACCEPT
ip6tables -I DOCKER-USER 2 -d $CONTAINER_IPV6 -p tcp --dport $port -j DROP
fi
log_message "Rules applied successfully for $container_name on port $port."
done
exit 0
fi
sleep $INTERVAL
TIME_WAITED=$((TIME_WAITED + INTERVAL))
done
log_message "Error: DOCKER-USER chain not found after $MAX_WAIT seconds."
exit 1
赶快来坐沙发