在Linode上使用Docker部署IPsec/L2TP服务器

朋友,
当您吃着火锅唱着歌,
愉快的浏览本博文章时,
总会遇到有些参考链接需要载入很久很久,
然后就没有然后了….

这时候,
请不要怀疑人生,
也不要粗暴的对待您的电脑。
当有人给您关上一扇门的时候,
我带您做一架梯子!

在当前复杂的网络环境下,使用VPN已经是每个攻城狮必备的生存技能。使用第三方提供的VPN,价格贵,不稳定,也不安全。

其实搭建一个自己的VPN并不复杂。本文使用Docker搭建IPsec/L2TP服务器,操作简单,绿色环保。基础环境搭建好之后,可以用一条Docker命令运行各种VPN及代理服务。

Linode节点的选择

一般选择最便宜的Linode 1024就可以满足日常使用了,每个月$10,价格也很公道。

国内使用新加坡或者日本的服务器都可以,美国的一般延迟大一些。可以都开一个测试一下速度,虽然上边写的价格是每月的价格,但是其实是按小时收费的,每个月一次扣款,只会收实际使用的费用。

加载af_key内核模块

运行IPsec需要加载IPsec NETKEY内核模块。我部署的是Debian 9系统,默认使用的是Linode定制的内核Linux debian 4.9.50-x86_64-linode86 #1 SMP Thu Sep 14 19:28:20 UTC 2017 x86_64 GNU/Linux,这个内核的所有模块都是编译到内核里边的,可以使用命令zcat /proc/config.gz | grep 'CONFIG_NET_KEY=y$'进行确认。如果您的系统内核使用的是动态模块,可以使用命令modprobe af_key进行加载。

配置防火墙

服务器放到互联网上裸奔是不对的,所以防火墙是一定要有的。Debian自带iptables,只需要简单的设置一下就可以。因为我们的服务是通过Docker提供的,Docker会自动修改iptables的规则表,所以我们只需要打开SSH的端口,并确保其他端口都是关着的就行了。

查看当前规则

运行命令iptalbes -L,如果看到的内容是这样的,说明规则列表是空的,就可以继续了。

1
2
3
4
5
6
7
8
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

如果规则列表里有内容,可以用命令iptables -F清空。

创建规则文件

创建规则文件:

1
editor /etc/iptables.basic.rules

下入如下内容:

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
27
28
29
30
31
32
33
34
*filter

# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allows all outbound traffic
# You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

# Allows SSH connections
# The --dport number is the same as in /etc/ssh/sshd_config
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

# Now you should read up on iptables rules and consider whether ssh access
# for everyone is really desired. Most likely you will only allow access from certain IPs.

# Allow ping
# note that blocking other types of icmp packets is considered a bad idea by some
# remove -m icmp --icmp-type 8 from this line to allow all kinds of icmp:
# https://security.stackexchange.com/questions/22711
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# log iptables denied calls (access via 'dmesg' command)
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# Reject all other inbound - default deny unless explicitly allowed policy:
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

载入规则

使用下边命令载入规则:

1
iptables-restore < /etc/iptables.basic.rules

载入规则后可以再次使用iptables -L命令确认。

保存规则为iptables的格式

1
iptables-save > /etc/iptables.up.rules

每次重启时载入规则

编辑文件:

1
editor /etc/network/if-pre-up.d/iptables

输入内容:

1
2
#!/bin/sh
/sbin/iptables-restore < /etc/iptables.up.rules

最后设置执行权限:

1
chmod +x /etc/network/if-pre-up.d/iptables

安装Docker

使用Docker官方的源进行安装。

安装依赖

1
2
3
4
5
6
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common

添加GPG Key:

1
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

添加stable源

1
2
3
4
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"

安装Docker

1
2
sudo apt-get update
sudo apt-get install docker-ce

将当前用户加入docker组(可选)

非root用户只有在docker组中才可以使用docker服务,因此可以把当前用户加入docker组,方便使用。

1
usermod -aG docker 你的用户名

之后需要重启docker服务,重新登录当前用户才能生效。

运行IPsec VPN的Docker镜像

1
2
3
4
5
6
7
8
9
10
docker run --name ipsec \
-e VPN_IPSEC_PSK=这里替换成你的共享密码 \
-e VPN_USER=这里替换成你的用户名 \
-e VPN_PASSWORD=这里替换成你的密码 \
--restart=always \
-p 500:500/udp \
-p 4500:4500/udp \
-v /lib/modules:/lib/modules:ro \
-d --privileged \
hwdsl2/ipsec-vpn-server

其他

  • L2TP的客户端配置方式请参考这里
  • IPSec的客户端配置方式请参考这里
  • 如果需要添加更多的VPN账户,与其他小伙伴一起分享,请参考这里
  • 为了让服务器更安全,建议把SSH服务改到其他端口,使用Key登录,在sshd的配置中禁用Root登录和密码登录
  • 其他VPN,比如OpenVPN也有Docker镜像

参考