- How can I get the IP address of a (Linux) machine?
- 12 Answers 12
- How to Find Out IP Address of Linux Machine
- What is an IP Address?
- Importance of an IP Address
- Types of IP Addresses
- Find IP Address of Linux System
- How to Find or Check Your IP Address in Linux
- Find Your IP Address From the Command Line
- Using the hostname Command
- Using the ip addr Command
- Using the ifconfig Command
- Finding Your IP Address in Linux With a GUI
- How to Find Public IP Address
- What is a Public/Private IP Address?
How can I get the IP address of a (Linux) machine?
I need to find the external IP address to bind my application to it. Obviously I can also bind to INADDR_ANY (and actually that’s what I do at the moment). I would prefer to detect the public address, though.
Why mark down the popen of ifconfig? It’s really the right thing to do. Libraries change, but ifconfig and popen will always be there.
ifconfig still, today, works on more architectures than any other approach. So change it to the ip command.when/if appropriate. popen is still the better solution.
12 Answers 12
I found the ioctl solution problematic on os x (which is POSIX compliant so should be similiar to linux). However getifaddress() will let you do the same thing easily, it works fine for me on os x 10.5 and should be the same below.
I’ve done a quick example below which will print all of the machine’s IPv4 address, (you should also check the getifaddrs was successful ie returns 0).
I’ve updated it show IPv6 addresses too.
#include #include #include #include #include #include int main (int argc, const char * argv[]) < struct ifaddrs * ifAddrStruct=NULL; struct ifaddrs * ifa=NULL; void * tmpAddrPtr=NULL; getifaddrs(&ifAddrStruct); for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) < if (!ifa->ifa_addr) < continue; >if (ifa->ifa_addr->sa_family == AF_INET) < // check it is IP4 // is a valid IP4 Address tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr; char addressBuffer[INET_ADDRSTRLEN]; inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN); printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); > else if (ifa->ifa_addr->sa_family == AF_INET6) < // check it is IP6 // is a valid IP6 Address tmpAddrPtr=&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr; char addressBuffer[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN); printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); > > if (ifAddrStruct!=NULL) freeifaddrs(ifAddrStruct); return 0; >
+1 and thanks for bringing this nice approach instead of those boring ioctl’s! However, your handling of IP6 is still incorrect — you should cast to sockaddr_in6, i.e. something like tmpAddrPtr=&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
gives lo and wlan0 interfaces in my case. What I require is wlan0 or eth0 which has internet connection.So, Should I use strcmp or thre’s a better way?
Read /usr/include/linux/if.h for information on the ifconf and ifreq structures. This should give you the IP address of each interface on the system. Also read /usr/include/linux/sockios.h for additional ioctls.
@MattJoiner No, take a look at the man page, SIOCGIFCONF returns info on all interfaces. Part of the man page quoted here: «Return a list of interface (transport layer) addresses. This currently means only addresses of the AF_INET (IPv4) family for compatibility. The user passes a ifconf structure as argument to the ioctl. It contains a pointer to an array of ifreq structures in ifc_req and its length in bytes in ifc_len. The kernel fills the ifreqs with all current L3 interface addresses that are running»
I like jjvainio’s answer. As Zan Lnyx says, it uses the local routing table to find the IP address of the ethernet interface that would be used for a connection to a specific external host. By using a connected UDP socket, you can get the information without actually sending any packets. The approach requires that you choose a specific external host. Most of the time, any well-known public IP should do the trick. I like Google’s public DNS server address 8.8.8.8 for this purpose, but there may be times you’d want to choose a different external host IP. Here is some code that illustrates the full approach.
void GetPrimaryIp(char* buffer, size_t buflen) < assert(buflen >= 16); int sock = socket(AF_INET, SOCK_DGRAM, 0); assert(sock != -1); const char* kGoogleDnsIp = "8.8.8.8"; uint16_t kDnsPort = 53; struct sockaddr_in serv; memset(&serv, 0, sizeof(serv)); serv.sin_family = AF_INET; serv.sin_addr.s_addr = inet_addr(kGoogleDnsIp); serv.sin_port = htons(kDnsPort); int err = connect(sock, (const sockaddr*) &serv, sizeof(serv)); assert(err != -1); sockaddr_in name; socklen_t namelen = sizeof(name); err = getsockname(sock, (sockaddr*) &name, &namelen); assert(err != -1); const char* p = inet_ntop(AF_INET, &name.sin_addr, buffer, buflen); assert(p); close(sock); >
How to Find Out IP Address of Linux Machine
The main question that determines the flow of this article is why do we need to know the IP address of our Linux machine(s)? For a Linux superuser or administrator, this question is self-explanatory.
However, for a user who is still learning the ropes in the Linux operating system ecosystem, a brief explanation of the importance of knowing your Linux machine’s IP address is a mandated protocol.
What is an IP Address?
An IP (Internet Protocol) address uniquely identifies any device connected to the internet or on a setup/configured user private network. It uses the same logic as a government ID.
It is through an IP address that you are able to communicate, query, and retrieve information from other machines within a network.
Importance of an IP Address
Consider this scenario, when you open your web browser and visit the URL http://google.com , you are subconsciously accessing the website via its IP address. The domain name google.com is just an easier way of accessing the server without having to memorize its IP address.
If your server (remote or local) is not associated with a domain name, knowing your machines’ IP addresses provides a faster connection route to/from your remote machines and servers.
To perform remote administration and control on your Linux machines, you also need to know their IP addresses. Also, an IP address is important because it facilitates network configuration, especially in scenarios where you need to connect your Linux machine to other IP-address-oriented devices like smartphones, smart TVs, internet routers, and other smart gadgets.
Types of IP Addresses
An IP address can either be Public or Private (192.168.x.x, 10.x.x.x, 172.16.x.x, etc).
A public IP address is mostly associated with website and FTP servers and any user on a web browser can access it or ping its associated server machine from the command line.
A private IP address is mostly restricted to a specific network and cannot be globally pinged or accessed.
This tutorial will take us through various approaches to knowing the IP addresses of our Linux machines via the command line environment.
Find IP Address of Linux System
To find out the IP address of your Linux machine, you need to use the ip command as shown.
Alternatively, you can also use the ifconfig command to determine the IP address of your Linux machine. The ifconfig command is part of the net-tools package, which contains a group of programs that form the base of Linux networking.
$ sudo apt install net-tools [On Debian, Ubuntu and Mint] $ sudo yum install net-tools [On RHEL/CentOS/Fedora and Rocky Linux/AlmaLinux] $ sudo emerge -a sys-apps/net-tools [On Gentoo Linux] $ sudo pacman -S net-tools [On Arch Linux] $ sudo zypper install net-tools [On OpenSUSE]
To use the ifconfig command to find out the IP address of your Linux machine, execute the following command on your Linux terminal:
You should get the IP address(es) of your Linux machine and their associated network adapter names.
You might also like to read the following related articles:
How to Find or Check Your IP Address in Linux
An IP address is a codename assigned to a computer on a network. It works as a postal address, ensuring that network traffic is sent to the correct computer.
In this tutorial you will learn how to find your IP address using a Linux operating system.
Find Your IP Address From the Command Line
There are a few different commands you can use to check your IP address. To run these commands, start by opening a terminal window/command line.
Using the hostname Command
One way to check your IP address from the command-line is by using the following command:
The system will display your internal IP address.
Using the ip addr Command
Check your ip address with the ip addr command:
The system will scan your hardware, and display the status for each network adapter you have. Look for an entry that says link/ether. Below it, you should see one of the following:
inet6 fe80::a00:27ff:fe76:1e71/64
The entries will include one for a wired (Ethernet) adapter and a wireless (Wi-Fi) adapter. You may also have an entry for a virtual adapter. Generally, only one entry will have an IP address listed – that is the one you will want.
Note: The number after the slash – /24 and /64 – specifies the size of the network, and it helps with scanning and mapping network size.
Using the ifconfig Command
The third method to find your IP address involves using the ifconfig command. In the command line, enter the following:
The system will display all network connections – including connected, disconnected, and virtual. Look for the one labeled UP, BROADCAST, RUNNING, MULTICAST to find your IP address. This lists both IPv4 and IPv6 addresses.
Note: When you check your IP address, you may notice the term loopback. This refers to an IP address that returns traffic to the same computer. Usually, the loopback address is 127.0.0.1 . If you see that address listed, either you are looking at the wrong line, or you are not connected to the network.
Read phoenixNAP’s ultimate Linux IP command tutorial with 31 examples to learn more!
Finding Your IP Address in Linux With a GUI
If you are using a point-and-click interface to run your Linux system, you can check your IP address by following these steps:
1. Go to the Application menu and type Settings into the search bar.
2. Click on the Settings icon that appears among the results, as in the image below:
3. Next, find the Network tab in the Settings Menu and click on the Advanced Wired Settings icon.
4. This opens a new pop-up window with details on wired settings. Here you can find both your IPv4 address and your IPv6 address.
How to Find Public IP Address
To find your public IP address, reach out to an external website.
If you are using a browser, navigate to:
If you are using a command-line or terminal, use a retrieval command like curl or wget to display the external IP address:
wget -O - -q https://checkip.amazonaws.com
Note: Did you know that when you use curl to connect to an insecure website, the output responds with an error? To resolve it, visit our guide on making curl ignore certificates.
What is a Public/Private IP Address?
Each computer in a network is required to have its own IP address. If two systems have the same IP address, it will generate errors on the network. Most modern networks will detect the problem and prompt you to fix it. However, older networks might get confused, trying to route traffic to both computers.
Most systems will have two different IP addresses:
- Private IP address: This is the address used on the network. Also, it is the one you will want to use for configuring routing tools. On smaller networks, the internal IP address typically starts with 192.168.x.x. It is dynamically assigned to your computer whenever you connect.
- Public IP address: This is the IP address that registers on a website when you visit it. When you connect to a small network, your computer connects to a router using an internal IP address. That router, in turn, connects to a bigger network (like an Internet Service Provider), which has its own IP address system.
Note: Learn everything you need to know about public and private IP addresses in our article Public vs. Private IP Address.
Now you know how to find a private and public IP address in Linux using multiple methods.
Each option strikes a balance between speed and complexity. Now you have the flexibility to choose, if you only need your internal IP address, you can use the hostname method. If you need more detailed information, view our article on 31 Linux IP Commands with examples.