@sobre a pergunta do superusuário sobre diferentes interfaces para diferentes processos
Esta resposta requer alguma compilação (veja acima para mais), acesso root e o comando ip
de
iproute
package
sudo apt-get install iproute
Isso irá recuperar e compilar a biblioteca bind.so
PRELOAD no seu diretório atual.
wget http://www.ryde.net/code/bind.c.txt -O bind.c
gcc -nostartfiles -fpic -shared bind.c -o bind.so -ldl -D_GNU_SOURCE
Agora, vamos supor que sua VPN esteja on-line e você saiba o nome do seu dispositivo de encapsulamento (como tun0).
Vamos supor também que você saiba o seu padrão gw ( route |awk '/default/ {print $2 }'
)
E seu túnel / outro gateway de dispositivo route |awk '/tun0/ {print $2 }'
## run as root:
## which device to route out with (tun0, eth0, wlan0)
export DEV=tun0
## default gw to use for that device (see above for advice)
export DEVGW=192.168.1.1
# which routing table to use
export TABLE=special_table1
# get ip for "$DEV"
export BINDIP=$(ifconfig $DEV | perl -ne 'if (/inet addr:([\d\.]+)/) {print $1}')
## create empty routing tables
# match name to TABLE variable above with unique number before it.
# like: (creates two tables)
echo 201 special_table1 >> /etc/iproute2/rt_tables
echo 202 special_table2 >> /etc/iproute2/rt_tables
## add default gw for special routing table
ip route add default via $DEVGW dev $DEV table $TABLE
## source route all traffice from you bound ip through that
ip rule add from $BINDIP table $TABLE
# flush routing cache
ip route flush cache
Para ver suas tabelas de roteamento:
# This is the main table (should basically have same info as 'route -n')
ip route show table main
# your special_table1
ip route show table special_table1
# this this you can see which source ips trigger which routing table
ip rule show
Execução de um programa como o firefox com bind.so PRELOADED e vinculá-lo à interface com a qual deseja direcionar o tráfego.
### run as user
## change DEV to with route/device you want your program to bind to
export DEV=tun0
export BINDIP=$(ifconfig $DEV | perl -ne 'if (/inet addr:([\d\.]+)/) {print $1}')
BIND_ADDR="$BINDIP" LD_PRELOAD=./bind.so "PROGRAM NAME"
#like:
BIND_ADDR="$BINDIP" LD_PRELOAD=./bind.so firefox
Se você quiser, pode repetir isso para quantas interfaces desejar e vincular. Portanto, para que o aplicativo específico esteja vinculado à interface específica. Todos os aplicativos não iniciados com o bind.so são encaminhados conforme sua tabela de roteamento principal especifica.