我本质上是一个路由问题,我不熟悉路由和iptables有效地排除故障,并设置我的networking需求。
我有一个开放的VPNnetworkingbuild立和工作; 客户端可以通过互联网连接到局域网。
…当客户端连接到给定子网上的VPN时。
奖励积分如果规则可以做以下一项或多项:
我们的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表上运行。
关于链
这是上述“ 当前设置”下的规则说明
iptables -t filter -F iptables -t nat -F
这些规则只需刷新filter和nat表。 请注意,有更多的表和更彻底的清除iptables规则的方式。
iptables -A INPUT -i tun+ -j ACCEPT
这个规则什么都不做,因为:
继续…
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之后,更好的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。