# Bind an Elastic IPv4 Address

You can bind up to 4 elastic IPv4 addresses to a private IPv4.

## Procedures

1. Click the instance name to go to instance **Details** > **Information** > **Network interface**.
2. Select the private IPv4 you want to bind elastic IPv4 and go to **Actions** > **Bind Elastic IPv4**.

   <figure><img src="/files/wjBu0vB9lmSaflwjb85S" alt=""><figcaption></figcaption></figure>
3. Select a desired elastic IPv4 and click **Confirm** to bind. If no desired elastic IPv4, click **New Elastic IPv4** to create a new IPv4.\
   See [**Create an Elastic IPv4**](/welcome/elastic-compute/get-started/manage-networking/create-an-elastic-ipv4.md) for detailed steps.

   <div align="left"><figure><img src="/files/csRjhiQY0s0NsH7cOd3f" alt="" width="444"><figcaption></figcaption></figure></div>

{% hint style="info" %} <mark style="color:blue;">**Note**</mark>

<mark style="color:blue;">You can also go to</mark> <mark style="color:blue;">**Elastic IPv4**</mark> <mark style="color:blue;">></mark> <mark style="color:blue;">**Actions**</mark> <mark style="color:blue;">></mark> <mark style="color:blue;">**Bind Private IPv4**</mark> <mark style="color:blue;">to bind the elastic IPv4.</mark>

<img src="/files/0N4G8OGcbhhJj7VO69DD" alt="" data-size="original">
{% endhint %}

## Bypass Mode Configuration Guide

### 1. Scope and Prerequisites

#### 1.1 Applicable Scenarios

* **Single network interface (NIC) only**
* Supports multiple IPs (up to 254)
* All IPs must be in **Bypass mode**

#### 1.2 Supported Operating Systems

* Ubuntu: 20.04 / 22.04 / 24.04
* Debian: 10 / 11 / 12
* CentOS: 7 / 9
* Rocky Linux: 8.10 / 9.6

#### 1.3 Important Notes

* **A reboot is required after running the script**, otherwise the configuration will not take effect
* Mixed modes are not supported (Bypass Mode + NAT Mode)

### 2. Operation Steps

{% tabs %}
{% tab title="Console" %}

1. Create Command:

Path:

> Console → Orchestration Service → Commands → Create Commands

copy and add the following script and create command.

{% code expandable="true" %}

