禁用反向路径过滤

禁用反向路径过滤

我正在寻找一种解决方案,以便通过 OpenVPN 路由来自服务器的所有流量,但同时又能够在服务器上托管可在局域网之外访问的应用程序。

更具体一点:服务器上托管了两个应用程序。一个应用程序绑定端口 80,另一个应用程序绑定端口 8080。往返于这些服务的所有流量都必须直接传输,所有其他流量都必须通过 VPN 隧道传输。

目前,当 VPN 运行时,请求会被直接接收,但不会被响应。当我禁用 VPN 时,所有服务都可以访问:

Wireshark

我如何配置 OpenVPN,例如使用 up 脚本,以便正确路由这些路由?

我的网络接口概述:

lo Link encap:Local Loopback 
inet addr:127.0.0.1 Mask:255.0.0.0 
inet6 addr: ::1/128 Scope:Host 
UP LOOPBACK RUNNING MTU:65536 Metric:1 
RX packets:537169 errors:0 dropped:0 overruns:0 frame:0 
TX packets:537169 errors:0 dropped:0 overruns:0 carrier:0 
collisions:0 txqueuelen:0 
RX bytes:147901148 (147.9 MB) TX bytes:147901148 (147.9 MB) 

p4p1 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx 
inet addr:192.168.2.201 Bcast:192.168.2.255 Mask:255.255.255.0 
inet6 addr: xxx/64 Scope:Global 
inet6 addr: xxx/64 Scope:Link 
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
RX packets:8062700 errors:0 dropped:180 overruns:0 frame:0 
TX packets:10937639 errors:0 dropped:0 overruns:0 carrier:0 
collisions:0 txqueuelen:1000 
RX bytes:7942028079 (7.9 GB) TX bytes:12229412785 (12.2 GB) 

tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 
inet addr:XX P-t-P:XX Mask:255.255.255.255 
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 
RX packets:6382168 errors:0 dropped:0 overruns:0 frame:0 
TX packets:6004894 errors:0 dropped:46397 overruns:0 carrier:0 
collisions:0 txqueuelen:100 
RX bytes:7066816609 (7.0 GB) TX bytes:4808493953 (4.8 GB) 

连接VPN前的路由表:

ip route show
default via 192.168.2.254 dev p4p1
192.168.2.0/24 dev p4p1  proto kernel  scope link  src 192.168.2.201

连接VPN后的路由表:

ip route show
0.0.0.0/1 via 10.124.1.5 dev tun0
default via 192.168.2.254 dev p4p1
10.124.1.1 via 10.124.1.5 dev tun0
10.124.1.5 dev tun0  proto kernel  scope link  src 10.124.1.6
109.201.154.152 via 192.168.2.254 dev p4p1
128.0.0.0/1 via 10.124.1.5 dev tun0
192.168.2.0/24 dev p4p1  proto kernel  scope link  src 192.168.2.201

答案1

我遇到了和你一样的问题。你必须禁用 rp_filter 并将所有目标端口为 80 和 8080 的流量重定向到你的正常接口。

禁用反向路径过滤

for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do
echo 0 > $i
done

我们将使用表 100。确保它没有被其他任何东西使用!我们将刷新它

ip route flush table 100
ip route del default table 100
ip rule del fwmark 1 table 100
ip route flush cache
iptables -t mangle -F PREROUTING

为所有连接创建表(不是 VPN 隧道)

ip route show table main | grep -Ev ^default | grep -Ev tun0 \
| while read ROUTE ; do
ip route add table 100 $ROUTE
done
ip route add default table 100 via 192.168.2.254
ip rule add fwmark 1 table 100 
ip route flush cache

绕过端口 80 和 8080

iptables -t mangle -A PREROUTING -i p4p1 -p tcp -m multiport --dports 80,8080 -j MARK --set-mark 1

答案2

当然是可能的——基于策略的路由他们称之为。

您可以使用防火墙标记,然后利用ip rule

在此处输入图片描述

拉拉训练中心是您希望仔细阅读的内容。

答案3

您可以忽略或者覆盖从服务器推送的redirect-gateway选项。 https://community.openvpn.net/openvpn/wiki/IgnoreRedirectGateway

忽略重定向网关

如果您以客户端身份运行 OpenVPN,并且您使用的服务器使用推送“重定向网关”,则您的客户端会通过 VPN 重定向所有互联网流量。有时客户端不希望这样,但他们无法更改服务器的配置。本页介绍如何覆盖重定向网关,以便客户端无需重定向互联网,即使服务器要求这样做。方法 1:忽略

有两个选项可用于忽略服务器推送的路由:

--route-noexec 不自动添加或删除路由。而是使用环境变量将路由传递给 --route-up 脚本。

--route-nopull 与 --client 或 --pull 一起使用时,接受服务器推送的选项,但路由和 dhcp 选项(如 DNS 服务器)除外。在客户端上使用时,此选项可有效禁止服务器向客户端的路由表添加路由,但请注意,此选项仍允许服务器设置客户端 TUN/TAP 接口的 TCP/IP 属性。

方法 2:覆盖

在这里,我们将简单地添加覆盖 --redirect-gateway 的路由。这将与 --redirect-gateway 的 def1 标志的工作方式非常相似。如果服务器使用 --redirect-gateway 选项的 def1 标志或不使用,情况可能会有所不同(通过在连接时检查日志)。请注意,net_gateway 是 openvpn 的内部变量,不需要更改为任何内容。如果您不知道您的服务器是否使用 def1,并且不想检查日志来弄清楚,只需假设他们确实使用 def1 并使用 4 条路由。无论如何,这都会起作用。

def1 — 使用此标志可使用 0.0.0.0/1 和 128.0.0.0/1 而不是 0.0.0.0/0 覆盖默认网关。这样做的好处是可以覆盖但不会消除原始默认网关。

如果服务器不使用 def1,请将以下选项添加到客户端配置中:

路由 0.0.0.0 128.0.0.0 网络网关 路由 128.0.0.0 128.0.0.0 网络网关

如果服务器确实使用 def1 或者您不知道,请将以下选项添加到客户端配置中:

路由 0.0.0.0 192.0.0.0 网络网关路由 64.0.0.0 192.0.0.0 网络网关路由 128.0.0.0 192.0.0.0 网络网关路由 192.0.0.0 192.0.0.0 网络网关

然后来自外部的流量将通过正常网关,来自 VPN 子网的流量将进入 VPN。如果 VPN 子网后面有其他网络,则必须手动为它们添加路由。

路由 10.0.0.0 255.255.255.0 vpn_gateway

答案4

我相信正确的解决方案是分割隧道,或者是我将在客户端工作站上执行的操作,但您的情况略有不同,因为有一个服务器:是否可以添加第二个网络接口?

在这种情况下,您可以通过第一个接口路由所有 VPN 流量,而让您的服务通过第二个接口进行监听。

相关内容