« 今年的 SD 2.0 大会 | 返回首页 | 利用 ssh 和 vtund 接入别人的局域网 »

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;

我接触过的,几乎所有的traceroute实现,默认都是udp的。至少redhat,debian都是这样的,而bsd家族的osx同样是用udp来发送包。

找了台Linux (CentOS 5.2)看了一下,默认也是UDP。手头没有Ubuntu,他的联机手册上面说他会默认用UDP 53,可能是因为通常这个端口不会被禁止吧,似乎是个不错的主意,我改改FreeBSD看看。

udp实现通过recvmsg接收映射后的icmp反馈信息,好处就是程序不用suid权限就可以实现一些基本探测,而且udp以及udp模式引发的icmp reply比单纯icmp探测更容易成功穿越firewall;缺点则是无法完全达到icmp的效果(毕竟只能靠几个icmp反馈来猜测),所以两种机制并存起到互补的作用。

linux 下 traceroute 默认也还是 udp 吧 呵呵 有一段我也记得我看了什么资料说改成 icmp 了 应该是误导

Post a comment

非这个主题相关的留言请到:留言本