iptables:通过VPN服务器从局域网访问连接的openvpn客户端

我本质上是一个路由问题,我不熟悉路由和iptables有效地排除故障,并设置我的networking需求。

什么工作

我有一个开放的VPNnetworkingbuild立和工作; 客户端可以通过互联网连接到局域网。

我想要发生什么

…当客户端连接到给定子网上的VPN时。

  • 客户端应该可以从VPNnetworking访问

奖励积分如果规则可以做以下一项或多项:

  • 客户端不应该能够发起到VPN的连接
  • 客户端应该显示在我们的DNS

拓扑

我们的networking拓扑如下所示:

______ ____________________ / \ / \ | internet |---| client (10.8.8.0/24) | \________/ \____________________/ | ______ / \ | gateway | \________/ | -----LAN------ (10.10.10.0/24) | | | | L_____VPN Server `VPN1` 10.10.10.2 (fictional name/subnet) 

当前的设置

我们的网关有以下路线定义:

 10.8.8.0 255.255.255.0 10.10.10.2 LAN & WLAN 

VPN1 ,iptables有以下规则

 # Flush the filter and nat tables iptables -t filter -F iptables -t nat -F iptables -A INPUT -i tun+ -j ACCEPT iptables -A FORWARD -i tun+ -j ACCEPT iptables -A INPUT -i eth0 -j ACCEPT -d 10.8.8.0/24 iptables -A FORWARD -i eth0 -j ACCEPT iptables -t nat -A POSTROUTING -s 10.10.10.0/16 -d 10.8.8.0/24 -o tun+ -j MASQUERADE 

目前发生了什么事

运行命令mtr 10.8.8.1 (在VPN上连接的客户端的IP)显示当前路由在VPN1和网关之间来回跳动。

经过又一轮的iptables在线疯狂学习,我发现了这个解决scheme。

但是,首先对iptables有一个无效的假设。 我最初的规则是当收到一个数据包时,它将通过INPUT和OUTPUT链运行。 不是这样; 一个规则匹配一个包的分钟,它离开了表。 由于除非指定了filter表(例如“-t nat”),否则大多数列出的规则都在filter表上运行。

关于链

  • INPUT :运行在去往服务器的数据包上
  • OUTPUT :运行在源自服务器的数据包上
  • FORWARD :其他所有 – 如果一个规则匹配在这里,跳转(我喜欢认为,如果-j为“工作”;)是接受,数据包将被适当地路由

规则的细分

这是上述“ 当前设置”下的规则说明

 iptables -t filter -F iptables -t nat -F 

这些规则只需刷新filternat表。 请注意,有更多的表和更彻底的清除iptables规则的方式。

 iptables -A INPUT -i tun+ -j ACCEPT 

这个规则什么都不做,因为:

  • 它运行在发往VPN1的stream量上,而不是另一个networking上
  • 没有为传入stream量设置策略,所以默认情况下是允许的

继续…

 iptables -A FORWARD -i tun+ -j ACCEPT 

此规则允许来自10.8.8.0/24的stream量被路由。 nat表中的规则在符合此规则的数据包上运行。

 iptables -A INPUT -i eth0 -j ACCEPT -d 10.8.8.0/24 

此规则对所需的路由也没有影响,因为10.8.8.0/24stream量不是针对VPN1服务器的。

 iptables -A FORWARD -i eth0 -j ACCEPT 

此规则允许来自10.10.10.0/16的stream量被路由。

 iptables -t nat -A POSTROUTING -s 10.10.10.0/16 -d 10.8.8.0/24 -o tun+ -j MASQUERADE 

此规则导致从10.10.10.0/16发往VPN的stream量看起来像来自VPN1,这有效导致VPN1看起来像网关。

怎么了?

规则应该是“OK”,以便从一个networking到另一个networking获得stream量。 没有任何实际的保护 – 例如默认的“DROP”政策等,但这不是问题的关键。

如果iptables设置为可以通过VPN路由stream量,那么什么会导致它通过eth0发送回网关? 如果VPN1不知道10.8.8.0/24。 如果VPN服务器不知道该networking,它将被视为互联网stream量并发送回网关。

修复

解决scheme是告诉VPN服务器关于networking(这是一个openvpn服务器)。 有两种方法可以做到这一点; 如果服务器只服务于一个networking,那么这是一个简单的configuration设置:

 server 10.8.8.0 255.255.255.0 

在我的情况下,我设置了服务器路由,我需要知道一个额外的networking。 configuration看起来更像这样:

 server 10.5.5.0 255.255.255.0 route 10.8.8.0 255.255.255.0 

而已! 一旦VPN1有一个路由到networking,FORWARD链路能够路由stream量。

一个更好的iptables设置

在刷新iptables之后,更好的configuration会看起来像这样:

 # Forward established traffic so that (in the above case) VPN1 doesn't # drop responses from the client, AKA "the magic" iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -t filter -A FORWARD -s 10.10.10.0/16 -d 10.8.8.0/24 -j ACCEPT iptables -t nat -A POSTROUTING -s 10.10.10.0/16 -d 10.8.8.0/24 -j MASQUERADE # Drop everything else that wants to be forwarded iptables -P FORWARD DROP 

请注意,对于来自10.8.8.0/24的stream量没有明确的规则,这意味着默认情况下stream量不会到达10.10.10.0/16networking – 除了响应从10.10.10.0/16发送的stream量的stream量。 现在iptables已经build立起来了,客户端可以在VPNconfiguration中分配一个IP,并添加到DNS中获得一个完整的解决scheme。