问题描述:

操作系统为RHEL6.5,安装时使用的是默认主机名localhost,后来不知道怎么,在没有人修改的情况下,重启后就变成了bogon。导致我们的​​数据库​​等应用无法正常启动。在排除人为修改的原因后,检查了/etc/sysconfig/network等文件,发现里面HOSTNAME是localhost,并没有什么问题。后来经过联系红帽客服及在群里寻求帮助,当然还有伟大的度娘和谷歌,终于算是基本搞明白了其中的原因。



成因分析:

linux系统启动时,会经历BOIS自检,系统引导,启动内核,初始化系统这几步,其中初始化系统时,会依次执行/etc/rc.sysinit,/etc/rc.d/rc* 等脚本文件,其中在rc.sysinit有这样一段代码


[plain]​view plain​​​ ​​copy​


  1. if [ "$HOSTNAME" = "localhost" -o "$HOSTNAME" = "localhost.localdomain" ]; then
  2. ipaddr=$(ip addr show to 0.0.0.0/0 scope global | awk '/[[:space:]]inet / { print gensub("/.*","","g",$2) }')
  3. for ip in $ipaddr ; do
  4. HOSTNAME=
  5. eval $(ipcalc -h $ip 2>/dev/null)
  6. [ -n "$HOSTNAME" ] && { hostname ${HOSTNAME} ; break; }
  7. done
  8. fi


这段代码先判断了主机名,如果主机名是localhost或者localhost.localdomain,则获取主机IP地址并执行DNS逆向解析,将解析到的结果赋值给HOSTNAME。假设我主机IP为192.168.1.47,手动执行下列命令,得到的返回值为bogon。也就是莫名其妙出现的主机名



[plain]​view plain​​​ ​​copy​

  1. ipcalc -h 192.168.1.47



经查阅资料,了解到有些DNS服务器,会将私有地址,保留地址这样的不应该出现在网络上的IP地址解析成bogon。



解决方法:

知道问题的原因了,解决起来也就容易了。

推荐的最佳解决方案,是修改主机名,只要主机名不是localhost或者localhost.localdomain,那么操作系统就不会执行DNS反向解析等操作,问题自然也不会出现。而且并不推荐使用默认主机名进行系统安装。具体操作就是修改/etc/sysconfig/network文件中HOSTNAME键值。

再有就是更改DNS域名服务器,有些域名服务器会对bogon进行过滤。多试试哪些行哪些不行。或者不给服务器配置DNS,大部分服务器其实是没有上网需求的。DNS服务器一般是在/etc/resolv文件中,有些也会写在/etc/sysconfg/network-scripts/ifcfg-eth0中。




案例:


服务器启动后发现无法连接到数据库,查看日志报错信息为:

ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)

看到111,在linux下perror 111 查看错误码

[root@bogon~]# perror 111

OS error code 111:  Connection refused

是拒绝连接,以为是权限问题

 1、第一想到的是查看了防火墙,是未开启的排除

 2、第二个想到的是SElinux 的权限限制,用命令 getenforce 查看器状态

[root@bogon~]# getenforce

Enforcing

发现SElinux 权限系统处于有效状态,有可能会对文件的一些权限进行限制

用命令 setenforce 0 改变SElinux的状态为: Permisstive (监控但不限制)


还是连不上。

查看mycat的工作状态,发现mycat 没有运行。

[root@bogon~]# /usr/local/mycat/bin/mycat status

Mycat-server is not running.


所以查看mycat的错误日志 /usr/local/mycat/logs/wrapper.log

ERROR  | wrapper  | 2016/08/11 11:08:22 | JVM exited while loading the application.

INFO   | jvm 2    | 2016/08/11 11:08:22 | Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: bogon: bogon: Name or service not known


看到:Local host name unknown: java.net.UnknownHostException: bogon 


看命令行处的主机名确实已经被变为 bogon  :[root@bogon~]#

而mycat正常启动的机器的主机名都为:localhost [root@localhost~]#


尝试将主机名改回localhost,查阅相关资料修改主机名需要修改的文件是: /etc/sysconfig/network  和 /etc/hosts  (对照其他机器修改)


发现修改重启后,主机名仍然是 bogon,mycat仍然无法启动


查找主机名配置文件不生效,主机名仍旧被改为bogon的原因,查到的结果是:


出现这个问题的原因

终端在初始化时,需要确定主机的名字,此时终端会向 DNS 服务器反向查询本机 IP 地址,然后把得到的名字作为自己的主机名。如果没有反向解析的结果,就会显示本机设置的主机名。

那么 bogon 是什么意思呢?一个 DNS 反向解析名为 bogon 的 IP 地址不会显示在 traceroute 中。

该问题可能是在一个路由器组织的局域网环境中,并且你的 DNS 地址是你路由器的地址,这样终端反向查询你本机 IP 地址得到的结果是 bogon,于是你在终端里显示的主机名就变成了 bogon。

链接:​​http://www.zhihu.com/question/25849047/answer/84188294​

(traceroute 是检测到达目的地所经过的所有路由器,Traceroute IP地址或域名。测试出来的结果就是你的主机,到达对方经过了多少台路由,从而判断在那个路由出了问题。ping 是用来检测网络的连通性)


bogon是指那些不该出现在internet路由表中的地址吧

 这些地址应该包括:

1,私有地址如10,172.16-32,192.168.....

2,还未正式分配出去的地址


还有一种定义的说法:

bogon就是Martians(就是私有地址和保留地址的称呼,详见RFC1918和RFC5735)和IANA未分配给RIR的并集。

这里有一份由IANA维护的IPV4分配列表

在这里可以看到 005/8就是未分配的地址,也就是bogon range。

