我已经按你的要求,把全文所有命令行代码块统一规范为 bash格式,修正了格式混乱、反引号嵌套、语法错误等问题,整体结构不变,可直接用于文档/博客/技术手册。

内网穿透公网服务防护方案

系统防火墙+Web容器+Docker
内网穿透服务暴露公网后,易遭受IP扫描、恶意攻击、挖矿入侵等风险,防护的核心是「分层防护」——底层做粗粒度拦截,上层做精细化控制,通过技术组合实现风险最小化。

第一部分:基础防护方案

方案一:系统防火墙 + 严格IP白名单(适用于管理端口或固定访问源)

一、适用场景

  • 服务仅需对少数固定IP(如公司出口IP、VPN IP)开放,访问源稳定不变;
  • 穿透工具本身的管理端口(如frp dashboard)需要简单高效的保护;
  • 不希望引入额外组件,追求轻量、无性能开销的防护方式。

二、防护架构

在穿透服务端(通常为云服务器)上,使用系统防火墙(iptables/firewalld)限制仅允许白名单IP访问所有公网暴露的端口(包括穿透服务端口和映射的业务端口),未在白名单内的IP直接被拦截,无法建立连接。

三、配置要点(以iptables为例,适配Ubuntu/Debian/CentOS)

  1. 清空现有规则,设置默认拒绝策略(核心:未匹配规则的流量全部拦截)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
  1. 允许本地回环和已建立连接(必备,避免服务内部通信异常)
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  1. 配置IP白名单,仅允许白名单IP访问暴露端口
# 假设白名单IP为 1.2.3.4(公司出口IP)和 5.6.7.8(管理员VPN IP)

# 方式1:允许白名单IP访问所有暴露端口
iptables -A INPUT -s 1.2.3.4 -j ACCEPT
iptables -A INPUT -s 5.6.7.8 -j ACCEPT

# 方式2:细粒度控制,仅允许白名单IP访问指定端口
# 例:仅允许访问frp服务端口7000和业务映射端口8080
iptables -A INPUT -s 1.2.3.4 -p tcp --dport 7000 -j ACCEPT
iptables -A INPUT -s 1.2.3.4 -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -s 5.6.7.8 -p tcp --dport 7000 -j ACCEPT
iptables -A INPUT -s 5.6.7.8 -p tcp --dport 8080 -j ACCEPT
  1. 保存规则,避免重启后失效
# Debian/Ubuntu系统
netfilter-persistent save

四、优缺点

  • 优点:防护效果强,未授权IP完全无法建立连接;配置简单,无额外性能开销;无需依赖其他组件。
  • 缺点:对动态IP不友好,IP变更会导致服务中断;仅能拦截网络层非法IP,无法防御应用层攻击(如SQL注入、XSS),合法IP的所有流量都会被放行。

方案二:Web容器反向代理 + 应用层防护(适用于Web服务)

一、适用场景

  • 暴露的是HTTP/HTTPS服务(如网站、API接口、管理后台);
  • 需要统一管理SSL证书、访问认证、请求限流;
  • 希望拦截常见Web攻击(如SQL注入、XSS、CC攻击)。

二、防护架构

在穿透服务端(云服务器)部署Nginx作为反向代理,将公网流量统一转发到内网穿透映射的本地端口(如127.0.0.1:8080);在Nginx上配置IP白名单、Basic Auth认证、限流、WAF等应用层防护规则,实现对流量的精细化控制。

三、实战配置要点

1. 基础反向代理配置 结合IP白名单

创建Nginx站点配置文件(/etc/nginx/conf.d/protected-service.conf):

