Como posso fazer uma tomada de saída para uma interface de rede específica?
-
22-07-2019 - |
Pergunta
Eu tenho um servidor com duas interfaces de rede diferentes, cada um com um endereço IP diferente. Como posso criar um socket por isso vai sair um endereço IP específico?
Eu prefiro um exemplo python, mas a questão é agnóstico língua, de modo atirar fora.
EDIT: Por favor, não me dê "Você não pode" como resposta. Quero dizer, é um computador. Eu posso fazer qualquer coisa que eu como a ele, por exemplo - eu posso programaticamente desativar a uma interface Eu não quero na mosca. Eu estou procurando algo mais bonita.
Solução
Você certamente pode ligar um socket a um dispositivo específico.
Eu não sei como fazê-lo em python, mas usando a API de soquete Berkeley (em C) você precisa chamar setsockopt()
, usando o SO_BINDTODEVICE
opção.
Você passa um descritor de interface, que é do tipo struct ifreq
. Idealmente, você iria receber o conteúdo do descritor de interface utilizando ioctl()
, e solicitando SIOCGIFINDEX
-. Passando o nome da interface (. Por exemplo, eth0) como um argumento
Edit: Só fiz uma busca rápida e encontrou esta documentação dos métodos de soquete em Pitão. setsockopt()
está entre eles.
Outras dicas
Apenas uma pequena nota - o que eu realmente preciso é se ligam a um IP específico, e apenas por uma questão de exaustividade, a solução é ligar o soquete após a criação. Fonte em python:
import socket
s = socket.socket()
s.bind(("127.0.0.1", 0))
s.connect(("321.12.131.432", 80))
import socket
s = socket.socket()
s.bind((get_ip_address('eth0'), 0))
de Quora