Tag Archives: IPv4

[CentOS] bind IPv6 설정 제거하기

IPv4환경의 서버에서 bind를 구동하게 되면 다음과 같은 오류메시지가 /var/log/messages 에 쌓이는것을 볼 수 있습니다.

Jan 19 18:10:55 theeye named[5464]: error (network unreachable) resolving 'US/DNSKEY/IN': 2001:503:d1ae:ffff:ffff:ffff:ffff:ff7e#53
Jan 19 18:10:55 theeye named[5464]: error (network unreachable) resolving 'US/DNSKEY/IN': 2001:500:3682::11#53
Jan 19 18:10:55 theeye named[5464]: error (network unreachable) resolving 'ns1.isc.ultradns.net/A/IN': 2610:a1:1014::1#53
Jan 19 18:10:55 theeye named[5464]: error (network unreachable) resolving 'ns1.isc.ultradns.net/A/IN': 2001:502:f3ff::1#53
Jan 19 18:10:55 theeye named[5464]: error (network unreachable) resolving 'pdns6.ultradns.co.uk/A/IN': 2001:502:ad09::3#53
Jan 19 18:10:55 theeye named[5464]: error (network unreachable) resolving 'pdns6.ultradns.co.uk/A/IN': 2a01:40:1001:35::2#53
Jan 19 18:10:56 theeye named[5464]: error (network unreachable) resolving 'pdns6.ultradns.co.uk/A/IN': 2610:a1:1016::1#53
Jan 19 18:10:56 theeye named[5464]: error (network unreachable) resolving 'pdns6.ultradns.co.uk/A/IN': 2610:a1:1015::1#53
Jan 19 18:10:58 theeye named[5464]: error (network unreachable) resolving 'doc.gov/ANY/IN': 2001:49f0:a02a:1000::238#53

위의 오류는 IPv6 기반의 통신을 하지 못해서 루트 서버로의 접근을 못해서 발생하는것으로 IPv4로만 동작하도록 설정하면 문제가 해결됩니다. /etc/named.conf 파일(chroot설정이 되어있다면 /var/named/chroot/etc/named.conf)의 다음의 설정을 주석처리 합니다.

// listen-on-v6 port 53 { ::1; };

이후에 /etc/sysconfig/named 의 마지막줄에 다음을 추가해 줍니다.

OPTIONS="-4"

위의 설정은 IPv4환경으로만 동작하게 하는 옵션입니다. 반대로 -6로 설정할 경우 IPv6로만 동작합니다. 서버를 재구동하고 로그를 확인해 보면 스팸같이 쌓이던 로그가 더이상 쌓이지 않는것을 확인할 수 있습니다.

$ service named restart

 

[Java] 현재 시스템의 IPv4기반의 IP주소 가져오기

Java에서 IP주소를 가져오는 방법은 매우 쉽고 간단합니다. 일반적으로 사용되는 간단한 방법으로는 다음과 같은 방법이 있습니다.
[code]InetAddress.getLocalHost().getAddress()[/code]
위의 단 한줄로 현재 시스템의 IP를 읽어올 수 있습니다. 그런데 개발시에는 문제가 없었는데 리눅스 서버에서 구동해 보니 127.0.0.1과 같이 loopback 주소가 나오는 경우가 있더군요. 찾아보다 다음과 같은 방법으로 깔끔하게 해결할 수 있었습니다.
[code]/**
 * 현재 서버의 IP 주소를 가져옵니다.
 *
 * @return IP 주소
 */
private String getLocalServerIp()
{
try
{
   for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();)
   {
       NetworkInterface intf = en.nextElement();
       for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();)
       {
           InetAddress inetAddress = enumIpAddr.nextElement();
           if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress() && inetAddress.isSiteLocalAddress())
           {
            return inetAddress.getHostAddress().toString();
           }
       }
   }
}
catch (SocketException ex) {}
return null;
}[/code]
현재 시스템의 모든 네트워크 인터페이스를 읽어와서 loopback장치인지 랜선에 연결된 장치인지 여부를 확인하여 실제 사용중인 인터페이스의 IP주소를 읽어오게 됩니다. 위와 같이 사용해서 실무에 적용해본 결과 어느 OS, 장치에 상관없이 IP가 정상적으로 출력되는것을 확인하였습니다.

소스코드가 좀 길고 더럽네요; 그냥 보관용으로 적어두는데 의미를 부여하겠습니다;;