server {
    listen 443 ssl http2;
    server_name your-domain.com; # 你的公网域名(无域名则用云服务器IP)

    # SSL证书配置(Let's Encrypt免费证书示例)
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    # 应用层IP白名单(仅允许指定IP访问)
    allow 1.2.3.4/32; # 公司出口IP
    allow 10.0.0.0/8; # 内网段
    deny all;

    # 反向代理核心配置(转发到穿透映射的本地端口)
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
2. 增强应用层防护(认证+限流+WAF)
  • Basic Auth简单认证(防止未授权访问,适合管理后台)
location / {
    auth_basic "Restricted Access"; # 认证提示语
    auth_basic_user_file /etc/nginx/.htpasswd; # 密码文件路径
    proxy_pass http://127.0.0.1:8080;
}

生成密码文件:

# Ubuntu/Debian
apt install -y apache2-utils

# CentOS
yum install -y httpd-tools

# 创建用户密码文件
htpasswd -c /etc/nginx/.htpasswd admin
  • 请求限流(防CC攻击)
# 全局限流配置(所有站点生效)
http {
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s; # 单IP每秒最多10个请求
}

server {
    location / {
        limit_req zone=mylimit burst=20 nodelay; # 突发允许20个请求,不排队
        proxy_pass http://127.0.0.1:8080;
    }
}
  • WAF防护(拦截Web攻击)
    推荐使用ModSecurity(可编译Nginx或使用OpenResty集成),启用开源规则集,拦截SQL注入、XSS、恶意UA等攻击:
# 安装ModSecurity(Ubuntu示例)
apt install -y libmodsecurity3 modsecurity-crs
3. 配置生效步骤
# 检查Nginx配置语法
nginx -t

# 重新加载配置(不中断服务)
systemctl reload nginx

# 开机自启Nginx
systemctl enable nginx

四、优缺点

  • 优点:集中管理SSL证书、认证、访问控制;可抵御应用层攻击(配合WAF);支持动态IP(通过认证而非IP限制);适配所有Web服务场景。
  • 缺点:配置相对复杂,需要维护Nginx及相关模块;仅做应用层防护,仍依赖系统防火墙或云安全组做基础网络防护(建议叠加方案一)。

方案三:Docker容器隔离 + 自定义网络规则(适用于容器化服务)

一、适用场景

  • 暴露的服务本身运行在Docker容器中(如容器化Web应用、数据库);
  • 需要隔离不同服务,防止穿透客户端被攻破后横向移动(如挖矿病毒入侵穿透容器后,无法攻击业务容器);
  • 希望精确控制容器间的通信,实现最小权限访问。

二、防护架构

将穿透客户端(如frpc)和业务服务分别部署在独立Docker容器中,创建两个自定义Docker网络(frontend用于穿透容器,backend用于业务容器);通过Docker网络连接和iptables规则,限制穿透容器仅能与业务容器通信,无法访问宿主机或其他内网资源,实现服务隔离。

三、实战配置要点

  1. 创建自定义Docker网络(用于隔离)
# frontend网络:仅用于frpc穿透容器(暴露公网通信)
docker network create frontend

# backend网络:仅用于业务容器(内部通信,不直接暴露)
docker network create backend
  1. 运行业务容器(示例:Nginx Web应用)
# 拉取测试镜像(实际替换为你的业务镜像)
docker pull nginx:alpine

# 运行业务容器,仅加入backend网络(不暴露端口到宿主机)
docker run -d \
  --name webapp \
  --network backend \
  --restart always \
  -v /path/to/your/web/files:/usr/share/nginx/html \
  nginx:alpine

说明:业务容器仅在backend内网中,宿主机和外部无法直接访问,只能通过frpc容器转发。

  1. 运行frpc穿透客户端容器
# 1. 准备frpc配置文件(frpc.ini)
cat > /path/to/frpc.ini << EOF
[common]
server_addr = 你的云服务器IP
server_port = 7000 # frp服务端通信端口
token = your_frp_token # 与frp服务端一致的密钥

# 业务映射:云服务器8080端口 → webapp容器80端口
[webapp-proxy]
type = tcp
local_ip = webapp # Docker DNS自动解析backend网络中的容器IP
local_port = 80
remote_port = 8080 # 公网暴露的业务端口
EOF

# 2. 运行frpc容器,仅加入frontend网络,最小权限运行
docker run -d \
  --name frpc \
  --network frontend \
  --restart always \
  -v /path/to/frpc.ini:/etc/frp/frpc.ini \
  --cap-drop=ALL \ # 去掉所有特权
  --cap-add=NET_ADMIN \ # 仅保留必要的网络权限(如需)
  snowdreamtech/frpc:latest
  1. 连接两个网络,允许frpc访问业务容器
# 将frpc容器加入backend网络,实现与webapp容器通信
docker network connect backend frpc
  1. 强化隔离(可选,精准控制通信)
    通过iptables规则,限制frpc容器仅能访问webapp容器的业务端口(如80端口),禁止访问其他端口或容器:
# 获取frpc和webapp容器在backend网络中的IP
FRPC_IP=$(docker inspect -f '{{range .NetworkSettings.Networks.backend}}{{.IPAddress}}{{end}}' frpc)
WEBAPP_IP=$(docker inspect -f '{{range .NetworkSettings.Networks.backend}}{{.IPAddress}}{{end}}' webapp)

# 1. 允许frpc访问webapp的80端口(业务端口)
iptables -I DOCKER-USER -s $FRPC_IP -d $WEBAPP_IP -p tcp --dport 80 -j ACCEPT

# 2. 拒绝frpc访问webapp的其他所有端口
iptables -I DOCKER-USER -s $FRPC_IP -d $WEBAPP_IP -j DROP

# 3. 拒绝frpc访问宿主机和其他容器
iptables -I DOCKER-USER -s $FRPC_IP -j DROP

四、优缺点

  • 优点:容器隔离,限制穿透客户端被攻破后的影响范围;可精确控制容器间通信;易于迁移和扩展;适配容器化部署趋势。
  • 缺点:学习曲线较陡,需要熟悉Docker网络和iptables规则;对性能有轻微影响(网络转发开销);配置和维护成本高于前两种方案。

第二部分:方案选型建议

根据实际需求选择合适的方案,高安全场景建议采用叠加组合模式,实现“分层防护”,防护效果远优于单一方案。

核心需求 推荐方案
只需保护管理端口,访问源IP固定 方案一(系统防火墙+IP白名单)
暴露Web服务,需统一SSL、认证、防Web攻击 方案二(Nginx反向代理+应用层防护)
服务已容器化,注重隔离、防止横向攻击 方案三(Docker隔离+自定义网络)
高安全要求,需要多层防护、风险最小化 方案一+方案二 或 方案一+方案三

叠加组合核心逻辑:底层用「系统防火墙(方案一)」做粗粒度网络拦截(IP/端口级),拦截非法IP和无用端口;上层用「Nginx反向代理(方案二)」或「Docker隔离(方案三)」做精细化防护(应用层/容器隔离),拦截合法IP内的恶意请求或限制攻击范围,两者互补形成“双重屏障”。

组合1:方案一(系统防火墙)+ 方案二(Nginx反向代理)

一、核心防护逻辑

  • 第一层(系统防火墙iptables):仅放行「白名单IP + 核心端口(80/443)」,直接拦截99%的非法IP(如矿池IP、扫描IP),不让恶意流量触达Nginx;
  • 第二层(Nginx反向代理):对已放行的合法IP做精细化控制(应用层认证、限流、WAF、路径限制),拦截合法IP内的恶意请求(如SQL注入、高频CC攻击)。

二、适用场景

暴露Web服务(网站/API、管理后台),需要高安全防护(如敏感数据接口、管理员后台);访问源以固定白名单IP为主,但需防范白名单内的误操作或内部攻击。

三、分步实现步骤

步骤1:配置方案一(系统防火墙iptables,底层防护)

目标:仅允许白名单IP访问80(HTTP)、443(HTTPS)端口,其他IP全部拦截。

# 1. 清空现有规则,设置默认策略
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 2. 放行本地回环和已建立连接(必备)
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 3. 配置IP白名单(替换为你的白名单IP/网段)
WHITELIST_IPS=("1.2.3.4" "5.6.7.8" "192.168.1.0/24")
for ip in "${WHITELIST_IPS[@]}"; do
    iptables -A INPUT -s $ip -p tcp --dport 80 -j ACCEPT
    iptables -A INPUT -s $ip -p tcp --dport 443 -j ACCEPT
done

# 4. 保存规则(重启不丢失)
netfilter-persistent save

验证:此时非白名单IP访问80/443端口会直接超时(被iptables拦截),白名单IP才能触达Nginx。

步骤2:配置方案二(Nginx反向代理,上层防护)

目标:对通过防火墙的白名单IP,进一步做应用层防护,并转发请求到内网穿透映射的本地端口(如127.0.0.1:8080)。

  1. 安装Nginx
apt update && apt install -y nginx
  1. 创建Nginx站点配置文件(/etc/nginx/conf.d/protected-service.conf)
# 全局限流配置(防CC攻击)
http {
    limit_req_zone $binary_remote_addr zone=cc_limit:10m rate=10r/s; # 单IP每秒最多10个请求
}

# HTTP强制跳转到HTTPS(提升安全性)
server {
    listen 80;
    server_name your-domain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name your-domain.com;

    # 1. SSL证书配置
    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3; # 禁用弱协议
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;

    # 2. 应用层IP白名单(可选,进一步缩小访问范围)
    allow 192.168.1.100; # 仅允许内网特定IP访问管理后台
    deny all;

    # 3. Basic Auth认证(防止白名单IP泄露后的未授权访问)
    auth_basic "请输入管理员账号密码";
    auth_basic_user_file /etc/nginx/.htpasswd;

    # 4. 启用限流(防白名单内的高频攻击)
    limit_req zone=cc_limit burst=20 nodelay;

    # 5. 反向代理配置(转发到穿透映射的本地端口)
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # 6. 禁止访问敏感路径(如管理后台、配置文件)
    location ~* /(admin|manager|config|logs) {
        deny all;
        return 403;
    }
}
  1. 生成Basic Auth密码文件(可选但推荐)
apt install -y apache2-utils
htpasswd -c /etc/nginx/.htpasswd admin # 用户名admin,按提示输入密码
  1. 启动Nginx并生效配置
nginx -t # 检查语法
systemctl reload nginx # 重新加载
systemctl enable nginx # 开机自启

四、叠加防护效果

  1. 非白名单IP → 被iptables直接拦截,无法连接80/443端口(超时);
  2. 白名单IP → 需通过Nginx的Basic Auth认证 → 需遵守限流规则 → 才能访问后端服务;
  3. 即使白名单IP被劫持,也会被Nginx的认证、限流、路径限制拦截,无法发起恶意攻击。

组合2:方案一(系统防火墙)+ 方案三(Docker隔离)

一、核心防护逻辑

  • 第一层(系统防火墙iptables):仅放行「白名单IP + 穿透服务端口(如frp的7000端口)」,拦截外部非法IP对穿透服务的攻击;
  • 第二层(Docker隔离):将穿透客户端(frpc)和业务服务放在独立容器,限制容器间仅能单向通信(frpc只能访问业务容器,不能访问宿主机/其他内网资源),即使frpc被攻破,也无法横向移动。

二、适用场景

服务已容器化部署(如Docker运行的Web应用、数据库);内网穿透客户端和业务服务需隔离,降低被攻破后的影响范围;访问源固定(如公司内网IP),需要网络层+容器层双重隔离。

三、分步实现步骤(以Ubuntu/Debian为例)

步骤1:配置方案一

目标:仅允许白名单IP访问穿透服务的核心端口(如frp的7000端口:服务端通信端口、8080端口:业务映射端口)。

# 1. 清空规则并设置默认策略
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 2. 放行本地回环和已建立连接
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 3. 配置白名单IP(替换为你的白名单IP/网段)
WHITELIST_IPS=("1.2.3.4" "5.6.7.8" "192.168.1.0/24")
for ip in "${WHITELIST_IPS[@]}"; do
    iptables -A INPUT -s $ip -p tcp --dport 7000 -j ACCEPT # frp通信端口
    iptables -A INPUT -s $ip -p tcp --dport 8080 -j ACCEPT # 业务映射端口
done

# 4. 保存规则
netfilter-persistent save
步骤2:配置方案三(Docker隔离,上层防护)

目标:创建独立容器运行frpc和业务服务,通过Docker网络隔离,限制容器间通信。

  1. 安装Docker并配置基础环境
# 安装Docker
apt update && apt install -y docker.io docker-compose

# 启动Docker并开机自启
systemctl start docker && systemctl enable docker

# 添加当前用户到docker组(避免每次用sudo)
usermod -aG docker $USER && newgrp docker
  1. 创建Docker自定义网络
docker network create frontend # 用于frpc容器(公网通信)
docker network create backend  # 用于业务容器(内部通信)
  1. 运行业务容器(示例:Nginx Web应用)
docker pull nginx:alpine
docker run -d \
  --name webapp \
  --network backend \
  --restart always \
  -v /path/to/your/web/files:/usr/share/nginx/html \
  nginx:alpine
  1. 运行frpc穿透客户端容器
# 1. 准备frpc配置文件(frpc.ini)
cat > /path/to/frpc.ini << EOF
[common]
server_addr = 你的云服务器IP
server_port = 7000
token = your_frp_token

[webapp-proxy]
type = tcp
local_ip = webapp
local_port = 80
remote_port = 8080
EOF

# 2. 运行frpc容器
docker run -d \
  --name frpc \
  --network frontend \
  --restart always \
  -v /path/to/frpc.ini:/etc/frp/frpc.ini \
  --cap-drop=ALL \
  snowdreamtech/frpc:latest
  1. 连接两个网络,允许frpc访问业务容器
docker network connect backend frpc
  1. 强化Docker网络隔离(可选)
# 获取容器IP(backend网络内)
FRPC_IP=$(docker inspect -f '{{range .NetworkSettings.Networks.backend}}{{.IPAddress}}{{end}}' frpc)
WEBAPP_IP=$(docker inspect -f '{{range .NetworkSettings.Networks.backend}}{{.IPAddress}}{{end}}' webapp)

# 仅允许frpc访问webapp的80端口,拒绝其他所有通信
iptables -I DOCKER-USER -s $FRPC_IP -d $WEBAPP_IP -p tcp --dport 80 -j ACCEPT
iptables -I DOCKER-USER -s $FRPC_IP -d $WEBAPP_IP -j DROP
iptables -I DOCKER-USER -s $FRPC_IP -j DROP

四、叠加防护效果

  1. 非白名单IP → 被iptables拦截,无法访问frp的7000端口和业务的8080端口;
  2. 白名单IP → 可连接frp服务,但frpc容器仅能访问webapp容器的80端口,无法访问宿主机、其他容器或内网资源;
  3. 即使frpc容器被攻破(如挖矿病毒入侵),攻击者也被限制在frpc容器内,无法横向攻击业务容器或宿主机,风险范围最小化。

第四部分:核心要点与效果验证

一、叠加组合核心要点

  1. 规则顺序:底层防火墙(iptables)规则优先于上层防护(Nginx/Docker),先拦截非法IP,再做精细化控制,避免无用流量消耗上层资源。
  2. 最小权限原则:无论是防火墙白名单、Nginx认证,还是Docker网络,都遵循“仅允许必要访问”,关闭所有无用端口和通信,减少攻击面。
  3. 互补性:防火墙解决“谁能连”(IP/端口级),Nginx/Docker解决“连了能做什么”(应用层/隔离级),两者缺一不可,形成完整防护体系。
  4. 可扩展性:可在基础叠加后,添加WAF(ModSecurity)、入侵检测(fail2ban)、日志监控等工具,形成三层/四层防护,进一步提升安全性。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