如何用 iproute2 建隧道

2015-04-30 11:09:41 +08:00
 jxwzhx

一台在Internet上(A),另一台在NAT防火墙后面(B),求助:
1、搭l2tp隧道的正确姿势
2、搭fou隧道的正确姿势
具体地说,B的local要填公网ip还是内网ip,A的remote要填什么。。
我抓包啥都抓不到估计是ip填得不对吧TvT
求大神指导orz 感激不尽!

2839 次点击
所在节点    问与答
16 条回复
liwei
2015-04-30 12:13:29 +08:00
说实话iproute的命令行接口设计的实在是不好,我就没记得一次我能够不查help正确的把命令写出来的,再加上错误信息提示也是莫名其妙,用起来经常要去看代码。
kiritoalex
2015-04-30 13:15:49 +08:00
所以解决楼上问题的办法就是用Gentoo把配置写到文件里而不是用命令
efi
2015-04-30 13:23:57 +08:00
jxwzhx
2015-04-30 13:50:19 +08:00
@efi 正是照着这篇文章捣鼓的,然而并没有成功。。。
efi
2015-04-30 13:51:44 +08:00
为什么没有成功 怎么失败了
jxwzhx
2015-04-30 14:02:38 +08:00
@efi 两边配好之后ping不通啊。。抓包一看啥都没有 隧道完全没生效。。client的local是填局域网ip么?
efi
2015-04-30 14:07:14 +08:00
iproute2是模仿思科的,ip的语法已经很好了,tc的语法才叫难。

一共就几个IP,多试试总能试出来。

ip -s link dev l2tpeth0或者iptables -L -nv可以看有多少流量在走。
KCheshireCat
2015-04-30 14:25:15 +08:00
Naive-VPN.md 做启发思路是不错的,告诉你有这个方法,做一个引导性的文章还是不行。

CLIENT_IP确实填的是本机的内网IP,但只有这个应该是没法工作的,应该是要配合本地网关的SNAT

文中提到cookie其实是无所谓的,因为是静态所以没用,不设置还能缩小报头

文中mtu完全没有计算过,或者说连ping一下都没做,如果本地是pppoe接入mtu应该设置1430,不设置cookie还能+8

netfilter的链接跟踪产生的3分钟问题也没有很好解决。
sysctl -w net.netfilter.nf_conntrack_udp_timeout_stream=10
sysctl -w net.netfilter.nf_conntrack_udp_timeout=10
个人是修改这两项来回避3分钟,是不是有效还是没有验证
efi
2015-04-30 14:33:11 +08:00
@KCheshireCat

NAT是服务端做的,中间不需要配置

cookie是防DoS的

新建interface有pmtu discovery,不需要手动

conntrack的状态是一个feature,让服务端保留客户端地址
efi
2015-04-30 14:34:32 +08:00
我珍藏的一个书签,帮助理解如何正确使用tc:
http://www.coverfire.com/articles/queueing-in-the-linux-network-stack/
KCheshireCat
2015-04-30 14:52:21 +08:00
@efi

服务端做隧道内的包的NAT,本地做隧道外的包的NAT

本地SNAT是将服务端发回来的隧道包的目标地址恢复为本机内网IP

隧道是检验IP和端口的,不正确就会丢弃

静态隧道cookie不会变,真的有需要就再套一层IPsec隧道

pmtu discovery我并不了解所以针对原文提了一个合理的mtu

3分钟问题是ISP的NAT是黑箱,公网IP什么时候会变,源端口会不会被强行修改都是不确定的

我经常遇到突然无法ping通隧道的情况

有时iptables上有包记录,有时没有

所以再找解决方法
efi
2015-04-30 15:05:33 +08:00
@KCheshireCat

总之有很多NAT啦

l2tp cookie是在IPsec下层的,IPsec无法给l2tp提供authentication;或者把l2tp放在IPsec里面的话,IPsec本身没法穿越NAT,IPsec的udpencap需要用户来协调。

如果公网IP变的很快的话,嗯。端口映射保存时间太短是一个安全问题,和性能问题。现在靠的是抢占排他3分钟来防止安全问题。可以用iptables m32检查l2tp cookie去验证端口映射是你发起的,这个是可以的。
jxwzhx
2015-04-30 15:46:03 +08:00
@efi @KCheshireCat 我刚才试了下,通过在服务端的INPUT链上做SNAT,服务端可以收到封装后的ping包,但是回复的时候发给了那个SNAT到的地址(文中的10.53.0.255)=。=
所以说应该怎么设置DNAT把地址转换回去(回到客户端的公网IP&PORT)呢?MASQUERADE好像可以两头换,但是只能设置在POSTROUTING链上TvT
jxwzhx
2015-04-30 17:47:57 +08:00
哦我错了= = snat本身就是双向的。。。按照那篇文章是可以做出来的 谢谢啦 @efi
KCheshireCat
2015-05-01 00:25:41 +08:00
@efi

cat /proc/net/nf_conntrack
ipv4 2 udp 17 14 src=111.140.44.160 dst=108.61.160.X sport=26518 dport=5120 [UNREPLIED] src=108.61.160.X dst=111.140.44.160 sport=5120 dport=26518 mark=0 zone=0 use=2

刚才隧道断了,然后我换了SESSION_ID和PORT重建了一下

一开始没有包到达,然后就发现有包到达重建之前隧道的端口,而且源端口是变动过的。

等nf_conntrack记录超时后,再ping隧道,服务端依旧收到老端口的包,

然后还有一个现象是我在iptables上做SNAT是u32的SESSION_ID匹配,收到老端口报的时候iptables没有匹配记录,说明SESSION_ID不是新的。

中间源IP和源端口还多次变化,但目标端口依旧是老的,iptables也匹配不到

甚至有一次还直接到达没有被NAT过

难道ISP的设备能够识别UDP的静态l2tpv3并且做了缓存?

还是仅仅复制了一份包样本,重发做干扰?

ISP的NAT太奇怪了。。。
efi
2015-05-01 01:56:56 +08:00
@KCheshireCat
不知道为什么会重发。
隧道断了之后,新包的端口被映射到老端口,session也是老的,那么内容是不是也是老的?
如果只是用了老端口,或者用了老session,可以看其他部分是不是新的。如果其他内容是新的,可以想办法把老包过滤掉。如果全是老的,就要看用nc -u其他端口同时测试是不是ISP在重发。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/187473

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX