前言先说需求吧,是想在公司远控家里的笔记本。之前一直在用的方案是通过frp将自己电脑的3389端口映射到公网的服务器,但是这样所有人都能访问我的3389端口,即使设置的是强密码也始终觉得有安全隐患。除此之外还有某些软件的基于web的控制面板,大部分时候只需要在启动的时候改一次配置就行,其余时间放在公网没有任何用处,完全就是给攻击者扫描的。所以以前在用这台服务器的时候经常是先开着端口把容器跑起来,改完配置再关掉端口用docker compose up -d
重新创建容器,这样非常不优雅,但是安全。
最近了解到了WireGuard这样一个工具可以组内网,也就是说只需要开一个UDP的51820端口建立隧道,其他的端口都不需要再放在公网了,这样暴露在公网的攻击面就少了很多。而且在WireGuard隧道搭建完之后已经是内网环境了,某些工具的控制端口可以打开了、3389不会被扫了、445端口也能访问了,在外面访问家里的smba
服务了。
基于docker搭建WireGuard隧道那我怎么搭这个隧道呢,使用docker的话其实只需要一条命令,在linuxserver/wireguard 这个镜像里有:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
docker run -d \
--name= wireguard \
--cap-add= NET_ADMIN \
--cap-add= SYS_MODULE \
-e PUID = 1000 \
-e PGID = 1000 \
-e TZ = Etc/UTC \
-e SERVERURL = wireguard.domain.com ` #optional` \
-e SERVERPORT = 51820 ` #optional` \
-e PEERS = 1 ` #optional` \
-e PEERDNS = auto ` #optional` \
-e INTERNAL_SUBNET = 10.13.13.0 ` #optional` \
-e ALLOWEDIPS = 0.0.0.0/0 ` #optional` \
-e PERSISTENTKEEPALIVE_PEERS = ` #optional` \
-e LOG_CONFS = true ` #optional` \
-p 51820:51820/udp \
-v /path/to/appdata/config:/config \
-v /lib/modules:/lib/modules ` #optional` \
--sysctl= "net.ipv4.conf.all.src_valid_mark=1" \
--restart unless-stopped \
lscr.io/linuxserver/wireguard:legacy
跑起来这条命令就行了,改成docker-compse.yml
就是这样:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version : "3.8"
services :
wireguard :
environment :
- PUID=1001
- PGID=1001
- TZ=Asia/Shanghai
- PEERS=5 #optional
- PEERDNS=auto #optional
- LOG_CONFS=true #optional
- SERVERURL=wireguard.domain.com #optional
- INTERNAL_SUBNET=10.0.1.0 #optional
- ALLOWEDIPS=10.0.1.0/24 #optional
image : linuxserver/wireguard
container_name : wireguard
volumes :
- ./config:/config
- ./modules:/lib/modules
ports :
- "51820:51820/udp"
restart : unless-stopped
cap_add :
- NET_ADMIN
- SYS_MODULE
sysctls :
- net.ipv4.conf.all.src_valid_mark=1
这个配置我选重点的来讲:
PEERS=5
就是有5台设备可以连连接SERVERURL
是WireGuard
服务端的地址INTERNAL_SUBNET
分配给客户端的IP地址段ALLOWEDIPS
是指哪些地址会被转发,改成10.0.1.0/24
就是说只转发目的地址为这个网段的地址运行之后会在config/peerX
文件夹生成客户端用的配置文件,直接导入客户端就行。在手机上用也可以打开config/peerX/peerX.png
这种图片通过二维码导入。客户端还有一条PersistentKeepalive
配置,在配置文件中加入PersistentKeepalive = 25
之后就是每25秒发送keepalive
心跳,不加入这条可能在过一段时间就和客户端失联了。