Editing Using NAT for container with private IPs

Jump to: navigation, search

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision Your text
Line 2: Line 2:
  
 
== Prerequisites ==
 
== Prerequisites ==
 
Make sure that below prerequisites are met, otherwise it won't work for you!
 
 
=== IP conntracks ===
 
 
'''IP connection tracking should be enabled for CT0'''. For recent OpenVZ kernels (2.6.9 and later) connection tracking for CT0 is enabled by default, but it can be disabled by vzctl 4.7 and newer (because it has a negative impact on venet performance, see {{Bug|2755}}). So, make sure there is '''NO''' line like
 
 
options ip_conntrack ip_conntrack_disable_ve0=1
 
or
 
options nf_conntrack ip_conntrack_disable_ve0=1
 
 
in <code>/etc/modules.conf</code>, <code>/etc/modprobe.conf</code>, or any file under <code>/etc/modprobe.d/</code> (such as <code>/etc/modprobe.d/vz.conf</code>). '''If there is such a line, please'''
 
#change <code>=1</code> to <code>=0</code>
 
#reboot the node.
 
  
 
=== IP forwarding ===
 
=== IP forwarding ===
 
+
IP forwarding should be turned on, on the hardware node in order for container networking to work. Make sure it is turned on:
'''IP forwarding should be turned on''' on the hardware node in order for container networking to work. Make sure it is turned on:
 
  
 
  $ cat /proc/sys/net/ipv4/ip_forward  
 
  $ cat /proc/sys/net/ipv4/ip_forward  
Line 30: Line 15:
 
