对您的配置中发生的情况的解释。

对您的配置中发生的情况的解释。

你能帮我解决这个问题吗?我需要将所有流量从 tun0 接口(OpenVPN 隧道)重定向到 eth1 接口。 eth1 是该系统后面的内部网络,用作特殊防火墙...如果我使用此规则(现在仅用于测试目的 - 目标端口 80):

iptables -t nat -A PREROUTING -i tun0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.199.115.146

来自 VPN 的流量正确通过。我在 iptables 统计信息(iptables -L -v)中看到它,但反向流量没有通过。 iptables 显示此错误:

99689.703349 x_tables: ip_tables: tcp match: only valid for protocol 6  

我需要仅通过 tun0 接口重定向来自防火墙后面的计算机的所有流量。我也使用这个规则:

iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE   

我已启用ip_forward.如果我仅使用规则-p tcp而不使用规则,-m tcp我会在规则中的 iptables 统计活动中看到iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

接口

VPN 服务器(A):

eth0      Link encap:Ethernet  HWaddr 00:...
          inet addr:MY_PUBLIC_IP  Bcast:MY_PUBLIC_IP.255  Mask:255.255.255.0
          inet6 addr: .../64 Scope:Global
          inet6 addr: .../64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:41909528 errors:0 dropped:0 overruns:0 frame:0
          TX packets:373639 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2150448064 (2.1 GB)  TX bytes:185713075 (185.7 MB)
          Interrupt:10

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.1.1.1  P-t-P:10.1.1.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:82014 errors:0 dropped:0 overruns:0 frame:0
          TX packets:164251 errors:0 dropped:24 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:5945388 (5.9 MB)  TX bytes:147587733 (147.5 MB)

在防火墙机器上:

eth0      Link encap:Ethernet  HWaddr 08:...
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:189399 errors:0 dropped:0 overruns:0 frame:0
          TX packets:103528 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:180399131 (180.3 MB)  TX bytes:14844868 (14.8 MB)


tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.1.1.2  P-t-P:10.1.1.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:153314 errors:0 dropped:0 overruns:0 frame:0
          TX packets:80986 errors:0 dropped:8 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:145341797 (145.3 MB)  TX bytes:5818996 (5.8 MB)

eth1      Link encap:Ethernet  HWaddr 08:...
          inet addr:10.199.115.1  Bcast:10.199.115.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6890 errors:0 dropped:0 overruns:0 frame:0
          TX packets:23022 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:710721 (710.7 KB)  TX bytes:43966879 (43.9 MB)

机器B:

eth0      Link encap:Ethernet  HWaddr 08:...
          inet addr:10.199.115.146  Bcast:10.199.155.255  Mask:255.255.255.0
          inet6 addr: .../64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:24185 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8044 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:29645960 (28.2 MiB)  TX bytes:842414 (822.6 KiB)

架构:

VPN server (A) /eth0 - public IP, tun0 VPN/ <-> Firewall (F) /tun0 VPN, eth1 - internal network/ <-> Server (B) (eth0 - internal network)

从防火墙后面的机器初始化的通信工作正常。非常感谢您的帮助。

路由表:

VPN 服务器 A: - 是 VPS 服务器

10.1.1.2 dev tun0  proto kernel  scope link  src 10.1.1.1
MY_PUBLIC_IP.0/24 dev eth0  proto kernel  scope link  src MY_PUBLIC_IP
10.199.115.0/24 via 10.1.1.2 dev tun0
default via MY_PUBLIC_IP.1 dev eth0  metric 100

///一台物理服务器

防火墙 F:是虚拟机 VirtualBox Ubuntu - eth0 是 VirtualBox NAT,但我需要使用 tun0,eth1 是 B 的本地网络

0.0.0.0/1 via 10.1.1.1 dev tun0
default via 10.0.2.2 dev eth0  metric 100
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15
10.1.1.1 dev tun0  proto kernel  scope link  src 10.1.1.2
10.199.115.0/24 dev eth1  proto kernel  scope link  src 10.199.115.1
MY_PUBLIC_IP via 10.0.2.2 dev eth0
128.0.0.0/1 via 10.1.1.1 dev tun0

eth1 端的 B 机(无 eth0)是​​虚拟机 Debian 7

default via 10.199.115.1 dev eth0 proto static
10.199.115.0/24 dev eth0 proto kernel scope link src 10.199.115.146

数据包的路由应该尽可能透明甚至不可见......

iptables规则:

在 VPN 服务器 (A) 上:

仅表 NAT:

-P PREROUTING ACCEPT
-P POSTROUTING ACCEPT
-P OUTPUT ACCEPT
-A PREROUTING -i eth0 -p tcp -m tcp --dport 0:1192 -j DNAT --to-destination 10.1.1.2
-A PREROUTING -i eth0 -p tcp -m tcp --dport 1195:65535 -j DNAT --to-destination 10.1.1.2
-A PREROUTING -i eth0 -p udp -m udp --dport 0:1192 -j DNAT --to-destination 10.1.1.2
-A PREROUTING -i eth0 -p udp -m udp --dport 1195:65535 -j DNAT --to-destination 10.1.1.2
-A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE

过滤表

is empty 

曼格表

is empty

在防火墙 (F) 上:

目前在上次修改后

NAT表:

none

过滤表

contains many specific rules for mitigation etc...  

曼格表

is empty

在机器B上

without iptables rules

答案1

服务器 A 缺少建议通过 VPN 连接到网络的路由10.199.115.0/24,因此使用其默认路由(即尝试通过您的公共 IP 到达 B)。

尝试看看是否运行

ip route add 10.199.115.0/24 via 10.1.1.2

服务器 A 上将允许从 A 到 B 的连接(防火墙 F 上没有任何 NAT 规则)

如果这有效,您可以设置 openvpn 在您从 A 启动连接时自动为您创建路由

对您的配置中发生的情况的解释。

这是三种情况下路由/NAT 的发生方式

情况 1:B ping PUBLIC_IP

  • 该数据包使用该路由离开 B default,因为它是唯一匹配 的数据包PUBLIC_IP。它被发送到 IP 地址进行路由10.199.115.1,并带有最终目的地PUBLIC_IP和源地址10.199.115.146
  • 数据包由 F 路由。许多路由适用:最具体的一个是发送要在上的PUBLIC_IP/32机器上路由的数据包,我猜它是机器 A(openvpn 底层的连接)。10.0.2.2eth0
  • 机器A收到数据包,并回复源地址10.199.115.146。如果没有我向您展示的规则,这将被解释为互联网地址,因此回复将通过互联网发送。
  • 使用我建议的路由,数据包通过tun0机器 F 返回。机器 F 将其路由回eth1机器 B 接收回复数据包的地方。然而,它的来源被标记为10.1.1.1,因此它不会被识别为对原始数据包的回复。 Ping 失败。

情况 2:B ping 10.1.1.1

  • 与之前相同,数据包离开 B 由 F 路由
  • 这次目的地址匹配了规则10.1.1.1/32,所以数据包通过tun0
  • 当数据包通过 发出时tun0MASQUERADE规则生效,将数据包的源更改为10.1.1.2。 (如果使用我建议的路线规则,则不需要这样做,请参见下文)。
  • 机器A收到数据包,并回复10.1.1.2(机器F)。没有MASQUERADE这个就会被送回10.199.115.146。对于我建议的路由表条目,这不会有太大变化,因为包裹10.1.1.2仍然会被发送到路由,但是如果您没有,目的地10.199.115.146将通过互联网路由。
  • 回复数据包由机器 F 接收。如果执行了伪装,则该数据包将被识别为回复,并且其目标地址将更改回10.199.115.146。数据包被路由eth1到其最终目的地。
  • 机器 B 将此识别为回复数据包。平成功。

案例3:A ping 10.199.115.146

  • 如果没有我提议的规则,原始数据包将被发送到互联网并丢失。否则,它将被发送到10.1.1.2路由,源地址 = 10.1.1.1
  • 机器 F 接收数据包并将其路由通过eth1
  • B 收到该数据包并将回复发送至10.1.1.1
  • 回复通过 进行路由tun0。该MASQUERADE规则将源地址更改为10.1.1.2
  • 机器 A 收到来自 的回复10.1.1.2(该回复不是原始目的地),并将其视为不相关而丢弃。 Ping 失败

如您所见,有两种方法可以将机器从内部网络连接到 VPN:

  • 公共路由:两个网络都知道彼此的 IP 地址,并且它们具有特定的路由表条目来查找它们(如我向您展示的那样)。
  • SNAT/MASQUERADE:只有一个网络知道如何到达另一个网络,防火墙将从该网络发出的传出数据包的源 IP 地址更改为防火墙自己的 IP(另一个网络已知)。

两者都不要使用。如果使用 SNAT/MASQUERADE,则外部主机上的路由表不适用,因为来自专用网络的数据包永远不会使用原始地址作为源。

PUBLIC_IP您可以使用或选择机器 A 是否可以从 B 访问10.1.1.1。也许可以配置防火墙以使两者都可以工作,但这可能不值得付出努力。

相关内容