内网穿透公网服务防护
我已经按你的要求,把全文所有命令行代码块统一规范为 bash格式,修正了格式混乱、反引号嵌套、语法错误等问题,整体结构不变,可直接用于文档/博客/技术手册。
内网穿透公网服务防护方案
系统防火墙+Web容器+Docker
内网穿透服务暴露公网后,易遭受IP扫描、恶意攻击、挖矿入侵等风险,防护的核心是「分层防护」——底层做粗粒度拦截,上层做精细化控制,通过技术组合实现风险最小化。
第一部分:基础防护方案
方案一:系统防火墙 + 严格IP白名单(适用于管理端口或固定访问源)
一、适用场景
- 服务仅需对少数固定IP(如公司出口IP、VPN IP)开放,访问源稳定不变;
- 穿透工具本身的管理端口(如frp dashboard)需要简单高效的保护;
- 不希望引入额外组件,追求轻量、无性能开销的防护方式。
二、防护架构
在穿透服务端(通常为云服务器)上,使用系统防火墙(iptables/firewalld)限制仅允许白名单IP访问所有公网暴露的端口(包括穿透服务端口和映射的业务端口),未在白名单内的IP直接被拦截,无法建立连接。
三、配置要点(以iptables为例,适配Ubuntu/Debian/CentOS)
- 清空现有规则,设置默认拒绝策略(核心:未匹配规则的流量全部拦截)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
- 允许本地回环和已建立连接(必备,避免服务内部通信异常)
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- 配置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
- 保存规则,避免重启后失效
# 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规则,限制穿透容器仅能与业务容器通信,无法访问宿主机或其他内网资源,实现服务隔离。
三、实战配置要点
- 创建自定义Docker网络(用于隔离)
# frontend网络:仅用于frpc穿透容器(暴露公网通信)
docker network create frontend
# backend网络:仅用于业务容器(内部通信,不直接暴露)
docker network create backend
- 运行业务容器(示例: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容器转发。
- 运行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
- 连接两个网络,允许frpc访问业务容器
# 将frpc容器加入backend网络,实现与webapp容器通信
docker network connect backend frpc
- 强化隔离(可选,精准控制通信)
通过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)。
- 安装Nginx
apt update && apt install -y nginx
- 创建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;
}
}
- 生成Basic Auth密码文件(可选但推荐)
apt install -y apache2-utils
htpasswd -c /etc/nginx/.htpasswd admin # 用户名admin,按提示输入密码
- 启动Nginx并生效配置
nginx -t # 检查语法
systemctl reload nginx # 重新加载
systemctl enable nginx # 开机自启
四、叠加防护效果
- 非白名单IP → 被iptables直接拦截,无法连接80/443端口(超时);
- 白名单IP → 需通过Nginx的Basic Auth认证 → 需遵守限流规则 → 才能访问后端服务;
- 即使白名单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网络隔离,限制容器间通信。
- 安装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
- 创建Docker自定义网络
docker network create frontend # 用于frpc容器(公网通信)
docker network create backend # 用于业务容器(内部通信)
- 运行业务容器(示例: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
- 运行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
- 连接两个网络,允许frpc访问业务容器
docker network connect backend frpc
- 强化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
四、叠加防护效果
- 非白名单IP → 被iptables拦截,无法访问frp的7000端口和业务的8080端口;
- 白名单IP → 可连接frp服务,但frpc容器仅能访问webapp容器的80端口,无法访问宿主机、其他容器或内网资源;
- 即使frpc容器被攻破(如挖矿病毒入侵),攻击者也被限制在frpc容器内,无法横向攻击业务容器或宿主机,风险范围最小化。
第四部分:核心要点与效果验证
一、叠加组合核心要点
- 规则顺序:底层防火墙(iptables)规则优先于上层防护(Nginx/Docker),先拦截非法IP,再做精细化控制,避免无用流量消耗上层资源。
- 最小权限原则:无论是防火墙白名单、Nginx认证,还是Docker网络,都遵循“仅允许必要访问”,关闭所有无用端口和通信,减少攻击面。
- 互补性:防火墙解决“谁能连”(IP/端口级),Nginx/Docker解决“连了能做什么”(应用层/隔离级),两者缺一不可,形成完整防护体系。
- 可扩展性:可在基础叠加后,添加WAF(ModSecurity)、入侵检测(fail2ban)、日志监控等工具,形成三层/四层防护,进一步提升安全性。
更多推荐
所有评论(0)