How to route docker traffic through the second network interface - docker

I have a mathine with two network interfaces, both have internet connection and have incoming traffic.
When the container is run in host network, it could serve traffic from both interfaces correctly.
If I change it to bridge mode, and expose my port. Traffic from the eth0 (the default route) works fine, while traffic from eth1 doesn't work at all (client always get timeout).
My guess is that return returned traffic goes through eth0 instead of back to eth1, causing the issue.
Before this, I had a similar issue on the host itself too.
The solution was to add a ip rule that directs all traffic from eth1 to a second route table, which uses eth1 as default gateway.
But this wont help docker traffic since they were not sent from eth1 directly.

Related

container port mapping concept confusion

I know I can map host port to container port in Docker command or in Dockerfile or in docker-compose.yml. I have no problem there, I know how to do that too.
For example, I have the following container:
$ docker container ls
ID COMMAND PORTS
84.. "python app.py" 0.0.0.0:5000->5000/tcp
I know it means the host port 5000 is mapped to container port 5000.
My question is only on the 0.0.0.0 part. I have done some study, it is said that 0.0.0.0:5000 means map port 5000 of all interfaces on host.
I understand the 5000 port on host, but I don't get "all interfaces on host", what does it mean exactly? Could someone please elaborate for me? Does it mean all network interfaces on the host? What "all interface" this "0.0.0.0" refers to exactly?
Your physical hardware can have more than one network interface. In this day and age you likely have a wireless Ethernet connection, but you could also have a wired Ethernet connection, or more than one of them, or some kind of other network connection. On a Linux host if you run ifconfig you will likely have at least two interfaces, your "real" network connection and a special "loopback" connection that only reaches the host. (And this is true inside a container as well, except that the "loopback" interface only reaches the container.)
When you set up a network listener, using the low-level bind(2) call or any higher-level wrapper, you specify not just the port you're listening on but also the specific IP address. If you listen on 127.0.0.1, your process will be only reachable from the loopback interface, but not off-box. If you have, say, two network connections where one connects to an external network and one an internal one, you can specify the IP address of the internal network and have a service that's not accessible from the outside world.
This is where 0.0.0.0 comes in. It's possible to write code that scans all of the network interfaces and separately listens to all of them, but 0.0.0.0 is a shorthand that means "all interfaces".
In Docker, this comes up in three ways:
The default -p listen address is 0.0.0.0. On a typical developer system, you might want to explicitly specify -p 127.0.0.1:8080:8080 to only have your service accessible from the physical host.
If you do have a multi-homed system, you can use -p 10.20.30.40:80:8080 to publish a port on only one network interface.
Within a container, the main container process generally must listen to 0.0.0.0. Since each container has its own private localhost, listening on 127.0.0.1 (a frequent default for development servers) means the process won't be accessible from other containers or via docker run -p.

Docker outbound connection is blocked

I am new to the docker world. I am currently setting up an custom application which relies on docker. The setup requires docker container to connect my outside network. All is working well but the container is unable to connect to outside network. After initial investiagtion and tcpdump I came to know that docker container can connect to the outside world. The packet is forwaded to the docker0 interface and docker0 has forwarded the packet to the eth0(physical interface), the eth0 then forwards the packet to the outside world and receives reponse. Now this is where the problem is, the eth0 after receiving reposne doesnot forward the packet to the docker0 interface and finally to the end host.
The below is the iptable run which are all set to default.
Also tcpdump output
Inteface present on th host
HOST OS is SUSE Ent linux 15.3
Docker version 20.10.17-ce, build a89b84221c85
I will be very much grateful for any reponse.
Thank You

Connecting Docker Container to Home Network

I am running some frr (free range routing) and ceos (Arista) containers on an "Ubuntu Docker Host" which is running on Virtual Box on Windows 10.
I created a macvlan network (net3) and tied it to enp interface of Ubuntu and connected my containers to it. However I cannot access my containers using their interfaces connected to the macvlan network.
I read about some limitations about network spaces between host and containers and saw macvlan network type as the solution to overcome those limitations. However it did not work.
Since my container is a router with multiple interfaces, I was expecting I can connect my new net3 network to my container. It would appear as a new new interface (it did) and when I assign an IP address from my home network to this interface, my router would be able to communicate to the outside directly using this interface`s IP address and bypass any sort of firewalling, NAT etc.
I know that we can use bridge networks connected to default docker0 network and which will then NAT outgoing connections from container and accept incoming connections if we publish a port etc. However what I want is to have a container with 2 interfaces, where one interface is in docker0 bridge and the other one is connected to the home network with an IP address from home network, which will expose it to the outside completely like a physical machine or my docket host Ubuntu VM.
I think i found a way to make this work.
added a new bridged network
added an iptables rule permitting traffic destined to this new bridged network at "Forward Chain".
What I do not understand now is that although the routing is disabled on the host, this "forward" rule has an impact on the traffic and it is actually working. I also did not need to add a rule traffic for return traffic. Default rules added by Docker during creation of the container seem to take care of this direction.

How to connect to remote docker instance using virtual private network

I have a docker instance on a host which has two network interfaces, one attached to the internet and one virtual private network.
The host is able to connect to the internet and the VPN.
The docker instance running on the host can connect to the internet, but cannot reach the VPN.
How can I assure my docker instance can connect to the VPN?
I have read explanation about using pipework (https://github.com/jpetazzo/pipework/) but don't see how I can get this to work for me.
I am using docker 0.8.0 on Ubuntu 13.10.
Thanks for the help.
I think that you do not need pipework. In default configuration, you should be able to reach both host interfaces from docker eth0 interface. Possible problems:
DNS: my default container resolv.conf is 8.8.8.8 and it may not know some VPN-specific domain names.
Filtering/firewall at host possibly drops/does not forward packets to VPN. (check firewall f.e ufw status, ...)
You can check IP ranges for possible conflicts in docker networking. In case of conflict, you can configure docker network interface docker0 manually to be ok with your VPN:
/etc/network/interfaces:
auto docker0
iface docker0 inet static
address 192.168.1.1 <--- configure this
netmask 255.255.255.0
bridge_stp off
bridge_fd 0

IP Port Redirection

I have a silverlight->server communication system up that uses port 4530 among others. I've used no-ip.org to redirect traffic to my home server. Is there anyway to use no-ip (or is there another service like it?) to allow me to ping off an ip at port 4530 etc, and send it to my dynamic ip?

Resources