OpenVPN:使用静态路由作为网关,通过 eth1 路由 VPN 流量

OpenVPN:使用静态路由作为网关,通过 eth1 路由 VPN 流量

我的 ESXi 服务器上的 Debian 8 VM 正在运行 OpenVPN 服务器,该服务器运行良好,直到我决定使用另一个 IP 向该机器添加另一个接口。我想将一个 IP 仅用于 VPN 流量,而不是用于服务器管理。

这些都是外部 IP。但我使用的提供商使用了一种相当奇怪的配置,我必须将网关设置为子网外的 IP。而且由于没有多少操作系统接受这一点,我必须创建静态路由。

它看起来是这样的:

root@ln-1:/etc/openvpn# ifconfig
eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx
          inet addr:92.xxx.xxx.xxx  Bcast:92.xxx.xxx.xxx  Mask:255.255.255.255
          inet6 addr: fe80::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:271765 errors:0 dropped:10 overruns:0 frame:0
          TX packets:4545 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:16520579 (15.7 MiB)  TX bytes:1027263 (1003.1 KiB)

eth1      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:217.xxx.xxx.xxx  Bcast:217.xxx.xxx.xxx  Mask:255.255.255.255
          inet6 addr: fe80::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:271152 errors:0 dropped:9 overruns:0 frame:0
          TX packets:15 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:16727664 (15.9 MiB)  TX bytes:1598 (1.5 KiB)

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:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:45 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:2774 (2.7 KiB)  TX bytes:0 (0.0 B)

至于路由,我在两个接口上都配置了到 91.xxx.xxx.xxx(网关)的路由,但是我在 eth0 上设置了默认路由,我认为这会让机器默认使用那个,但我希望 VPN 流量通过 eth1,使用相同的网关 IP:

root@ln-1:/etc/openvpn# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         91.xxx.xxx.xxx  0.0.0.0         UG    0      0        0 eth0
10.8.0.0        10.8.0.2        255.255.255.0   UG    0      0        0 tun0
10.8.0.2        0.0.0.0         255.255.255.255 UH    0      0        0 tun0
91.xxx.xxx.xxx  0.0.0.0         255.255.255.255 UH    0      0        0 eth1
91.xxx.xxx.xxx  0.0.0.0         255.255.255.255 UH    0      0        0 eth0

以及 iptables 配置:

root@ln-1:/etc/openvpn# iptables-save
# Generated by iptables-save v1.4.21 on Tue May  9 00:08:15 2017
*filter
:INPUT DROP [8286:454500]
:FORWARD DROP [801:48621]
:OUTPUT ACCEPT [4648:980772]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 443 -j ACCEPT
-A FORWARD -i eth1 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.8.0.0/24 -o eth1 -j ACCEPT
COMMIT
# Completed on Tue May  9 00:08:15 2017
# Generated by iptables-save v1.4.21 on Tue May  9 00:08:15 2017
*nat
:PREROUTING ACCEPT [19909:1034285]
:INPUT ACCEPT [54:2776]
:OUTPUT ACCEPT [144:10480]
:POSTROUTING ACCEPT [144:10480]
-A POSTROUTING -s 10.8.0.0/24 -o eth1 -j MASQUERADE
COMMIT
# Completed on Tue May  9 00:08:15 2017

SSH 我想要通过 eth0,其余的 VPN 流量通过端口 443,并通过端口 80 提供 OpenVPN 设置,以便于查找。OpenVPN 配置包括以下几行:

local 217.xxx.xxx.xxx
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

IP 转发已打开,一切正常,直到我想使用 eth0 进行除 VPN 流量之外的所有流量,使用 eth1 仅进行 VPN 流量。

我似乎无法让它工作,我搜索了很多,但找不到任何有类似设置并解决了这个问题的人。任何帮助都将不胜感激!

如果我遗漏了一些相关内容,请告诉我,我当然会添加它,另外,我实际上是第一次在这个网站上发布内容,如果我做错了什么,请原谅我。

编辑于 2017 年 5 月 10 日 22:07 CEST:我有新的信息:显然,OpenVPN 尝试从 tun0 路由/转发到 eth0,我正在尝试使用 iptables 日志记录:

-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

这向我展示了这一点:

May 10 21:20:15 ln-1 kernel: [176312.426411] iptables_FORWARD_denied: IN=tun0 OUT=eth0 MAC= SRC=10.8.0.6 DST=157.56.144.215 LEN=89 TOS=0x00 PREC=0x00 TTL=127 ID=1513 PROTO=UDP SPT=57959 DPT=3544 LEN=6

我也很惊讶看到PROTO=UDP这里,因为服务器和客户端都配置为使用 TCP。

答案1

您可以将本地参数放入 OpenVPN 配置文件中,强制客户端使用特定 IP 地址绑定到接口。

--local host

Local host name or IP address for bind. If specified, OpenVPN will bind to this address only. If unspecified, OpenVPN will bind to all interfaces.

您也可以在客户端配置文件中指定它

local ip.add.re.ss

这样,传入的 VPN 连接(仅隧道,而不是转发的数据包)将仅通过 eth1 接受。现在,如果您想使用 eth1 将来自 VPN 的流量路由到互联网,您需要使用基于策略的路由。类似于

ip 规则从 / 表添加 ip 路由通过 dev tun0 表添加 1.2.3.4/24

是 /etc/iproute2/rt_tables 中指定的表名,或者您可以使用数字 id ...

这基本上意味着,来自 1.2.3.4/24 的所有流量都将使用路由表进行路由。IIRC 经过此操作后不会使用默认表,因此如果您需要其他路由(即默认网关),您也需要将它们添加到表中。

我认为,通过规则,您肯定可以调整您的设置以使其正常工作。

这里有更多关于基于源的策略路由的参考:

SuperUser - CentOS 5 上的基于源的策略路由和 NAT(DNAT/SNAT)又称为多 WAN

祝你好运。

相关内容