我在网关上建立了 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&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 让我失望了。