Minha tarefa é criar um cliente tcp python e um servidor no mesmo PC para que o cliente trabalhe em uma interface Ethernet e o servidor funcione em outra. O tráfego deve viajar através de cabos e de uma rede de hardware específica.
O problema é que o tráfego na verdade não sai do PC e toda a conexão tcp funciona no loopback.
Como faço para forçar o tráfego a passar pelas interfaces reais?
A máquina virtual não é uma opção.
Alguns detalhes técnicos:
o servidor deve estar na eth1 192.168.2.59
o cliente deve estar em eno1 192.168.1.32
# server
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Bind the socket to the port
server_address = ('192.168.2.59', 10000)
print('starting up on %s port %s' % server_address)
sock.bind(server_address)
# Listen for incoming connections
sock.listen(1)
...
#client
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('192.168.1.32',6667))
# Connect the socket to the port where the server is listening
server_address = ('192.168.2.59', 10000)
print >>sys.stderr, 'connecting to %s port %s' % server_address
sock.connect(server_address)
...
O que eu tentei:
o firejail
$ firejail --net=eth1 python tcpServer.py
$ firejail --net=eno1 python tcpClient.py
uma tentativa de suicídio para unir eno1 e lo XD. Mas brctl se recusou a adicionar lo
edite a tabela de roteamento
route add -net 127.0.0.0 netmask 255.0.0.0 metric 1 dev lo
assumindo que quanto menos métrica menos prioridade a rota terá.
resultando em
~# /sbin/route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 100 0 0 eno1
default 192-168-2-1.el 0.0.0.0 UG 101 0 0 eth1
192.168.2.0 0.0.0.0 255.255.255.0 U 100 0 0 eth1
127.0.0.0 0.0.0.0 255.0.0.0 U 1 0 0 lo
link-local 0.0.0.0 255.255.0.0 U 1000 0 0 eno1
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eno1
Nada funcionou como você pode imaginar.