```shellscript
#!/bin/sh -e
# Task Description:
#   Used for initializing configuration in single NIC EIP full Bypass mode scenarios.
#   Supports from 1 public IP up to 254 public IPs.
#   Execute this task after external resource environment is ready.
#   Adapted for ubuntu20.04, 22.04, 24.04, debian10, 11, 12, centos7, centos9, rocky9.6, rocky8.10 (10 systems)

# ===== Global Variable Definitions =====
TASK_NAME=single_nic_bypass_init

META_CURL="curl -sf"
META_URL="http://169.254.169.254/latest/meta-data/network/interfaces/macs"

NIC_NAME=eth0
PRI_GW4=
PRI_IP4=
PRI_PREFIX=

SYSTEM=

DEFAULT_PUB_EIP4=
ALL_PUB_EIP4s=

NAME_SERVER1=8.8.8.8
NAME_SERVER2=1.1.1.1
# =======================

CheckSupportedOS() {
    if [ ! -f /etc/os-release ]; then
        echo "Error: Unsupported system: /etc/os-release not found"
        exit 1
    fi

    . /etc/os-release

    if [ "$ID" = "ubuntu" ]; then
        if [ "$VERSION_ID" = "20.04" ] || [ "$VERSION_ID" = "22.04" ] || [ "$VERSION_ID" = "24.04" ]; then
            echo "Supported OS: Ubuntu $VERSION_ID"
            SYSTEM=ubuntu
            return 0
        else
            echo "Error: Unsupported Ubuntu version: $VERSION_ID"
            exit 1
        fi
    elif [ "$ID" = "debian" ]; then
        if [ "$VERSION_ID" = "11" ] || [ "$VERSION_ID" = "10" ] || [ "$VERSION_ID" = "12" ]; then
            echo "Supported OS: Debian $VERSION_ID"
            SYSTEM=debian
            return 0
        else
            echo "Unsupported Debian version: $VERSION_ID"
            exit 1
        fi
    elif [ "$ID" = "centos" ] || [ "$ID" = "rhel" ]; then
        if [ "$VERSION_ID" = "7" ] && [ -f /etc/centos-release ]; then
            echo "Supported OS: CentOS $VERSION_ID"
            SYSTEM=centos
            return 0
        elif [ "$VERSION_ID" = "9" ] && [ -f /etc/centos-release ]; then
            echo "Supported OS: CentOS $VERSION_ID"
            SYSTEM=centos
            return 0
        else
            echo "Unsupported CentOS/RHEL version: $VERSION_ID"
            exit 1
        fi
    elif [ "$ID" = "rocky" ]; then
        if [ "$VERSION_ID" = "9.6" ] || [ "$VERSION_ID" = "8.10" ]; then
            echo "Supported OS: rocky $VERSION_ID"
            SYSTEM=rocky
            return 0
        else
            echo "Unsupported rocky version: $VERSION_ID"
            exit 1
        fi
    else
        echo "Unsupported OS: $ID $VERSION_ID"
        exit 1
    fi
}

ConfigUbuntuNetwork() {
    cat > /etc/netplan/50-cloud-init.yaml << EOF
network:
    version: 2
    ethernets:
        eth0:
            addresses:
                - ${PRI_IP4}/${PRI_PREFIX}
EOF

    for EIP in $ALL_PUB_EIP4s; do
        echo "                - ${EIP}/32" >> /etc/netplan/50-cloud-init.yaml
    done

    cat >> /etc/netplan/50-cloud-init.yaml << EOF
            nameservers:
                addresses:
                - ${NAME_SERVER1}
                - ${NAME_SERVER2}
EOF
    # Default route
    cat >> /etc/netplan/50-cloud-init.yaml << EOF
            routes:
                - to: default
                  via: ${PRI_GW4}
                  from: ${DEFAULT_PUB_EIP4}
EOF
}

ConfigCentOSNetwork() {
    rm -f /etc/sysconfig/network-scripts/ifcfg-eth0*
    cat << EOF > /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=${PRI_IP4}
PREFIX=${PRI_PREFIX}
EOF

index=0

    for EIP in $ALL_PUB_EIP4s; do
        cat << EOF > /etc/sysconfig/network-scripts/ifcfg-eth0:$index
DEVICE=eth0:$index
BOOTPROTO=static
ONBOOT=yes
IPADDR=${EIP}
PREFIX=32
EOF
        index=$((index+1))
    done

    # Default route
    cat << EOF > /etc/sysconfig/network-scripts/route-eth0
default via ${PRI_GW4} dev eth0 src ${DEFAULT_PUB_EIP4}
EOF
    # Disable DHCP on eth2
    cat << EOF > /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
BOOTPROTO=none
ONBOOT=yes
EOF
}

ConfigDebianNetwork() {
    cat > /etc/network/interfaces.d/50-cloud-init << EOF

auto lo
iface lo inet loopback
    dns-nameservers ${NAME_SERVER1} ${NAME_SERVER2}

auto eth0
iface eth0 inet static
    address ${PRI_IP4}/${PRI_PREFIX}

auto eth0:0
iface eth0:0 inet static
    address ${DEFAULT_PUB_EIP4}/32
    up ip route add default via ${PRI_GW4} dev eth0 src ${DEFAULT_PUB_EIP4}
    down ip route del default via ${PRI_GW4} dev eth0 src ${DEFAULT_PUB_EIP4}
EOF

    index=1

    for EIP in $ALL_PUB_EIP4s; do
        if [ "$EIP" = "$DEFAULT_PUB_EIP4" ]; then
            continue
        fi
        cat >> /etc/network/interfaces.d/50-cloud-init << EOF

auto eth0:$index
iface eth0:$index inet static
    address ${EIP}/32
EOF
       index=$((index+1))
    done
}

FetchMetaData() {
    pri_macs=$($META_CURL $META_URL/ | sed 's/\///g')

    nic_count=$(echo "$pri_macs" | wc -w | tr -d ' ')
    if [ "$nic_count" -ne 1 ]; then
        echo "[ERR] Expected exactly one nic, got $nic_count: $pri_macs" >&2
        exit 4
    fi

    PRI_IP4=$($META_CURL $META_URL/$pri_macs/primary-ip-address)
    pri_subnet_cidr=$($META_CURL $META_URL/$pri_macs/subnet-cidr-block)
    PRI_PREFIX=$(echo "$pri_subnet_cidr" | cut -d'/' -f2)
    PRI_GW4=$($META_CURL $META_URL/$pri_macs/gateway)
    DEFAULT_PUB_EIP4=$($META_CURL $META_URL/$pri_macs/public-ipv4)
    ALL_PUB_EIP4s=$($META_CURL $META_URL/$pri_macs/public-ipv4s | sed 's/\[//;s/\]//;s/"//g;s/,/ /g')

    if [ -z "$pri_macs" ] || [ -z "$PRI_IP4" ] || [ -z "$pri_subnet_cidr" ] || [ -z "$PRI_PREFIX" ] || [ -z "$PRI_GW4" ] || [ -z "$DEFAULT_PUB_EIP4" ] || [ -z "$ALL_PUB_EIP4s" ]; then
        echo "[ERR] Missing metadata, check EC2 metadata service." >&2
        exit 3
    fi

    echo "  Private MacAddr:     $pri_macs"
    echo "  Private IPv4:        $PRI_IP4"
    echo "  Private Prefix:      $PRI_PREFIX"
    echo "  Private GWv4:        $PRI_GW4"
    echo "  ALl Public IPv4:     $ALL_PUB_EIP4s"
    echo "  Default Public IPv4: $DEFAULT_PUB_EIP4"
}

ConfigNetwork() {
    # Disable RPF (Reverse Path Filtering)
    if ! grep -q "net.ipv4.conf.all.rp_filter=0" /etc/sysctl.conf; then
        echo "net.ipv4.conf.all.rp_filter=0" | tee -a /etc/sysctl.conf > /dev/null
        sysctl -p /etc/sysctl.conf
    fi

    # Disable cloud-init network configuration
    echo "network: {config: disabled}" > /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg

    if [ "$SYSTEM" = "ubuntu" ]; then
        ConfigUbuntuNetwork
    elif [ "$SYSTEM" = "centos" ]; then
        ConfigCentOSNetwork
    elif [ "$SYSTEM" = "debian" ]; then
        if [ "$VERSION_ID" = "11" ] || [ "$VERSION_ID" = "10" ]; then
            ConfigDebianNetwork
        elif [ "$VERSION_ID" = "12" ]; then
            ConfigUbuntuNetwork
        else
            echo "Unsupported Debian version: $VERSION_ID"
            exit 1
        fi
    elif [ "$SYSTEM" = "rocky" ]; then
        ConfigCentOSNetwork
    else
        echo "Unsupported OS for network config: $SYSTEM"
        exit 1
    fi
}

echo "1. Check OS..."
CheckSupportedOS

echo

echo "2. FetchMetaData..."
FetchMetaData

echo

echo "3. Configuring networks..."
ConfigNetwork

echo

echo
echo "Done."

sync
```

