现在是2017年,使用VPN变得轻而易举。 在大量外部隐私问题和您自己的ISP能够出售您的浏览历史记录之间,没有理由不使用它。
当然,您可以支付数百种VPN服务中的一种,但是再一次,您的数据依赖于其他人。 实际上,大多数功能都是很棒的,但是如果您想完全控制,则可以在虚拟专用服务器(VPS)上构建自己的VPN,也可以租用自己的私有服务器(如果您想真正使用它的话)。
构建VPN所需的全部就是开源OpenVPN软件和Linux(或BSD)。 可能会涉及到配置,但是对于具有甚至基本的Linux技能的人来说,开发Ubuntu这样的发行版也不是没有可能。
对于本指南,您将需要运行Ubuntu的VPS。 您可以很轻松地从DigitalOcean或Linode之类的人那里捡起一个。 请遵循其基本安全指南进行设置。 确保您不会犯基本错误,例如允许通过SSH进行根访问。
另外,请记住,您将通过SSH到VPS在命令行中完成整个设置。 没有什么需要疯狂的Linux知识了,但是要准备键入而不是单击。
得到你所需要的
快速链接
- 得到你所需要的
- 设置防火墙
- 查找接口
- iptables基础
- 设定规则
- 回送
- 平
- SSH协议
- 开放VPN
- 域名解析
- HTTP / S
- NTP
- UN
- 记录中
- 拒绝其他一切
- NAT伪装
- 转发IPv4流量
- 停止所有IPv6连接
- 导入并保存到iptables
Ubuntu打包并在其存储库中分发OpenVPN。 您只需要使用apt来安装它。 您还需要用于生成加密密钥的工具。 都安装它们。
$ sudo apt install openvpn easy-rsa
设置防火墙
接下来,您需要注意防火墙。 这是确保VPN安全并防止数据泄漏和不必要访问的重要组成部分。
iptables是Linux的主要防火墙,它是控制对Ubuntu端口访问的最佳选择。 您已经安装了它,因此可以开始设置防火墙规则。
查找接口
在开始将规则写入iptables之前,请确定服务器通过什么接口连接到Internet。 运行ifconfig以显示您的网络接口。 具有inet地址的地址:与您连接到的IP地址匹配的地址是正确的接口。
iptables基础
从Internet随机复制内容并将其粘贴到终端中通常不是一个好主意。 当您处理安全性主题时尤其如此。 因此,在开始输入iptables规则之前,请花点时间在此学习一些知识。
看一下iptables规则的这个例子。
-A输入-i eth0 -p tcp -m状态-已建立状态-运动443 -j接受
好的,所以-A表示您将要追加一个新规则。 然后,INPUT表示它将涉及到服务器的输入。 还有一个输出。 -i标志告诉iptables该规则用于哪个接口。 您可以使用-p指定该规则适用的协议。 此规则处理tcp。 -m指定连接必须满足的条件。 在这种情况下,它必须匹配指定的状态。 当然,然后–state指定状态,在这种情况下为ESTABLISHED连接。 下一部分告诉iptables该规则用于哪个端口。 这里是端口443,即HTTPS端口。 最后一个标志是-j。 它代表“跳转”,它告诉iptables如何处理连接。 如果此连接满足规则中的所有要求,则iptables将接受它。
设定规则
因此,您应该大致了解iptables规则现在如何工作。 本节的其余部分将告诉您如何逐步设置规则。
创建一组iptables规则的最佳方法是创建一个包含所有规则的文件。 然后,您可以一次将其全部导入iptables。 逐一设置规则可能会造成混乱,尤其是当您从头开始创建一组新规则时。
在/ tmp目录中创建一个文件来构建规则。
$ vim / tmp / ipv4
使用* filter启动该文件。 这告诉iptables,接下来将是数据包过滤的规则。
回送
规则的第一部分将锁定回送接口。 他们告诉iptables服务器应该在环回接口上接受来自其自身的流量。 它还应拒绝来自自身的流量而不是来自环回的流量。
-A输入-i lo -j接受-A输入! -i lo -s 127.0.0.0/8 -j拒绝-A输出-o lo -j接受
平
接下来,允许ping。 您应该能够ping您的服务器,以确保该服务器处于联机状态,以防无法访问。 在这种情况下,仅允许回显请求,并且服务器将允许其自身发送ICMP输出。
-A输入-p icmp -m状态-状态新增--icmp类型8 -j接受-A输入-p icmp -m状态-状态已建立,相关-j接受-A输出-p icmp -j接受
SSH协议
您需要SSH。 这是可以访问服务器的唯一方法。 SSH规则特定于您的Internet接口,因此请确保将eth0替换为服务器实际使用的任何接口。
从端口22更改SSH连接也可能是一个好主意,因为这是潜在攻击者尝试使用的默认设置。 如果这样做,请确保也更改iptables规则。
-A输入-i eth0 -p tcp -m状态-状态NEW,已建立-dport 22 -j接受-A输出-o eth0 -p tcp -m状态-状态建立-sport 22 -j接受
开放VPN
下一部分允许通过UDP往返于OpenVPN服务器的流量。
-A输入-i eth0 -p udp -m状态-状态NEW,已建立-dport 1194 -j接受-A输出-o eth0 -p udp -m状态-状态已建立-sport 1194 -j接受
域名解析
现在,允许通过UDP和TCP进行DNS连接。 您希望您的VPN处理DNS,而不是ISP。 这就是您首先设置VPN的部分原因。
-A输入-i eth0 -p udp -m状态-状态已建立-体育53 -j接受-A输出-o eth0 -p udp -m状态-状态NEW,已建立-dport 53 -j接受-A输入-i eth0 -p tcp -m状态-状态已建立-体育53 -j接受-A输出-o eth0 -p tcp -m状态-状态NEW,已建立--dport 53 -j接受
HTTP / S
为了使Ubuntu能够自我更新,您需要添加一组规则以允许HTTP和HTTPS的传出连接。 请注意,这些规则仅允许服务器启动HTTP连接,因此您不能将其用作Web服务器或通过端口80或端口443连接到它。
-A输入-i eth0 -p tcp -m状态-状态已建立-体育80 -j接受-A输入-i eth0 -p tcp -m状态-状态已建立-体育443 -j接受-A输出- o eth0 -p tcp -m状态-状态NEW,已建立--dport 80 -j接受-A输出-o eth0 -p tcp -m状态-状态NEW,已建立--dport 443 -j接受
NTP
为了保持服务器时钟正常运行,您将需要NTP。 NTP允许您的服务器与世界各地的时间服务器同步。 服务器上的时钟不正确会导致连接问题,因此运行NTP是一个好主意。 再一次,您应该只接受传出的和已经建立的连接。
-A输入-i eth0 -p udp -m状态-状态已建立-体育123 -j接受-A输出-o eth0 -p udp -m状态-状态NEW,已建立-dport 123 -j接受
UN
解除封锁OpenVPN用于隧道流量的TUN接口。
-A输入-i tun0 -j接受-A转发-i tun0 -j接受-A输出-o tun0 -j接受
您需要允许TUN将流量转发到VPN的常规接口。 您将在OpenVPN配置中找到该IP地址。 如果您在配置中进行了更改,则也要在您的规则中进行更改。
-A转发-i tun0 -o eth0 -s 10.8.0.0/24 -j接受-A转发-m状态-状态已建立,相关-j接受
记录中
保留被iptables拒绝的所有内容的日志是一个好主意。 在这种情况下,这意味着不符合任何这些规则的任何内容。 日志可让您查看是否有任何恶意活动或对服务器进行任何恶意企图的尝试。
-A输入-m限制–限制3 / min -j日志–日志前缀“ iptables_INPUT_denied:” –日志级别4
-A FORWARD -m限制–limit 3 / min -j LOG –日志前缀“ iptables_FORWARD_denied:” –日志级别4
-A输出-m限制–限制3 / min -j日志–日志前缀“ iptables_OUTPUT_denied:” –日志级别4
拒绝其他一切
最后,您需要阻止任何不符合您的规则的内容。 首先,这实际上是拥有防火墙的目的。
-A输入-j拒绝-正向-j拒绝-A输出-j拒绝
使用COMMIT关闭文件,以告诉iptables提交所有规则。
NAT伪装
您需要来自VPN的连接才能看起来像来自服务器本身。 该段不能包含在常规iptables文件中,因为它使用了不同的表。 没关系,但这只是一行。
$ sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
转发IPv4流量
您将需要启用IPv4流量转发,以便它可以在VPN与服务器的实际网络接口之间传递。 使用sudo打开/etc/sysctl.d/99-sysctl.conf。
找到下面的行,并通过删除#取消注释。
停止所有IPv6连接
抱歉,您尚未使用iptables。 您需要阻止所有IPv6流量。 该OpenVPN服务器仅支持IPv4,这很好,因为您不会遇到需要IPv6的情况。 结果,任何IPv6连接都可能泄漏信息,这与使用VPN时所要的相反。
在设置iptables规则之前,必须在系统上的其他所有位置禁用IPv6。
将以下行添加到/etc/sysctl.d/99-sysctl.conf。 如果您从上一节中关闭了它,请使用sudo重新打开它。
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 net.ipv6.conf.eth0.disable_ipv6 = 1
激活您的更改。
$ sudo sysctl -p
注释/ etc / hosts中的所有IPv6行。 您在这里也将需要sudo。
#:: 1 ip6-localhost ip6-loopback#fe00 :: 0 ip6-localnet#ff00 :: 0 ip6-mcastprefix#ff02 :: 1 ip6-allnodes#ff02 :: 2 ip6-allrouters
最后,您可以编写IPv6 iptables规则。 在/ tmp / ipv6为他们创建一个文件。
*过滤器-A输入-j拒绝-正向-j拒绝-A输出-j拒绝提交
看,它们很简单。 拒绝一切。
导入并保存到iptables
您需要导入这些规则,以便它们执行任何操作。 因此,现在是时候这样做了。
首先清除所有其他内容。 您不希望任何旧规则成为障碍。
$ sudo iptables -F && sudo iptables -X
导入您的IPv4和IPv6规则。
$ sudo iptables-restore </ tmp / ipv4 $ sudo ip6tables-restore </ tmp / ipv6
您可能再也不想这样做了。 因此,您将需要一个新程序包来永久保存规则。
$ sudo apt安装iptables-persistent
在安装过程中,软件包将要求您保存现有规则。 回答“是”。
如果以后进行更改,则也可以更新保存的配置。
$ sudo服务netfilter-persistent保存
花费了一段时间,但您的防火墙已准备就绪。 在下一页上,我们将着手创建必要的加密密钥。
单击此处:下一页