Meu servidor doméstico possui duas interfaces principais eth1
(uma conexão padrão à Internet) e tun0
(um túnel OpenVPN). Eu gostaria de usar iptables
para forçar a saída de todos os pacotes gerados por um processo local pertencente ao UID 1002 e a saída de tun0
todos os outros pacotes eth1
.
Posso marcar facilmente pacotes correspondentes:
iptables -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11
Agora, gostaria de colocar alguma regra na cadeia POSTROUTING (provavelmente da tabela mangle) para corresponder aos pacotes marcados com 11 e enviá-los para tun0
, seguidos por uma regra que corresponda a todos os pacotes e enviá-los para eth1
.
Encontrei o destino ROUTE, mas isso parece reescrever a interface de origem (a menos que eu esteja lendo incorretamente).
O iptables é capaz disso? Tenho que mexer com a tabela de roteamento (via ip route
ou apenas os route
comandos herdados )?
Edit: Eu pensei que talvez eu deveria fornecer mais informações. No momento, não tenho outras regras do iptables (embora eu possa criar algumas regras para executar tarefas não relacionadas no futuro). Além disso, a saída de ip route
é:
default via 192.168.1.254 dev eth1 metric 203
10.32.0.49 dev tun0 proto kernel scope link src 10.32.0.50
85.17.27.71 via 192.168.1.254 dev eth1
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.73 metric 203
Eu não toquei na tabela de roteamento - é assim que é atualmente (embora pareça bastante suja). Sinto muito, mas não tenho o route
comando legado instalado nesta máquina.
E a saída de ip addr
(é claro, eth0 e eth2 pode ser ignorada - são NICs que não estão sendo usadas no momento):
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 1c:6f:65:2a:73:3f brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:1b:21:9d:4e:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.1.73/24 brd 192.168.1.255 scope global eth1
inet6 fe80::21b:21ff:fe9d:4ebb/64 scope link
valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 00:1b:21:6a:c0:4b brd ff:ff:ff:ff:ff:ff
5: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
link/none
inet 10.32.0.50 peer 10.32.0.49/32 scope global tun0
Edit: Eu consegui algo meio que funcionando, mas não está encaminhando pacotes marcados para tun0. Basicamente, adicionei uma tabela (11) e usei:
ip route add table 11 via 10.32.0.49 dev tun0
ip rule add priority 10000 fwmark 11 table 11
Quando eu apenas sudo -u user1000 wget -qO- whatismyip.org
recebo o endereço IP externo da minha casa, mas, se o faço sudo -u user1002 wget -qO- whatismyip.org
, também recebo o endereço IP da minha casa (mas eu deveria estar recebendo o IP na outra extremidade do túnel OpenVPN).
A execução iptables -vL
confirma que os pacotes estão sendo correspondidos pela regra de marcação, mas eles não parecem estar seguindo a regra de roteamento.
EDIT: Passei muito tempo nisso e, embora ainda não funcione, acho que estou um pouco mais perto.
A regra iptables deve estar na mangle
cadeia OUTPUT da tabela. Eu acho que também preciso de uma regra MASQUERADE na nat
cadeia POSTROUTING da tabela, para definir o endereço de origem. No entanto, o redirecionamento que ocorre após o mangle da OUTPUT não está funcionando corretamente.
Eu gastei 5 horas nisso agora, então estou dando um tempo e provavelmente voltarei a ele mais tarde hoje à noite ou amanhã.
man iptables
: Ele deve ser usado apenas com conexões IP (discadas) atribuídas dinamicamente: se você possui um endereço IP estático, deve usar o destino SNAT. Mascarar é equivalente a especificar um mapeamento para o endereço IP da interface em que o pacote está saindo, mas também tem o efeito de que as conexões sejam esquecidas quando a interface cair. Você está certo, mas como meu IP nunca mudaria, decidi usar o SNAT por recomendação da página de manual.PREROUTING
cadeiaDNAT
para o endereço de origem correto (de acordo com o gateway padrão).Eu resolvi isso. O problema ocorreu com as regras de roteamento na tabela 11. A Tabela 11 foi atingida, mas as regras de roteamento o tornam inoperante. Esse script é o que eu uso agora e parece funcionar bem (embora seja obviamente específico da minha configuração). Além disso, criei uma nova tabela 21 dedicada ao uplink principal (eth1).
fonte
Eu acho que você quer:
http://lartc.org/howto/lartc.netfilter.html
Mas eu não testei o acima.
fonte
default
palavra-chave de fora.Isso pode ser feito sem o comando iptables Executar comando ip simples
Para o uid 1002:
Adicione a rota padrão para a tabela 502 na interface que você deseja dizer
fonte
Error: argument "uidrange" is wrong: Failed to parse rule type