{% endcode %}

2. Run Command:

Path:

> Console → Elastic Compute → Elastic Compute Instance List → Actions → Operations → Run command → Select the command→ Confirm

Run the created command.

3. Reboot the Instance

After execution, **you must manually reboot the instance**.

4. Add Additional IPs (Optional)

To attach more IPs, repeat:

* Bind IP
* Run command
* Reboot instance
  {% endtab %}

{% tab title="API" %}

1. Create Compute Instance

Create an instance following the standard process.

2. Create and Bind EIP

* Create an Elastic IP
* Bind it to the instance in **Bypass mode**

3. Run Command via API

Call the API to run the command:

API Documentation:\
<https://docs.console.zenlayer.com/api-reference/security/zos/command/createcommand>

Use the script provided following.

{% code expandable="true" %}

```shellscript
#!/bin/sh -e
# Task Description:
#   Used for initializing configuration in single NIC EIP full Bypass mode scenarios.
#   Supports from 1 public IP up to 254 public IPs.
#   Execute this task after external resource environment is ready.
#   Adapted for ubuntu20.04, 22.04, 24.04, debian10, 11, 12, centos7, centos9, rocky9.6, rocky8.10 (10 systems)

# ===== Global Variable Definitions =====
TASK_NAME=single_nic_bypass_init

META_CURL="curl -sf"
META_URL="http://169.254.169.254/latest/meta-data/network/interfaces/macs"

NIC_NAME=eth0
PRI_GW4=
PRI_IP4=
PRI_PREFIX=

SYSTEM=

DEFAULT_PUB_EIP4=
ALL_PUB_EIP4s=

NAME_SERVER1=8.8.8.8
NAME_SERVER2=1.1.1.1
# =======================

CheckSupportedOS() {
    if [ ! -f /etc/os-release ]; then
        echo "Error: Unsupported system: /etc/os-release not found"
        exit 1
    fi

    . /etc/os-release

    if [ "$ID" = "ubuntu" ]; then
        if [ "$VERSION_ID" = "20.04" ] || [ "$VERSION_ID" = "22.04" ] || [ "$VERSION_ID" = "24.04" ]; then
            echo "Supported OS: Ubuntu $VERSION_ID"
            SYSTEM=ubuntu
            return 0
        else
            echo "Error: Unsupported Ubuntu version: $VERSION_ID"
            exit 1
        fi
    elif [ "$ID" = "debian" ]; then
        if [ "$VERSION_ID" = "11" ] || [ "$VERSION_ID" = "10" ] || [ "$VERSION_ID" = "12" ]; then
            echo "Supported OS: Debian $VERSION_ID"
            SYSTEM=debian
            return 0
        else
            echo "Unsupported Debian version: $VERSION_ID"
            exit 1
        fi
    elif [ "$ID" = "centos" ] || [ "$ID" = "rhel" ]; then
        if [ "$VERSION_ID" = "7" ] && [ -f /etc/centos-release ]; then
            echo "Supported OS: CentOS $VERSION_ID"
            SYSTEM=centos
            return 0
        elif [ "$VERSION_ID" = "9" ] && [ -f /etc/centos-release ]; then
            echo "Supported OS: CentOS $VERSION_ID"
            SYSTEM=centos
            return 0
        else
            echo "Unsupported CentOS/RHEL version: $VERSION_ID"
            exit 1
        fi
    elif [ "$ID" = "rocky" ]; then
        if [ "$VERSION_ID" = "9.6" ] || [ "$VERSION_ID" = "8.10" ]; then
            echo "Supported OS: rocky $VERSION_ID"
            SYSTEM=rocky
            return 0
        else
            echo "Unsupported rocky version: $VERSION_ID"
            exit 1
        fi
    else
        echo "Unsupported OS: $ID $VERSION_ID"
        exit 1
    fi
}

ConfigUbuntuNetwork() {
    cat > /etc/netplan/50-cloud-init.yaml << EOF
network:
    version: 2
    ethernets:
        eth0:
            addresses:
                - ${PRI_IP4}/${PRI_PREFIX}
EOF

    for EIP in $ALL_PUB_EIP4s; do
        echo "                - ${EIP}/32" >> /etc/netplan/50-cloud-init.yaml
    done

    cat >> /etc/netplan/50-cloud-init.yaml << EOF
            nameservers:
                addresses:
                - ${NAME_SERVER1}
                - ${NAME_SERVER2}
EOF
    # Default route
    cat >> /etc/netplan/50-cloud-init.yaml << EOF
            routes:
                - to: default
                  via: ${PRI_GW4}
                  from: ${DEFAULT_PUB_EIP4}
EOF
}

ConfigCentOSNetwork() {
    rm -f /etc/sysconfig/network-scripts/ifcfg-eth0*
    cat << EOF > /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=${PRI_IP4}
PREFIX=${PRI_PREFIX}
EOF

index=0

    for EIP in $ALL_PUB_EIP4s; do
        cat << EOF > /etc/sysconfig/network-scripts/ifcfg-eth0:$index
DEVICE=eth0:$index
BOOTPROTO=static
ONBOOT=yes
IPADDR=${EIP}
PREFIX=32
EOF
        index=$((index+1))
    done

    # Default route
    cat << EOF > /etc/sysconfig/network-scripts/route-eth0
default via ${PRI_GW4} dev eth0 src ${DEFAULT_PUB_EIP4}
EOF
    # Disable DHCP on eth2
    cat << EOF > /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
BOOTPROTO=none
ONBOOT=yes
EOF
}

ConfigDebianNetwork() {
    cat > /etc/network/interfaces.d/50-cloud-init << EOF

auto lo
iface lo inet loopback
    dns-nameservers ${NAME_SERVER1} ${NAME_SERVER2}

auto eth0
iface eth0 inet static
    address ${PRI_IP4}/${PRI_PREFIX}

auto eth0:0
iface eth0:0 inet static
    address ${DEFAULT_PUB_EIP4}/32
    up ip route add default via ${PRI_GW4} dev eth0 src ${DEFAULT_PUB_EIP4}
    down ip route del default via ${PRI_GW4} dev eth0 src ${DEFAULT_PUB_EIP4}
EOF

    index=1

    for EIP in $ALL_PUB_EIP4s; do
        if [ "$EIP" = "$DEFAULT_PUB_EIP4" ]; then
            continue
        fi
        cat >> /etc/network/interfaces.d/50-cloud-init << EOF

auto eth0:$index
iface eth0:$index inet static
    address ${EIP}/32
EOF
       index=$((index+1))
    done
}

FetchMetaData() {
    pri_macs=$($META_CURL $META_URL/ | sed 's/\///g')

    nic_count=$(echo "$pri_macs" | wc -w | tr -d ' ')
    if [ "$nic_count" -ne 1 ]; then
        echo "[ERR] Expected exactly one nic, got $nic_count: $pri_macs" >&2
        exit 4
    fi

    PRI_IP4=$($META_CURL $META_URL/$pri_macs/primary-ip-address)
    pri_subnet_cidr=$($META_CURL $META_URL/$pri_macs/subnet-cidr-block)
    PRI_PREFIX=$(echo "$pri_subnet_cidr" | cut -d'/' -f2)
    PRI_GW4=$($META_CURL $META_URL/$pri_macs/gateway)
    DEFAULT_PUB_EIP4=$($META_CURL $META_URL/$pri_macs/public-ipv4)
    ALL_PUB_EIP4s=$($META_CURL $META_URL/$pri_macs/public-ipv4s | sed 's/\[//;s/\]//;s/"//g;s/,/ /g')

    if [ -z "$pri_macs" ] || [ -z "$PRI_IP4" ] || [ -z "$pri_subnet_cidr" ] || [ -z "$PRI_PREFIX" ] || [ -z "$PRI_GW4" ] || [ -z "$DEFAULT_PUB_EIP4" ] || [ -z "$ALL_PUB_EIP4s" ]; then
        echo "[ERR] Missing metadata, check EC2 metadata service." >&2
        exit 3
    fi

    echo "  Private MacAddr:     $pri_macs"
    echo "  Private IPv4:        $PRI_IP4"
    echo "  Private Prefix:      $PRI_PREFIX"
    echo "  Private GWv4:        $PRI_GW4"
    echo "  ALl Public IPv4:     $ALL_PUB_EIP4s"
    echo "  Default Public IPv4: $DEFAULT_PUB_EIP4"
}

ConfigNetwork() {
    # Disable RPF (Reverse Path Filtering)
    if ! grep -q "net.ipv4.conf.all.rp_filter=0" /etc/sysctl.conf; then
        echo "net.ipv4.conf.all.rp_filter=0" | tee -a /etc/sysctl.conf > /dev/null
        sysctl -p /etc/sysctl.conf
    fi

    # Disable cloud-init network configuration
    echo "network: {config: disabled}" > /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg

    if [ "$SYSTEM" = "ubuntu" ]; then
        ConfigUbuntuNetwork
    elif [ "$SYSTEM" = "centos" ]; then
        ConfigCentOSNetwork
    elif [ "$SYSTEM" = "debian" ]; then
        if [ "$VERSION_ID" = "11" ] || [ "$VERSION_ID" = "10" ]; then
            ConfigDebianNetwork
        elif [ "$VERSION_ID" = "12" ]; then
            ConfigUbuntuNetwork
        else
            echo "Unsupported Debian version: $VERSION_ID"
            exit 1
        fi
    elif [ "$SYSTEM" = "rocky" ]; then
        ConfigCentOSNetwork
    else
        echo "Unsupported OS for network config: $SYSTEM"
        exit 1
    fi
}

echo "1. Check OS..."
CheckSupportedOS

echo

echo "2. FetchMetaData..."
FetchMetaData

echo

echo "3. Configuring networks..."
ConfigNetwork

echo

echo
echo "Done."

sync
```

{% endcode %}

4. Reboot the Instance

Call the API to reboot the instance to apply the configuration.

5. Add Additional IPs (Optional)

To attach more IPs, repeat:

* Bind IP
* Run command
* Reboot instance
  {% endtab %}
  {% endtabs %}

### 3. Troubleshooting

#### 3.1 Configuration Not Taking Effect

* Cause: Instance not rebooted
* Solution: Reboot the instance

#### 3.2 Configuration Failure

* Ensure all IPs are in Bypass mode
* Verify the OS is within the supported list


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.console.zenlayer.com/welcome/elastic-compute/get-started/manage-instances/bind-an-elastic-ipv4-address.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
