Debian上配置VPN的完整指南

更新时间

概述

本文旨在指导用户如何在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规则之前,您需要知道您要为哪个接口编写规则。可以使用ifconfigip 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,您的网络配置也已正确对齐。下一步是创建证书颁发机构,以处理所有加密密钥。这个过程没有这一步长,但同样重要。

更新时间