我有一台安装了 Ubuntu 14.10 的专用服务器。
服务器应连接到 OpenVPN 服务器,并且流量应仅通过 VPN(SSH 流量除外)。
我的想法是用 来实现这一点iptables
,但我不是专家。
具体应该用什么来处理呢iptables
?
假设基本条件如下:
仅允许通过 VPN 的流量。当我的服务器失去与 VPN 的连接时,应该不会出现流量泄漏。
允许在没有 VPN 的情况下使用 SSH。我想使用 SSH 及其来自服务器提供商的普通 IP(但仅限 SSH 流量)连接到我的服务器。
由于我不是 VPN 的唯一用户,因此我想对其他计算机隐藏 VPN 中的服务器。
我开始创建我的iptables
规则,但它总是阻止我的所有连接:
# flush old rules
iptables -F
# accept SSH traffic with non vpn connection
iptables -A INPUT -d X.X.X.X -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s X.X.X.X -p tcp --sport 22 -j ACCEPT
# block everything except my rules
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# allow loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# allow vpn
iptables -A INPUT -j ACCEPT -p udp -s Y.Y.Y.Y --sport 1194
iptables -A OUTPUT -j ACCEPT -p udp -d Y.Y.Y.Y --dport 1194
XXXX是提供商提供的服务器IP。
YYYY 是 VPN 服务器的 IP。
这些规则总是将我踢出当前的 SSH 连接,并且我无法创建新的 SSH 连接,尽管它应该通过端口 22 接受流量。
答案1
请记住您的 -d 选项,如果您想应用于所有适配器,请不要使用此选项,例如
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
答案2
编辑:
仅允许通过 VPN 的流量。当我的服务器失去与 VPN 的连接时,应该不会出现流量泄漏。
这应该关心您的 VPN 应用程序。例如,PIA(私人互联网接入)将其称为终止开关,您只需在应用程序中启用即可。
允许在没有 VPN 的情况下使用 SSH。我想使用 SSH 及其来自服务器提供商的普通 IP(但仅限 SSH 流量)连接到我的服务器。
嗯,这与上面的终止开关相矛盾。
作为一名 VPN 用户,我解决了这个问题,没有连接到其本地 IP(例如 192.168.0.xxx),而是连接到其公共地址,并为我的服务器启用特定端口而不是使用 22,因为我家里有几台服务器,所以你可能也想考虑一下。这也意味着您需要将该端口从路由器重定向到该服务器并iptables
为此端口制定规则。
由于我不是 VPN 的唯一用户,因此我想对其他计算机隐藏 VPN 中的服务器。
由于您没有描述您的环境,我只能说,我会禁用一些服务,例如samba
等。
原答案:
根据手册页:
--sport is short for --source-port --dport is short for --destination-port
对于你的情况,我相信你应该使用 only--dport
选项。
答案3
如果您担心泄漏,而不仅仅是仅通过 VPN 提供数据,那么最安全的方法是使用单独的计算机。运行 openvpn 和 ssh 的机器应该是唯一一台直接连接互联网的机器;其他人必须使用私有地址,并通过该地址使用代理或网关。
这样,如果您配置错误,例如 dns,它只会失败,而不是通过错误的网络。如果您不需要物理机,则可以使用虚拟机来实现这一点。但虚拟机也有更多的攻击面……被黑客攻击的虚拟机可能比网络上的另一台机器更容易利用错误来到达主机。
答案4
这里有几个问题。
首先,您需要允许更多的事情。
- 通过 VPN 的流量。它将是特定的命名设备或命名设备类。如果 VPN 已启动,您应该会在
ip link
或 的输出中看到它ifconfig
。否则,这看起来像您的“允许环回”条目。 - 相关数据包。这允许您的连接发送 ICMP 消息。
在第一条规则中,您最好允许已建立的连接。这使得测试速度更快。结合上面的第二点,那就是:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
这还有一个优点,就是可以防止现有的 SSH 连接被关闭。
在测试时,不要设置策略规则,直到事情看起来有效为止。另外,添加一条 LOG 规则来记录未接受的内容:
iptables -A INPUT -j LOG
iptables -A OUTPUT -j LOG
您将通过 dmesg 和系统日志在控制台上看到此输出。一旦一切正常,就不需要这些规则了。 (但他们可以告诉你你受到了多少攻击。)
一旦您可以建立新的 SSH 连接而不记录任何内容,就可以设置策略规则了。
您可能需要做的另一件事是一些仔细的路由工作。如果 VPN 面向整个互联网(并非不可能),那么 SSH 和 VPN 数据例外可能会变得很棘手。您的 VPN 软件应该为您记录或处理此问题。