<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.openvz.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Belgarat</id>
	<title>OpenVZ Virtuozzo Containers Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.openvz.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Belgarat"/>
	<link rel="alternate" type="text/html" href="https://wiki.openvz.org/Special:Contributions/Belgarat"/>
	<updated>2026-05-14T14:57:55Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.1</generator>
	<entry>
		<id>https://wiki.openvz.org/index.php?title=Using_private_IPs_for_Hardware_Nodes&amp;diff=6434</id>
		<title>Using private IPs for Hardware Nodes</title>
		<link rel="alternate" type="text/html" href="https://wiki.openvz.org/index.php?title=Using_private_IPs_for_Hardware_Nodes&amp;diff=6434"/>
		<updated>2008-09-10T07:48:12Z</updated>

		<summary type="html">&lt;p&gt;Belgarat: Modify line &amp;quot;if  &amp;quot;$str&amp;quot; =~ &amp;quot;^ifname=&amp;quot; ; then&amp;quot; and line &amp;quot;if  &amp;quot;$str&amp;quot; =~ &amp;quot;^host_ifname=&amp;quot; ; then&amp;quot;. it's critical for the new version of bash in debian.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article describes how to assign public IPs to containers running on OVZ Hardware Nodes in case you have a following network topology:&lt;br /&gt;
