【linux】主机名被改为bogon原理分析|修改主机名hostname的方法
目录
linux主机名被更改为bogon原理分析
博客原址:http://blog.csdn.net/weiwan721/article/details/48463371
问题描述:
操作系统为RHEL6.5,安装时使用的是默认主机名localhost,后来不知道怎么,在没有人修改的情况下,重启后就变成了bogon。导致我们的数据库等应用无法正常启动。在排除人为修改的原因后,检查了/etc/sysconfig/network等文件,发现里面HOSTNAME是localhost,并没有什么问题。后来经过联系红帽客服及在群里寻求帮助,当然还有伟大的度娘和谷歌,终于算是基本搞明白了其中的原因。
成因分析:
linux系统启动时,会经历BOIS自检,系统引导,启动内核,初始化系统这几步,其中初始化系统时,会依次执行/etc/rc.sysinit,/etc/rc.d/rc* 等脚本文件,其中在rc.sysinit有这样一段代码
if [ "$HOSTNAME" = "localhost" -o "$HOSTNAME" = "localhost.localdomain" ]; then
ipaddr=$(ip addr show to 0.0.0.0/0 scope global | awk '/[[:space:]]inet / { print gensub("/.*","","g",$2) }')
for ip in $ipaddr ; do
HOSTNAME=
eval $(ipcalc -h $ip 2>/dev/null)
[ -n "$HOSTNAME" ] && { hostname ${HOSTNAME} ; break; }
done
fi
这段代码先判断了主机名,如果主机名是localhost或者localhost.localdomain,则获取主机IP地址并执行DNS逆向解析,将解析到的结果赋值给HOSTNAME。假设我主机IP为192.168.1.47,手动执行下列命令,得到的返回值为bogon。也就是莫名其妙出现的主机名
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中。
原文:http://m.blog.csdn.net/article/details?id=51554785
案例:
服务器启动后发现无法连接到数据库,查看日志报错信息为:
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。
链接:主机名由localhost变成bogon是怎么回事,怎样变回localhost这个名字? - 知乎
(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
修改主机名的方法
1、临时修改,重启失效
hostname yourhostname
2、永久生效
第一步:
1. Redhat / CentOS / Fedora系列
- vi /etc/sysconfig/network
输入以下:
- HOSTNAME=yourhostname
保存后执行以下:
保险起见: reboot
- hostname
2. Debian / Ubuntu系列 (发现centos 用这个可以)
- vi /etc/hostname
写入
把里面的主机名改为你相改的主机名
保存后执行以下:
- 保险起见: reboot
- hostname