同时还有一个概念叫做Fullbogons,它的定义范围比bogon还要大,指的是那些虽然IANA分配给RIR的地址,但是这些地址RIR没有分配给ISP或者end-user使用的地址。

所以来讲,bongon是没有什么用处的,需要在路由上设置ACL或者做BGP BLACKHOLING过滤掉

那么,我的主机名变成bogon是怎么回事又该怎么办呢?

可能是在反向解析IP时,DNS没有过滤bogon,所以把内网的IP反向解析成了bogon

所以把DNS换成一个过滤了bongon的DNS是其中一种解决办法


考虑到我们的服务器放到5楼之后,网卡1的IP是192.168.0.250 内网使用,网卡2的地址 是自动获取地址,不是静态地址。怀疑是用到了dhcp,怀疑是用了DHCP之后,会去DNS服务器解析域名/主机名(反向解析;正向解析:通过域名查找ip;

反向解析:通过ip查找域名) 端会先向 DNS 请求查询当前 IP 的反向域名解析的结果,如果查询不到再显示我们设置的计算机名。而由于我们的 DNS 错误地将保留地址反向的 NS 查询结果返回了 bogon. 其中 bogon 本应该用来指虚假的 IP 地址,而非保留 IP 地址。


所以我尝试将外网连接的地址改为了静态的地址,问题就解决了。


至于如何在动态获取地址的情况下正确返回,因为服务器的IP的地址是映射的地址,中间的网络映射关系和相关的网络知识需要去研究,暂时没有时间去研究。暂时以设置静态IP的方式解决该问题。



相关资料:

hostname和/etc/hosts的区别


很多人一提到更改hostname首先就想到修改/etc/hosts文件,认为hostname的配置文件就是/etc/hosts。其实不是的。hosts文件的作用相当于DNS,提供IP地址hostname的对应。早期的互联网计算机少,单机hosts文件里足够存放所有联网计算机。

不过随着互联网的发展,这就远远不够了。于是就出现了分布式的DNS系统。由DNS服务器来提供类似的IP地址到域名的对应。Linux系统在向DNS服务器发出域名解析请求之前会查询/etc/hosts文件,如果里面有相应的记录,就会使用hosts里面的记录。

由此,/etc/hosts于设置hostname是没直接关系的,仅仅当你要在本机上用新的hostname来映射自己的IP时候才会用到/etc/hosts文件。两者没有必然的联系。redhat的hostname的配置文件是/etc/sysconfig/network.


 /etc/hosts内容摘录如下:

# Do not remove the following line, or various programs

# that require network functionality will fail.

192.168.1.102 localhost.localdomain localhost

127.0.0.1 localhost.localdomain localhost

          ::1             localhost6.localdomain6 localhost6


对以上内容的解释

作用:hosts 文件是用来把主机名字映射到IP地址的方法,这种方法比较简单。但这种映射只是本地映射,也就是说每台机器都是独立的,所有的计算机都不能相互通过hostname来访问。

格式: ​​www.2cto.com​

一般情况下hosts的内容关于主机名(hostname)的定义,每行为一个主机,每行由三部份组成,每个部份由空格隔开。其中#号开头的行做说明,不被系统解释。


第一部份:网络IP地址;


第二部份:主机名.域名,注意主机名和域名之间有个半角的点,比如 localhost.localdomain


第二部份:主机名(主机名别名) ,其实就是主机名;

注释:

1)127.0.0.1 是回环地址,比如我们不想让局域网的其它机器看到我们测试的网络程序,就可以用回环地址来测试。

2)为什么需要定义域名呢?其实理解也简单,比如我们有三台主机,每台做不同的事,一台做MAIL服务器,一台做FTP服务器,一台做SMB服务器,所以我们就可以这样来设计hostname; ​​www.2cto.com​


127.0.0.1 localhost.localdomain localhost


192.168.1.2 ftp


192.168.1.3 mail.localdomain mail


192.168.1.4 smb.localdomin smb

把这上面这个配置文件的内容分别写入每台机器的/etc/hosts内容中,这样这三台局域网的机器就可以通过hostname来访问了。也就是,在局域网中,主机名也是可以解析到IP上的,相当于DNS域名解析。

对于主机名的修改有两种方式:hostname和/etc/sysconfig/network


[sql]

[root@think ~]# hostname

thin ​​www.2cto.com​

[root@think ~]# hostname think

[root@think ~]# hostname

think


通过hostname 这个kernel变量来设置主机名只是临时的,下次重启系统时,此主机名将不会存在.hostname也可用于显示:hostname -i。如果要永久修改RedHat hostname,就修改/etc/sysconfig/network文件,将里面的HOSTNAME这一行修改成HOSTNAME=NEWNAME,其中NEWNAME就是你要设置的hostname。



/etc/hosts


IP地址 主机名/域名 别名

-第一部份:网络IP地址;

-第二部份:主机名或域名;

-第三部份:主机名别名;


主机名通常在局域网内使用,通过hosts文件,主机名就被解析到对应ip;

域名通常在internet上使用,但如果本机不想使用internet上的域名解析,这时就可以更改hosts文件,加入自己的域名解析。

# Do not remove the following line, or various programs

# that require network functionality will fail.

127.0.0.1 localhost localhost.localdomain

::1 localhost6.localdomain6 localhost6 --- 第三个字段是别名。

172.25.126.1 vmw1

172.25.126.10 vmw10 #aaaaaa 注释

2001::20c:29ff:fe0f:aa4a vm10v6 ----------- IPv6样式!没有掩码!



/etc/sysconfig/network


NETWORKING=yes

HOSTNAME=localhost.localdomain

PEERDNS=no

NISDOMAIN=bjlincase.cn.xxx.com

NETWORKING_IPV6=yes

GATEWAY=135.252.181.1