概述
本文旨在指导用户如何在Debian 9 Stretch上配置自己的VPN。虽然本指南针对Debian 9进行了测试,但它也可能适用于其他较新的Debian版本。
要求
本文假设您在VPS或远程服务器上运行Debian,因为这通常是使用VPN的主要场景。
- 一个可用的Debian Stretch安装,并具有root访问权限。
难度
中等
约定
-
#
- 需要以root用户身份直接执行给定的Linux命令,或者使用sudo
命令。 -
$
- 需要以普通非特权用户身份执行给定的Linux命令。
配置Iptables
建立自己的VPN并非易事,但有很多理由让您想要这样做。首先,当您运行自己的VPN时,您可以完全控制它,并确切知道它在做什么。
安全性是VPN的重要因素。虽然可以在几分钟内设置一个简单的VPN,但它可能完全不安全。因此,您需要采取适当的步骤,以确保服务器和连接保持私密和加密。
在开始之前,您可能想考虑加密磁盘,使用SELinux或PAX增强内核安全性,并确保其他一切都被锁定。
找到您的WAN接口
在编写iptables规则之前,您需要知道您要为哪个接口编写规则。可以使用ifconfig
或ip a
命令查找服务器连接到互联网的接口。
本文将把该接口称为eth0
,但这可能不是您的实际名称。请确保用您服务器的网络接口名称替换它。
创建Iptables规则
每个Linux用户和管理员都喜欢编写iptables规则,对吧?其实并不会太复杂。您将创建一个包含所有命令的文件,然后将其恢复到iptables中。
创建文件。您可以将其放在任何您想要保存的位置,或者直接放在/tmp
中。无论如何,iptables会保存您的规则,因此/tmp
也是可以的。
bash
$ vim /tmp/v4rules
开始文件时,添加*filter
以告知iptables这些是过滤规则。
回环规则
从最简单的一组规则开始,即回环接口规则。这些规则告诉iptables只接受来自本地主机的回环流量。
bash
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT
-A OUTPUT -o lo -j ACCEPT
允许Ping
接下来,您可能希望能够ping通您的服务器。这组规则允许ping通过。
bash
-A INPUT -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
SSH设置
您可能需要将SSH端口更改为其他端口,因此请让您的规则反映这一点。
bash
-A INPUT -i eth0 -p tcp -m state --state NEW,ESTABLISHED --dport 22 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state ESTABLISHED --sport 22 -j ACCEPT
允许OpenVPN通过
显然,您会希望允许OpenVPN流量通过。本文将使用UDP进行OpenVPN。如果您选择使用TCP,请相应调整规则。
bash
-A INPUT -i eth0 -p udp -m state --state NEW,ESTABLISHED --dport 1194 -j ACCEPT
-A OUTPUT -o eth0 -p udp -m state --state ESTABLISHED --sport 1194 -j ACCEPT
DNS
您还需要允许DNS流量通过您的VPN服务器。这将通过UDP和TCP进行。
bash
-A INPUT -i eth0 -p udp -m state --state ESTABLISHED --sport 53 -j ACCEPT
-A OUTPUT -o eth0 -p udp -m state --state NEW,ESTABLISHED --dport 53 -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED --sport 53 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state NEW,ESTABLISHED --dport 53 -j ACCEPT
HTTP/S用于更新
允许HTTP/S流量似乎有些奇怪,但您确实希望Debian能够更新自己,对吧?这些规则允许Debian发起HTTP请求,但不允许外部接收请求。
bash
-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED --sport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED --sport 443 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state NEW,ESTABLISHED --dport 80 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state NEW,ESTABLISHED --dport 443 -j ACCEPT
NTP同步时钟
假设您不会手动同步服务器时钟和客户端时钟,您需要NTP。也允许它。
bash
-A INPUT -i eth0 -p udp -m state --state ESTABLISHED --sport 123 -j ACCEPT
-A OUTPUT -o eth0 -p udp -m state --state NEW,ESTABLISHED --dport 123 -j ACCEPT
TUN通过VPN隧道
本指南使用TUN通过VPN隧道,如果您使用的是TAP,请相应调整。
bash
-A INPUT -i tun0 -j ACCEPT
-A FORWARD -i tun0 -j ACCEPT
-A OUTPUT -o tun0 -j ACCEPT
为了让VPN将您的流量转发到互联网,您需要启用从TUN到物理网络接口的转发。
bash
-A FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
记录被阻止的流量
您可能希望iptables记录被阻止的流量。这样,您就可以意识到任何潜在威胁。
bash
-A INPUT -m limit --limit 3/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 4
-A FORWARD -m limit --limit 3/min -j LOG --log-prefix "iptables_FORWARD_denied: " --log-level 4
-A OUTPUT -m limit --limit 3/min -j LOG --log-prefix "iptables_OUTPUT_denied: " --log-level 4
拒绝所有其他流量
现在您已经记录了所有不符合现有规则的流量,请拒绝它。
bash
-A INPUT -j REJECT
-A FORWARD -j REJECT
-A OUTPUT -j REJECT
不要忘记用COMMIT
结束文件。
NAT
这部分需要一个不同的表。您不能将其添加到同一个文件中,因此您需要手动运行命令。
使来自VPN的流量伪装成来自物理网络接口的流量。
```bash
```
阻止所有IPv6流量
流量可能通过IPv6泄漏,而现在确实没有必要使用IPv6。最简单的方法是完全关闭它。
创建另一个文件并放入规则以拒绝所有IPv6流量。
```bash $ vim /tmp/v6rules *filter
-A INPUT -j REJECT -A FORWARD -j REJECT -A OUTPUT -j REJECT
COMMIT ```
提交所有内容
首先,清空所有现有的iptables规则。
```bash
```
导入您创建的每个规则文件。
```bash
```
使其生效
Debian有一个包可以自动加载您的iptables规则,因此您不必创建cron作业或其他操作。
```bash
```
安装过程会询问您是否要保存配置。请回答“是”。
将来,您可以通过运行以下Linux命令来更新规则。
```bash
```
其他配置
您还需要做几件事,以确保所有网络接口正常工作。
首先,打开/etc/hosts
并注释掉所有IPv6行。
接下来,打开/etc/sysctl.d/99-sysctl.conf
。找到并取消注释以下行。
bash
net.ipv4.ip_forward=1
添加以下行以完全禁用IPv6。
bash
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
最后,应用您的更改。
```bash
```
下一步
到此为止,您的服务器防火墙已准备好运行OpenVPN,您的网络配置也已正确对齐。下一步是创建证书颁发机构,以处理所有加密密钥。这个过程没有这一步长,但同样重要。