How to connect NAT IP inside

NAT指的是Network address translation,NAT IP就是指外部访问一台机器用的IP地址,比如10.10.123.123,也是通过DNS解析域名后得到的IP地址,但是这台机器在网络内部,其实用的是另外一个IP,比如192.168.123.123, 这时有的程序会有问题,比如最近在使用的Splunk server的Modular Input, 代码的第306行尝试使用服务器的名称连接socket:


public void run() {
			try {

				int failCount = 0;
				while (true) {
					Socket socket = null;
					connectedToSplunk = false;
					try {
						socket = new Socket(this.splunkHost, this.port);
						connectedToSplunk = true;
						failCount = 0;
					} catch (Exception e) {
						logger.error("Probing socket connection to SplunkD failed.Either SplunkD has exited ,or if not,  check that your DNS configuration is resolving your system's hostname ("
								+ this.splunkHost
								+ ") correctly : "
								+ e.getMessage());
						failCount++;
						connectedToSplunk = false;
					} finally {
						if (socket != null)
							try {
								socket.close();
							} catch (Exception e) {
							}
					}
					if (failCount >= 3) {
						logger.error("Determined that Splunk has probably exited, HARI KARI.");
						System.exit(2);
					} else {
						Thread.sleep(10000);
					}

				}

			} catch (Exception e) {
			}

		}

这里this.splunkHost的返回值是形似xxx.yyy.com的域名,使用域名(xxx.yyy.com)来连接自身的socket,域名会被DNS解析成形如10.10.123.123的外部IP地址,而外部的IP连接自身是连接不上的,因为连接自己没有走外部路由,不知道10.10.123.123这个地址,所以socket连接会出现:Connect Timeout的错误。

解决这个问题,我们有一个简单的方法,就是尝试修改/etc/hosts,让其将域名和自身的内部IP关联上,具体做法是添加如下行到/etc/hosts中:


127.0.0.1 xxx xxx.yyy.com
Written on February 11, 2015