&lt;br /&gt;
[[Image:PrivateIPs_fig1.gif|An initial network topology]]&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
This configuration was tested on a RHEL5 OpenVZ Hardware Node and a container based on a Fedora Core 5 template.&lt;br /&gt;
Other host OSs and templates might require some configuration changes, please add corresponding OS specific changes if you've faced any.&lt;br /&gt;
&lt;br /&gt;
This article assumes the presence of 'brctl', 'ip' and 'ifconfig' utils. You may need to install missing packages like 'bridge-utils'/'iproute'/'net-tools' or others which contain those utilities.&lt;br /&gt;
&lt;br /&gt;
This article assumes you have already [[Quick installation|installed OpenVZ]],&lt;br /&gt;
prepared the [[OS template cache]](s) and have&lt;br /&gt;
[[Basic_operations_in_OpenVZ_environment|container(s) created]]. If not, follow the links to perform the steps needed.&lt;br /&gt;
{{Note|don't assign an IP after container creation.}}&lt;br /&gt;
&lt;br /&gt;
== An OVZ Hardware Node has the only one Ethernet interface ==&lt;br /&gt;
(assume eth0)&lt;br /&gt;
&lt;br /&gt;
=== Hardware Node configuration ===&lt;br /&gt;
&lt;br /&gt;
==== Create a bridge device ====&lt;br /&gt;
 [HN]# brctl addbr br0&lt;br /&gt;
&lt;br /&gt;
==== Remove an IP from eth0 interface ====&lt;br /&gt;
 [HN]# ifconfig eth0 0&lt;br /&gt;
&lt;br /&gt;
==== Add eth0 interface into the bridge ====&lt;br /&gt;
 [HN]# brctl addif br0 eth0&lt;br /&gt;
 &lt;br /&gt;
==== Assign the IP to the bridge ====&lt;br /&gt;
(the same that was assigned on eth0 earlier)&lt;br /&gt;
 [HN]# ifconfig br0 10.0.0.2/24&lt;br /&gt;
&lt;br /&gt;
==== Resurrect the default routing ====&lt;br /&gt;
 [HN]# ip route add default via 10.0.0.1 dev br0&lt;br /&gt;
 &lt;br /&gt;
{{Warning|if you are '''configuring''' the node '''remotely''' you '''must''' prepare a '''script''' with the above commands and run it in background with the redirected output or you'll '''lose the access''' to the Node.}}&lt;br /&gt;
&lt;br /&gt;
==== A script example ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[HN]# cat /tmp/br_add &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
brctl addbr br0&lt;br /&gt;
ifconfig eth0 0 &lt;br /&gt;
brctl addif br0 eth0 &lt;br /&gt;
ifconfig br0 10.0.0.2/24 &lt;br /&gt;
ip route add default via 10.0.0.1 dev br0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [HN]# /tmp/br_add &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
=== Container configuration ===&lt;br /&gt;
&lt;br /&gt;
==== Start a container ====&lt;br /&gt;
 [HN]# vzctl start 101&lt;br /&gt;
&lt;br /&gt;
==== Add a [[Virtual_Ethernet_device|veth interface]] to the container ====&lt;br /&gt;
 [HN]# vzctl set 101 --netif_add eth0 --save&lt;br /&gt;
&lt;br /&gt;
==== Set up an IP to the newly created container's veth interface ====&lt;br /&gt;
 [HN]# vzctl exec 101 ifconfig eth0 85.86.87.195/26&lt;br /&gt;
 &lt;br /&gt;
==== Add the container's veth interface to the bridge ====&lt;br /&gt;
 [HN]# brctl addif br0 veth101.0&lt;br /&gt;
&lt;br /&gt;
{{Note|There will be a delay of about 15 seconds(default for 2.6.18 kernel) while the bridge software runs STP to detect loops and transitions the veth interface to the forwarding state.&lt;br /&gt;
&amp;lt;!-- /sys/class/net/$BR_NAME/bridge/forward_delay in SEC*USER_HZ --&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
==== Set up the default route for the container ====&lt;br /&gt;
 [HN]# vzctl exec 101 ip route add default via 85.86.87.193 dev eth0&lt;br /&gt;
 &lt;br /&gt;
==== (Optional) Add CT↔HN routes ====&lt;br /&gt;
The above configuration provides the following connections:&lt;br /&gt;
* CT X ↔ CT Y (where CT X and CT Y can locate on any OVZ HN)&lt;br /&gt;
* CT   ↔ Internet&lt;br /&gt;
&lt;br /&gt;
Note that&lt;br /&gt;
&lt;br /&gt;
* The accessability of the CT from the HN depends on the local gateway providing NAT (probably - yes)&lt;br /&gt;
&lt;br /&gt;
* The accessability of the HN from the CT depends on the ISP gateway being aware of the local network (probably not)&lt;br /&gt;
&lt;br /&gt;
So to provide CT ↔ HN accessibility despite the gateways' configuration you can add the following routes:&lt;br /&gt;
&lt;br /&gt;
 [HN]# ip route add 85.86.87.195 dev br0&lt;br /&gt;
 [HN]# vzctl exec 101 ip route add 10.0.0.2 dev eth0&lt;br /&gt;
&lt;br /&gt;
=== Resulting OpenVZ Node configuration ===&lt;br /&gt;
[[Image:PrivateIPs_fig2.gif|Resulting OpenVZ Node configuration]]&lt;br /&gt;
&lt;br /&gt;
=== Making the configuration persistent ===&lt;br /&gt;
&lt;br /&gt;
==== Set up a bridge on a HN ====&lt;br /&gt;
This can be done by configuring the &amp;lt;code&amp;gt;ifcfg-*&amp;lt;/code&amp;gt; files located in &amp;lt;code&amp;gt;/etc/sysconfig/network-scripts/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Assuming you had a configuration file (e.g. &amp;lt;code&amp;gt;ifcfg-eth0&amp;lt;/code&amp;gt;) like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEVICE=eth0&lt;br /&gt;
ONBOOT=yes&lt;br /&gt;
IPADDR=10.0.0.2&lt;br /&gt;
NETMASK=255.255.255.0&lt;br /&gt;
GATEWAY=10.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To automatically create bridge &amp;lt;code&amp;gt;br0&amp;lt;/code&amp;gt;  you can create &amp;lt;code&amp;gt;ifcfg-br0&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEVICE=br0&lt;br /&gt;
TYPE=Bridge&lt;br /&gt;
ONBOOT=yes&lt;br /&gt;
IPADDR=10.0.0.2&lt;br /&gt;
NETMASK=255.255.255.0&lt;br /&gt;
GATEWAY=10.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and edit &amp;lt;code&amp;gt;ifcfg-eth0&amp;lt;/code&amp;gt; to add the &amp;lt;code&amp;gt;eth0&amp;lt;/code&amp;gt; interface into the bridge &amp;lt;code&amp;gt;br0&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEVICE=eth0&lt;br /&gt;
ONBOOT=yes&lt;br /&gt;
BRIDGE=br0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Edit the container's configuration ====&lt;br /&gt;
Add these parameters to the &amp;lt;code&amp;gt;/etc/vz/conf/$CTID.conf&amp;lt;/code&amp;gt; file which will be used during the network configuration:&lt;br /&gt;
* Add/change &amp;lt;code&amp;gt;CONFIG_CUSTOMIZED=&amp;quot;yes&amp;quot;&amp;lt;/code&amp;gt; (indicates that a custom&lt;br /&gt;
  script should be run on a container start)&lt;br /&gt;
* Add &amp;lt;code&amp;gt;VETH_IP_ADDRESS=&amp;quot;IP/MASK&amp;quot;&amp;lt;/code&amp;gt; (a container can have multiple&lt;br /&gt;
  IPs separated by spaces)&lt;br /&gt;
* Add &amp;lt;code&amp;gt;VE_DEFAULT_GATEWAY=&amp;quot;CT DEFAULT GATEWAY&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add &amp;lt;code&amp;gt;BRIDGEDEV=&amp;quot;BRIDGE NAME&amp;quot;&amp;lt;/code&amp;gt; (a bridge name to which the&lt;br /&gt;
  container veth interface should be added)&lt;br /&gt;
&lt;br /&gt;
An example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Network customization section&lt;br /&gt;
CONFIG_CUSTOMIZED=&amp;quot;yes&amp;quot;&lt;br /&gt;
VETH_IP_ADDRESS=&amp;quot;85.86.87.195/26&amp;quot;&lt;br /&gt;
VE_DEFAULT_GATEWAY=&amp;quot;85.86.87.193&amp;quot;&lt;br /&gt;
BRIDGEDEV=&amp;quot;br0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Create a custom network configuration script ====&lt;br /&gt;
which should be called each time a container is started (e.g. &amp;lt;code&amp;gt;/usr/sbin/vznetcfg.custom&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# /usr/sbin/vznetcfg.custom&lt;br /&gt;
# a script to bring up bridged network interfaces (veth's) in a container&lt;br /&gt;
&lt;br /&gt;
GLOBALCONFIGFILE=/etc/vz/vz.conf&lt;br /&gt;
CTCONFIGFILE=/etc/vz/conf/$VEID.conf&lt;br /&gt;
vzctl=/usr/sbin/vzctl&lt;br /&gt;
brctl=/usr/sbin/brctl&lt;br /&gt;
ip=/sbin/ip&lt;br /&gt;
ifconfig=/sbin/ifconfig&lt;br /&gt;
. $GLOBALCONFIGFILE&lt;br /&gt;
. $CTCONFIGFILE&lt;br /&gt;
&lt;br /&gt;
NETIF_OPTIONS=`echo $NETIF | sed 's/,/\n/g'`&lt;br /&gt;
for str in $NETIF_OPTIONS; do \&lt;br /&gt;
        # getting 'ifname' parameter value&lt;br /&gt;
        if  echo &amp;quot;$str&amp;quot; | grep -o &amp;quot;^ifname=&amp;quot; ; then&lt;br /&gt;
                # remove the parameter name from the string (along with '=')&lt;br /&gt;
                CTIFNAME=${str#*=};&lt;br /&gt;
        fi&lt;br /&gt;
        # getting 'host_ifname' parameter value&lt;br /&gt;
        if  echo &amp;quot;$str&amp;quot; | grep -o &amp;quot;^host_ifname=&amp;quot; ; then&lt;br /&gt;
                # remove the parameter name from the string (along with '=')&lt;br /&gt;
                VZHOSTIF=${str#*=};&lt;br /&gt;
        fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
if [ ! -n &amp;quot;$VETH_IP_ADDRESS&amp;quot; ]; then&lt;br /&gt;
   echo &amp;quot;According to $CONFIGFILE CT$VEID has no veth IPs configured.&amp;quot;&lt;br /&gt;
   exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ ! -n &amp;quot;$VZHOSTIF&amp;quot; ]; then&lt;br /&gt;
   echo &amp;quot;According to $CONFIGFILE CT$VEID has no veth interface configured.&amp;quot;&lt;br /&gt;
   exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ ! -n &amp;quot;$CTIFNAME&amp;quot; ]; then&lt;br /&gt;
   echo &amp;quot;Corrupted $CONFIGFILE: no 'ifname' defined for host_ifname $VZHOSTIF.&amp;quot;&lt;br /&gt;
   exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Initializing interface $VZHOSTIF for CT$VEID.&amp;quot;&lt;br /&gt;
$ifconfig $VZHOSTIF 0&lt;br /&gt;
&lt;br /&gt;
CTROUTEDEV=$VZHOSTIF&lt;br /&gt;
&lt;br /&gt;
if [ -n &amp;quot;$BRIDGEDEV&amp;quot; ]; then&lt;br /&gt;
   echo &amp;quot;Adding interface $VZHOSTIF to the bridge $BRIDGEDEV.&amp;quot;&lt;br /&gt;
   CTROUTEDEV=$BRIDGEDEV&lt;br /&gt;
   $brctl addif $BRIDGEDEV $VZHOSTIF&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Up the interface $CTIFNAME link in CT$VEID&lt;br /&gt;
$vzctl exec $VEID $ip link set $CTIFNAME up&lt;br /&gt;
&lt;br /&gt;
for IP in $VETH_IP_ADDRESS; do&lt;br /&gt;
   echo &amp;quot;Adding an IP $IP to the $CTIFNAME for CT$VEID.&amp;quot;&lt;br /&gt;
   $vzctl exec $VEID $ip address add $IP dev $CTIFNAME&lt;br /&gt;
&lt;br /&gt;
   # removing the netmask&lt;br /&gt;
   IP_STRIP=${IP%%/*};&lt;br /&gt;
&lt;br /&gt;
   echo &amp;quot;Adding a route from CT0 to CT$VEID using $IP_STRIP.&amp;quot;&lt;br /&gt;
   $ip route add $IP_STRIP dev $CTROUTEDEV&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
if [ -n &amp;quot;$CT0_IP&amp;quot; ]; then&lt;br /&gt;
   echo &amp;quot;Adding a route from CT$VEID to CT0.&amp;quot;&lt;br /&gt;
   $vzctl exec $VEID $ip route add $CT0_IP dev $CTIFNAME&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ -n &amp;quot;$VE_DEFAULT_GATEWAY&amp;quot; ]; then&lt;br /&gt;
   echo &amp;quot;Setting $VE_DEFAULT_GATEWAY as a default gateway for CT$VEID.&amp;quot;&lt;br /&gt;
   $vzctl exec $VEID \&lt;br /&gt;
        $ip route add default via $VE_DEFAULT_GATEWAY dev $CTIFNAME&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;small&amp;gt;Note: this script can be easily extended to work for multiple triples &amp;amp;lt;bridge, ip address, veth device&amp;amp;gt;, see http://vireso.blogspot.com/2008/02/2-veth-with-2-brindges-on-openvz-at.html &amp;lt;/small&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Make the script to be run on a container start ====&lt;br /&gt;
In order to run above script on a container start create the file&lt;br /&gt;
&amp;lt;code&amp;gt;/etc/vz/vznet.conf&amp;lt;/code&amp;gt; with the following contents:&lt;br /&gt;
&lt;br /&gt;
 EXTERNAL_SCRIPT=&amp;quot;/usr/sbin/vznetcfg.custom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Note|&amp;lt;code&amp;gt;/usr/sbin/vznetcfg.custom&amp;lt;/code&amp;gt; should be executable (chmod +x /usr/sbin/vznetcfg.custom)}}&lt;br /&gt;
&lt;br /&gt;
{{Note|When CT is stoped there are HW → CT route(s) still present in route table. We can use On-umount script for solve this.}}&lt;br /&gt;
&lt;br /&gt;
==== Create On-umount script for remove HW → CT route(s) ====&lt;br /&gt;
which should be called each time a container with VEID (&amp;lt;code&amp;gt;/etc/sysconfig/vz/$VEID.umount&amp;lt;/code&amp;gt;), or any container (&amp;lt;code&amp;gt;/etc/sysconfig/vz/vps.umount&amp;lt;/code&amp;gt;) is stoped:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# /etc/sysconfig/vz/$VEID.umount or /etc/sysconfig/vz/vps.umount&lt;br /&gt;
# a script to remove routes to container with veth-bridge from bridge &lt;br /&gt;
&lt;br /&gt;
CTCONFIGFILE=/etc/vz/conf/$VEID.conf&lt;br /&gt;
ip=/sbin/ip&lt;br /&gt;
. $CTCONFIGFILE&lt;br /&gt;
&lt;br /&gt;
if [ ! -n &amp;quot;$VETH_IP_ADDRESS&amp;quot; ]; then&lt;br /&gt;
   exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ ! -n &amp;quot;$BRIDGEDEV&amp;quot; ]; then&lt;br /&gt;
   exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
for IP in $VETH_IP_ADDRESS; do&lt;br /&gt;
   # removing the netmask&lt;br /&gt;
   IP_STRIP=${IP%%/*};&lt;br /&gt;
   &lt;br /&gt;
   echo &amp;quot;Remove a route from CT0 to CT$VEID using $IP_STRIP.&amp;quot;&lt;br /&gt;
   $ip route del $IP_STRIP dev $BRIDGEDEV&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|The script should be executable (chmod +x /etc/sysconfig/vz/vps.umount)}}&lt;br /&gt;
&lt;br /&gt;
==== Setting the route CT → HN ====&lt;br /&gt;
To set up a route from the CT to the HN, the custom script has to get a HN IP (the $CT0_IP variable in the script). There are several ways to specify it:&lt;br /&gt;
&lt;br /&gt;
# Add an entry CT0_IP=&amp;quot;CT0 IP&amp;quot; to the &amp;lt;code&amp;gt;$VEID.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
# Add an entry CT0_IP=&amp;quot;CT0 IP&amp;quot; to the &amp;lt;code&amp;gt;/etc/vz/vz.conf&amp;lt;/code&amp;gt; (the global configuration config file)&lt;br /&gt;
# Implement some smart algorithm to determine the CT0 IP right in the custom network configuration script&lt;br /&gt;
&lt;br /&gt;
Each variant has its pros and cons, nevertheless for HN static IP configuration variant 2 seems to be acceptable (and the most simple).&lt;br /&gt;
&lt;br /&gt;
== An OpenVZ Hardware Node has two Ethernet interfaces ==&lt;br /&gt;
Assuming you have 2 interfaces eth0 and eth1 and want to separate local traffic (10.0.0.0/24) from  external traffic.&lt;br /&gt;
Let's assign eth0 for the external traffic and eth1 for the local one.&lt;br /&gt;
&lt;br /&gt;
If there is no need to make the container accessible from the HN and vice versa, it's enough to replace 'br0' with 'eth1' in the following steps of the above configuration:&lt;br /&gt;
* Hardware Node configuration → [[Using_private_IPs_for_Hardware_Nodes#Assign_the_IP_to_the_bridge|Assign the IP to the bridge]]&lt;br /&gt;
* Hardware Node configuration → [[Using_private_IPs_for_Hardware_Nodes#Resurrect_the_default_routing|Resurrect the default routing]]&lt;br /&gt;
&lt;br /&gt;
It is nesessary to set a local IP for 'br0' to ensure CT ↔ HN connection availability.&lt;br /&gt;
&lt;br /&gt;
== Putting containers to different subnetworks ==&lt;br /&gt;
It's enough to set up the correct $VETH_IP_ADDRESS and $VE_DEFAULT_GATEWAY values in the &lt;br /&gt;
[[Using_private_IPs_for_Hardware_Nodes#Edit_the_container.27s_configuration|above configuration]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Virtual network device]]&lt;br /&gt;
* [[Differences between venet and veth]]&lt;br /&gt;
&lt;br /&gt;
[[Category: HOWTO]]&lt;br /&gt;
[[Category: Networking]]&lt;/div&gt;</summary>
		<author><name>Belgarat</name></author>
		
	</entry>
</feed>