VPN 服务:IKEv2
为什么需要 IKEv2
如果需要手机或电脑在外面连上家里的内网,可以在家里路由器搭建 VPN 服务端,苹果的系统(iOS/MacOS)内置了 IKEv2 协议的 VPN 客户端,一 些安卓设备也内置了,我们在路由器里部署下支持 IKEv2 协议的 VPN 服务端并暴露出来就可以实现远程连上家里内网了。
前提条件
要实现通过 IKEv2 远程接入家庭网络,前提是家庭的电信宽带支持且开通了固定 IP(独占公网 IP),并且也部署了 DDNS 服务,可以通过固定域名解析到家庭宽带的公网 IP(见上一篇文章)。
开源项目
本文部署的 IKEv2 VPN 服务使用这个开源项目构建的容器镜像:https://github.com/hwdsl2/docker-ipsec-vpn-server
使用 nginx + hostPort 暴露 UDP
部署 IKEv2 需要对网络命名空间做很多修改,不建议使用 HostNetwork,避免对其他应用造成影响。所以部署 IKEV2 应使用容器网络,然后用 HostPort 方式暴露 IKEV2 协议所需的两个 UDP 端口,但 HostPort 方式暴露的端口只允许内网访问,如果使用主路由,访问进来的源 IP 是公网 IP,就会不通,可以使用 nginx 来做一个中转,即让 nginx 监听 UDP 端口,再转发给 HostPort 暴露的 UDP。
IKEv2 协议需要使用 500 和 4500 两个 UDP 端口,如果使用主路由方案,nginx 监听的 UDP 就需要使用这两个端口,HostPort 就需 要定义为不同的端口,假设 HostPort 分别为 600 和 4600,下面展示了请求链路:
部署 nginx
目录结构
nginx
├── config
│ └── nginx.conf
├── daemonset.yaml
└── kustomization.yaml
配置 nginx.conf
config/nginx.conf
worker_processes auto;
error_log /dev/stdout debug;
events {
worker_connections 1024;
}
stream {
server {
listen 500 udp;
proxy_pass 127.0.0.1:600;
}
server {
listen 4500 udp;
proxy_pass 127.0.0.1:4600;
}
}
配置 daemonset.yaml
daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: nginx
name: nginx
namespace: default
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 1
containers:
- image: nginx:latest
imagePullPolicy: IfNotPresent
name: nginx
securityContext:
privileged: true
volumeMounts:
- mountPath: /etc/nginx
name: config
dnsPolicy: Default
hostNetwork: true
restartPolicy: Always
volumes:
- configMap:
name: nginx-config
name: config
updateStrategy:
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
type: RollingUpdate