[https://bugs.launchpad.net/ubuntu/+source/procps/+bug/84537 Launchpad]
 
[https://bugs.launchpad.net/ubuntu/+source/procps/+bug/84537 Launchpad]
  
The syntax of /etc/sysctl.conf has changed to:
+
The syntax of /etc/sysctl.conf has changed to :
  
 
<pre>net.ipv4.conf.default.forwarding=1
 
<pre>net.ipv4.conf.default.forwarding=1
 
net.ipv4.conf.all.forwarding=1</pre>
 
net.ipv4.conf.all.forwarding=1</pre>
  
===Enable iptables in OpenVZ 7/Virtuozzo 7===
+
=== IP conntracks ===
 +
IP connection tracking should be enabled for CT0.
  
If you use OpenVZ 7/Virtuozzo 7 and want to manage iptables through iptables-services you must disable firewalld and enable iptables:
+
'''For OpenVZ kernels 2.6.8''', put the following line into /etc/modprobe.conf:
  
  # systemctl stop firewalld
+
  modprobe ip_conntrack ip_conntrack_enable_ve0=1
# systemctl mask firewalld
 
# yum install iptables-services
 
# systemctl enable iptables
 
  
== How to create the container and attach network properties to it ==
+
and reboot.
  
Create the container:
+
'''For OpenVZ kernels later than 2.6.8''', connection tracking for CT0 is enabled by default. '''However''', make sure there is '''no''' line like
  
  # prlctl create 100700 --vmtype ct
+
  options ip_conntrack ip_conntrack_disable_ve0=1
 
 
Attach the internal IP address and DNS server:
 
 
 
# prlctl set 100700 --ipadd 192.168.0.101/24
 
# prlctl set 100700 --nameserver 8.8.8.8
 
 
 
Start the container:
 
 
 
# prlctl start 100700
 
  
== How to provide access for container to the Internet ==
+
in /etc/modules.conf or /etc/modprobe.conf. If there is such line, comment it out (or remove) and reboot.
  
To enable the [[container]]s, which have only internal IP addresses, to access the Internet, SNAT (Source Network Address Translation, also known as IP masquerading) should be configured on the [[Hardware Node]]. This is ensured by the standard Linux <tt>iptables</tt> utility.
+
== How to provide access for container to Internet ==
  
To perform a simple SNAT setup, execute the following command on the [[Hardware Node]]:
+
To enable the [[container]]s, which have only internal IP addresses, to access the Internet, SNAT (Source Network Address Translation, also known as IP masquerading) should be configured on the [[Hardware Node]]. This is ensured by the standard Linux <tt>iptables</tt> utility. To perform a simple SNAT setup, execute the following command on the [[Hardware Node]]:
 
<pre>
 
<pre>
 
# iptables -t nat -A POSTROUTING -s src_net -o eth0 -j SNAT --to ip_address
 
# iptables -t nat -A POSTROUTING -s src_net -o eth0 -j SNAT --to ip_address
 
</pre>
 
</pre>
  
where <tt>src_net</tt> is a range of IP addresses of containers to be translated by SNAT, and <tt>ip_address</tt> is the external IP address of your [[Hardware Node]]. The format of src_net is xx.xx.xx.xx/xx ([[w:CIDR|CIDR notation]]). For example:
+
where <tt>src_net</tt> is a range of IP addresses of containers to be translated by SNAT, and <tt>ip_address</tt> is the external IP address of your [[Hardware Node]]. The format of src_net is xx.xx.xx.xx/xx ([[w:CIDR|CIDR notation]]). For example to specify IP addresses from 192.168.2.1 through 192.168.2.127 use:
 
<pre>
 
<pre>
# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j SNAT --to ip_address
+
# iptables -t nat -A POSTROUTING -s 192.168.2.0/25 -o eth0 -j SNAT --to ip_address
 
</pre>
 
</pre>
  
Line 80: Line 54:
 
</pre>
 
</pre>
  
Or you can just use:
+
{{Note|For a Debian O.S v4 or v5 Hardware Node, you may need to allow a forward rule. The table still being the default table (filter) but the chain is FORWARD :
  
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
+
<pre>
 +
# /sbin/iptables -A FORWARD -s 172.16.150.0/24 -j ACCEPT
 +
# /sbin/iptables -A FORWARD -d 172.16.150.0/24 -j ACCEPT
 +
</pre>}}
  
=== Save new iptables rules ===
 
  
Do not forget to save your new iptables rules
+
If you are using an iptables firewall (for example the default RedHat/CentOS firewall), don't forget to allow outgoing connections from your containers. For example if you are using the subnet 172.16.150.0/24 for your VMs, you should do the following:
 +
<pre>
 +
# /sbin/iptables -A RH-Firewall-1-INPUT -s 172.16.150.0/24 -j ACCEPT
 +
# /sbin/iptables-save > /etc/sysconfig/iptables
 +
# /sbin/service iptables restart
 +
</pre>
  
# service iptables save
 
# service iptables restart
 
  
=== Firewall ===
+
{{Note|If the above is not working then check if one of the following solutions does the trick.}}
 +
1. If you are using stable (currently 2.6.8-based) kernel, then to enable SNAT for the containers on your local network you need to explicitly enable connection tracking in [[CT0]]. Make sure that the following string is present in the <tt>/etc/modprobe.conf</tt> file:
 +
<pre>
 +
options ip_conntrack ip_conntrack_enable_ve0=1
 +
</pre>
  
For Debian hardware node, you may need to allow a forward rule. The table still being the default table (filter) but the chain is FORWARD:
+
{{Note|in kernels later than 2.6.8, connection tracking is enabled by default}}
  
# iptables -A FORWARD -s 192.168.2.0/24 -j ACCEPT
+
In case it is not, add this string to the file by means of any text editor (for example, vi). This setting is not needed for kernels more recent than 2.6.8, since connection tracking for [[CT0]] is enabled by default in those kernels.
# iptables -A FORWARD -d 192.168.2.0/24 -j ACCEPT
 
  
For default RedHat/CentOS firewall, allow outgoing connections from your containers, for example:
+
2. For unknown reasons the above didn't work on a Debian host. The solution is to do it in an init.d script as follows:
 +
<pre>
 +
modprobe ip_conntrack ip_conntrack_enable_ve0=1
 +
</pre>
 +
Make sure that this module is loaded before any of the other iptables-modules are loaded! Also remember that if this module is loaded without the option, unloading and reloading doesn't work! You need to reboot the computer.
  
# iptables -A RH-Firewall-1-INPUT -s 192.168.2.0/24 -j ACCEPT
+
{{Note|in kernels later than 2.6.8, connection tracking is enabled by default}}
  
=== Test ===
+
{{Note| you may need to modify the /etc/vz/vz.conf file to include:}}
 +
<pre>
 +
IPTABLES="iptable_filter iptable_mangle ipt_limit ipt_multiport ipt_tos ipt_TOS ipt_REJECT ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_LOG ipt_length ip_conntrack ip_conntrack_ftp ip_conntrack_irc ipt_conntrack ipt_state ipt_helper iptable_nat ip_nat_ftp ip_nat_irc ipt_REDIRECT"
 +
</pre>
  
Now you should be able to reach internet from your container:
+
Now you should be able to reach internet from yours [[container]]:
  
# prlctl enter 100700
+
<pre>
# ping openvz.org
+
vzctl exec <container ID> ping www.openvz.org
 +
</pre>
  
 
== How to provide access from Internet to a container ==
 
== How to provide access from Internet to a container ==
Line 125: Line 115:
 
# iptables -t nat -A POSTROUTING -s ve_address -o eth0 -j SNAT --to ip_address
 
# iptables -t nat -A POSTROUTING -s ve_address -o eth0 -j SNAT --to ip_address
 
</pre>
 
</pre>
 
Is need add GATEWAY in /etc/sysconfig/network-script/interface (IP of host that provide access internet).
 
  
 
After applying this, you'll see container' web server at <code><nowiki>http://ip_address:8080/</nowiki></code>.
 
After applying this, you'll see container' web server at <code><nowiki>http://ip_address:8080/</nowiki></code>.

Please note that all contributions to OpenVZ Virtuozzo Containers Wiki may be edited, altered, or removed by other contributors. If you don't want your writing to be edited mercilessly, then don't submit it here.
If you are going to add external links to an article, read the External links policy first!

To edit this page, please answer the question that appears below (more info):

Cancel Editing help (opens in new window)

Templates used on this page: