我在 VPS 上安装了 OpenVPN 和 PPTP。我有几个问题似乎无法得到确切的答案。
我想在 1.1.1.1(eth0,公网 IP 地址)上安装 OpenVPN,在 1.1.1.2(eth0:1,公网 IP 地址)上安装 PPTP。我能够使用 SNAT 实现这一点。但是,从我读过的所有教程来看,它建议将 ppp+ 转发到 eth0,反之亦然,tun 接口的情况也一样。
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT
iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp+ -j ACCEPT
我的设置是 CentOS,专用服务器。
出于某种原因,我假设 iptables 会将所有流量从 eth0 路由到 tun0 并在那里停止。
我的问题是,
1) 这些转发规则会相互冲突吗?2) 我是否需要将 ppp+ 转发到 eth0:1 以避免冲突?这可能吗?我还没有找到办法。3) iptables 是否足够智能,可以通过这些规则路由特定于 tun 和 ppp 的流量?
答案1
首先,让我们尝试理清一下情况,因为您似乎对数据包过滤和路由如何协同工作感到困惑。
iptables
(实际上,Netfilter — 这是内核堆栈的名称;iptables
只是用于操作 Netfilter 规则集的用户空间二进制文件的名称)不路由任何内容;路由由路由堆栈(使用用户ip
空间二进制文件控制)完成,并且 Netfilter 只能通过安装在链中的规则影响路由PREROUTING
(可以执行 DNAT 的位置)。所有进入的数据包都会经过“FORWARD”链(“过滤”表)通过主机,也就是说,不是源自该主机(那些通过“OUTPUT”链)并且不是目的地为该主机(那些通过“INPUT”链)。
因此,是的,如果主机上启用了数据包转发(因此主机作为路由器工作),则链“FORWARD”的策略及其中的任何规则都会影响流动某些数据包,但不是路由决策。
主要的三条链 —
INPUT
和OUTPUT
都有FORWARD
所谓的“默认策略”,可能是ALLOW
(默认)或DROP
。后者会丢弃进入链的任何数据包。如果数据包未由链中安装的规则处理,则将应用默认策略。典型的“边界网关”(将 LAN 连接到 Internet 的主机)通常具有这样的设置,以便默认情况下阻止所有内容(包括通过 Netfilter 转发数据包,即使它已为 IP 堆栈本身启用),然后插入特定规则以明确启用特定类型的流量。也就是说,这些教程通常建议设置默认策略,然后
INPUT
使用规则明确启用某些类型的流量。FORWARD
DROP
如果特定主机/网络可通过多条路由到达,则路由堆栈(Netfilter 再次对此过程无权发言)会根据路由表和接口指标来决定使用哪个网络接口发送数据包。
如果你
ip route
在路由器主机上运行,你会看到一组类似这样的规则10.8.10.0/24 via 10.8.0.2 dev tun0
其中“via”地址指定下一个路由器,“dev”列出发送数据包到达该路由器的接口。
现在让我们回顾一下你的情况。
FORWARD
如果链的策略是,则您只需要在链中放置特定规则DROP
,否则它将“正常工作”。如果你默认
DROP
在你的FORWARD
链中设置数据包,那么你需要明确允许在 VPN 接口和面向 Internet 的接口之间传递数据包,即ppp+
然后回来以及往返tun+
。如果您需要不同 VPN 网络的客户端能够相互通信,您还需要启用相应接口之间的数据包转发(双向)。请注意,你不需要必须在为链(或任何其他链)编写规则时参考接口
FORWARD
——您可以只使用网络地址(对于-s
和的-d
命令行选项iptables
)。因此,如果你的 VPN 提供了两个私有网络 A 和 B,你可以插入一对规则,例如
iptables -A FORWARD -s A -d B -j ACCEPT iptables -A FORWARD -s B -d A -j ACCEPT
此外,由于 VPN 通常提供专用网络,LAN 也是如此,因此我倾向于插入类似
iptables -A FORWARD -s 192.168/24 -d 10/8 -j ACCEPT iptables -A FORWARD -s 10/8 -d 192.168/24 -j ACCEPT
表达“每个人都可以在我的私人网络上与其他人交谈”的想法(如果您还想覆盖较少使用的
172.16/12
私人范围,显然需要制定3x3=9
规则)。
更新:请注意,您不一定需要在 VPN 接口和连接到 Internet 的接口之间启用数据包转发:前者是虚拟的,仅在私有网络中传输数据包里面VPN 提供的隧道;数据包提供这些隧道流向/流出主机上运行的 VPN 进程,不遍历链FORWARD
。因此,如果您只需要 VPN 客户端与您的 LAN 通信或它们之间通信,则只需启用 VPN(和 LAN,如果存在)接口之间的数据包转发。