freebsd 下的 traceroute
今天调公司里的 VPN 时,发现我的 freebsd 机器 traceroute 老是失败。
控制台报告
traceroute: sendto: Permission denied
(以上错误信息用来引导 google 同类问题的同学)
一开始是 ping 都不行,我查看了 firewall 的设置,允许 icmp 包通过。ping 就可以用了,但是 traceroute 还是不行。
这让我很疑惑,后来用 tcpdump 查了一下,发现 freebsd 的 traceroute 默认是用 udp 协议做的。真是惯性思维害人啊。windows 和 linux 下都是使用 icmp 的。
man 了一下,发现 freebsd 的 traceroute 可以用 -P ICMP 选择 icmp 协议。然后一切正常,不需要修改 firewall 的设置了。
Comments
问一下:
static void body (LexState *ls, expdesc *e, int needself, int line) {
/* body -> `(' parlist `)' chunk END */
FuncState new_fs;
为什么函数的BODY体里面另外增加一个FuncState new_fs;
Posted by: QP | (5) November 16, 2008 05:48 PM
我接触过的,几乎所有的traceroute实现,默认都是udp的。至少redhat,debian都是这样的,而bsd家族的osx同样是用udp来发送包。
Posted by: surfchen | (4) November 14, 2008 06:16 PM
找了台Linux (CentOS 5.2)看了一下,默认也是UDP。手头没有Ubuntu,他的联机手册上面说他会默认用UDP 53,可能是因为通常这个端口不会被禁止吧,似乎是个不错的主意,我改改FreeBSD看看。
Posted by: Anonymous | (3) November 14, 2008 04:11 AM
udp实现通过recvmsg接收映射后的icmp反馈信息,好处就是程序不用suid权限就可以实现一些基本探测,而且udp以及udp模式引发的icmp reply比单纯icmp探测更容易成功穿越firewall;缺点则是无法完全达到icmp的效果(毕竟只能靠几个icmp反馈来猜测),所以两种机制并存起到互补的作用。
Posted by: lifc0 | (2) November 13, 2008 11:41 PM
linux 下 traceroute 默认也还是 udp 吧 呵呵 有一段我也记得我看了什么资料说改成 icmp 了 应该是误导
Posted by: windtear | (1) November 13, 2008 11:12 PM