虚拟网关iptables

虚拟网关iptables

我正在尝试设置一种简单的网络配置,但我无法理解这一点。我的目标是让 LAN 客户端通过 VPN,同时能够访问服务器本身。当前设置:

GW机:

VPN interface -> vpn0 [10.x.y.z]
LAN interface -> lan0 [172.16.1.0/24], machine itself is 172.16.1.1

我已经为 VPN 连接创建了单独的路由表,并且我能够访问它;例如ping -I vpn0 10.20.30.40(VPN 网络中的机器)工作得很好。目前,如果我这样做,我可以为 LAN 客户端启用 VPN 访问:

ip rule add from 172.16.1.0/24 table vpntable
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o vpn0 -j MASQUERADE

然而,在这种情况下,客户端无法访问网关计算机 ( 172.16.1.1) 本身,这是预期的。我的目标是能够达到两个都网关机和 VPN 一台来自 LAN 端。我很确定MASQUERADE这是罪魁祸首,但我不确定我应该朝哪个方向走。我心里有两个想法:

  1. 通过模块创建虚拟接口dummy并尝试将其配置为 LAN 客户端的“网关”?就像默认情况下他们能够到达一样172.16.1.1,如果他们执行类似的操作ip route add 10.20.30.0/24 via 172.16.16.1172.16.16.1该虚拟接口的地址在哪里;然而我担心我最终会陷入很多SNAT规则中,并且会产生更多的开销。
  2. 通过连接标记进行基于策略的路由?在这种情况下,客户无需执行任何其他步骤。

GW 机器是 Ubuntu LTS,转发已打开,除了提到的规则外,iptables 是空的。

我将不胜感激有关该主题的任何意见。谢谢你!

更新:

vpntable包含特定于 VPN 网络的路由:

default via 10.20.1.1 dev vpn0

答案1

这里不涉及netfilter和NAT,都是关于路由的。


随着政策规则的遍历虚拟专用网表首先,由于默认路由,该路由表始终匹配以提供路由查找的答案主要的当使用网关自己的 172.16.1.1 时,不再使用路由表。所以没有什么可以告诉使用的局域网0不再了。

因此,虽然最初的路线选择将使用局域网0:

$ ip route get to 172.16.1.2
172.16.1.2 dev lan0 src 172.16.1.1 uid 1000 
    cache 

选择此路由后,会将地址设置为 172.16.1.0/24 的 172.16.1.1 部分,因此将切换为使用VPN0:

$ ip route get from 172.16.1.1 to 172.16.1.2
172.16.1.2 from 172.16.1.1 via 10.20.1.1 dev vpn0 table vpntable uid 1000 
    cache 

修复方法是添加一个例外以保持不变局域网0在这种情况下。

有几种方法可以做到这一点,都应该解决问题,通常使用第一个或最后一个(最简单的):

  • 在 VPN 路由表中指定 LAN 路由

    ip route add 172.16.1.0/24 dev lan0 table vpntable
    
  • iif lo或者首先解析 LAN 以获取本地流量(这里的特殊含义是本地发起的流量,它并不真正涉及接口)与调用路由规则主要的路由表。在它具有较低优先级之后添加,并在调用它的之前进行评估虚拟专用网表路由表:

    ip rule add iif lo to 172.16.1.0/24 lookup main
    
  • 或者作为上一个项目符号的变体:跳过 VPN 规则,直接转到调用主要的路由表:

    ip rule add iif lo to 172.16.1.0/24 goto 32766
    
  • 或者在初始路由规则中指定接口而不是地址(必须删除):

    ip rule delete from 172.16.1.0/24 lookup vpntable
    ip rule add iif lan0 lookup vpntable
    

    这样它就不会触发本地地址,因为它不是从局域网0

与第一种方法相反,当绑定到 172.16.1.1 源时,最后一种方法甚至不允许在默认情况下在网关上使用 VPN(此时仍会通过 MASQUERADE 规则进行 NAT)。

相关内容