如何将 LAN 流量重定向到网关上的 L2TP/IPsec 客户端连接?

如何将 LAN 流量重定向到网关上的 L2TP/IPsec 客户端连接?

我在网关上建立了 L2TP/IPsec 客户端连接,并尝试重定向 LAN 上的主机以便在访问 Internet 时使用此连接。

这是网络拓扑。

网络拓扑结构

这是我的网关的路由表:

$ ip route
default dev pppoe-wan  scope link 
1.0.0.1 dev ppp1  proto kernel  scope link  src 192.168.179.11
6.6.6.6 dev pppoe-wan  scope link 
5.5.5.5 dev pppoe-wan  proto kernel  scope link  src 5.5.5.5
192.168.1.0/24 dev br-lan  proto kernel  scope link  src 192.168.1.1 

$ ip rule
1:  from all lookup local 
10: from 192.168.1.2 lookup 10 
32766:  from all lookup main 
32767:  from all lookup default 

$ ip route show table 10
default dev ppp1  scope link 
6.6.6.6 via 5.5.5.5 dev pppoe-wan 
192.168.1.0/24 via 192.168.1.1 dev br-lan

问题是,在将默认路由添加到表 10 后,我的主机无法再访问 Internet。使用 tcpdump 监听接口 ppp1 ( tcpdump -i ppp1) 发现没有包裹流过它。

我尝试使用以下命令伪装 ppp1 接口:

$ iptables -t nat -A POSTROUTING -o ppp1 -j MASQUERADE

这没用,仍然没有数据包通过接口。此外,内核还可以重定向数据包:

$ cat /proc/sys/net/ipv4/ip_forward
1

但如果我直接在网关上使用该接口,它就可以正常工作:

$ curl --interface ppp1 google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.com.hk/?gfe_rd=cr&amp;ei=suORVbLfOKXC8Af3noGwDA">here</A>.
</BODY></HTML>

因此,看起来网关的 Linux 内核不知何故丢弃了来自我主机的数据包。但是所有接口都没有启用反向路径过滤:

$ cat /proc/sys/net/ipv4/conf/ppp1/rp_filter
0

$ cat /proc/sys/net/ipv4/conf/pppoe-wan/rp_filter
0

所以我束手无策了。为什么主机流量从不经过 ppp1?我该如何将主机重定向到 L2TP/IPsec 客户端连接?

我对 PPTP 客户端使用了相同的配置,运行良好。但对 L2TP/IPsec 客户端却不起作用。

网关是一个 OpenWrt 盒子(Chaos Calmer 15.05-rc2,内核 3.18.14)。我使用 strongSwan(5.3.0) + xl2tpd(1.3.6) 来设置 L2TP/IPsec 客户端。

这是 strongSwan 的配置:

conn example
    auto=start
    keyexchange=ikev1
    type=transport
    left=%defaultroute
    leftauth=psk
    right=server.example.com
    rightid=%any
    rightauth=psk
    dpdaction=restart
    dpddelay=10s
    dpdtimeout=60s

以及 xl2tpd 的配置

[lac example]
lns = server.example.com
length bit = yes
redial = yes
max redials = 5
pppoptfile = /etc/ppp/options.xl2tpd

以及 ppp 的配置

noauth
mru 1452
mtu 1452
nomppe
ipcp-accept-remote
ipcp-accept-local
nopcomp
noaccomp
lcp-echo-interval 10
lcp-echo-failure 5

主机是一台Mac(Yosemite 10.10.3)。

先谢谢您的帮助。

PS 只有网关的 Internet IP 和服务器的 Internet IP 被替换为假 IP,其他 IP 均为真实使用的 IP。

答案1

我终于解决了。数据包被netfilter(iptables)丢弃了。

OpenWrt 默认丢弃从 br-lan 转发的数据包。所以我们需要允许从 br-lan 转发数据包到 ppp1。

$ iptables -I FORWARD -i br-lan -o ppp1 -j ACCEPT

此后,主机即可访问互联网。

请注意,您需要使用-I以便将此规则插入到删除规则之前,使其优先。

答案2

你伪装了错误的接口。你需要伪装,因为基本上你正在进行 NATTING,但虚拟接口无法直接伪装。

相反你应该使用:

      iptables -t nat -A POSTROUTING -o pppoe-wan -j MASQUERADE 

这将伪装任何事物从您的常规接口出来,其中会有来自您的 Yosemite 主机的 NAT 数据包。

我突然意识到这是你上面讨论中唯一的弱点。经过一番搜索,我可以通过阅读以下内容来确认确实如此此 Debian Wiki 网页. 有一次,我心爱的 Arch Linux Wiki 让我失望了。

相关内容