13 de junho de 2018: Eu encontrei uma solução e editei este post caso seja útil para alguém.
Primeiro, a postagem original:
Eu tenho um portal onde eu quero fazer a tradução de endereços de rede do seu endereço IP público e um particular de seus números de portas públicas, para um endereço IP VPN particular e um número de porta VPN particular, para tráfego TCP e UDP, para RTSP-e-RTP-tunneled-over-HTTP. O problema é que nenhum pacote está passando. O portal, além de executar o openvpn, tem um servidor apache2, cujas instruções proxypass e proxypassreverse me permitem rotear o tráfego entre a LAN e a VPN, mas apenas para o tráfego TCP. Como o apache2 não pode manipular o tráfego UDP, estou tentando configurar o iptables para fazer isso por mim. Existe apenas uma interface Ethernet. Dispositivos na VPN estão na Internet, então o tráfego eth0 e tun0 fluem todos na eth0.
Eu configurei regras no iptables e habilitei o encaminhamento para eth0 ( /proc/sys/net/ipv4/conf/eth0/forwarding = 1
) e tun0 ( /proc/sys/net/ipv4/conf/tun0/forwarding = 1
) e todos ('/ proc / sys / net / ipv4 / ip_forward = 1'), mas nada acontece .
Eu adicionei as seguintes regras às regras padrão do iptables:
-A PREROUTING -d 192.168.192.203/32 -p udp -m udp --dport 10073 -j DNAT --to-destination 10.221.0.73:80
-A PREROUTING -d 192.168.192.203/32 -p tcp -m tcp --dport 10073 -j DNAT --to-destination 10.221.0.73:80
-A POSTROUTING -s 10.221.0.73/32 -p udp -m udp --sport 80 -j SNAT --to-source 192.168.192.203
-A POSTROUTING -s 10.221.0.73/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.192.203
e
-A FORWARD -d 10.221.0.73/32 -p udp -m state --state NEW,RELATED,ESTABLISHED -m udp --dport 80 -j ACCEPT
-A FORWARD -d 10.221.0.73/32 -p tcp -m state --state NEW,RELATED,ESTABLISHED -m tcp --dport 80 -j ACCEPT
Com essas regras, estou tentando obter o tráfego UDP e TCP da Internet (estou usando 192.168.192.203 neste exemplo) para a porta 10073 e encaminhá-lo para o endereço IP da VPN 10.221.0.73 e porta 80.
Aqui está o conjunto completo de regras:
# Generated by iptables-save v1.4.14 on Thu Jun 7 16:52:00 2018
*raw
:PREROUTING ACCEPT [1930:216976]
:OUTPUT ACCEPT [1477:229328]
-A PREROUTING -p udp -m udp --dport 8073 -j TRACE
-A OUTPUT -p udp -m udp --sport 8073 -j TRACE
COMMIT
# Completed on Thu Jun 7 16:52:00 2018
# Generated by iptables-save v1.4.14 on Thu Jun 7 16:52:00 2018
*nat
:PREROUTING ACCEPT [462:32832]
:INPUT ACCEPT [462:32832]
:OUTPUT ACCEPT [98:6069]
:POSTROUTING ACCEPT [98:6069]
-A PREROUTING -d 192.168.192.203/32 -p udp -m udp --dport 10073 -j DNAT --to-destination 10.221.0.73:80
-A PREROUTING -d 192.168.192.203/32 -p tcp -m tcp --dport 10073 -j DNAT --to-destination 10.221.0.73:80
-A POSTROUTING -s 10.221.0.73/32 -p udp -m udp --sport 80 -j SNAT --to-source 192.168.192.203
-A POSTROUTING -s 10.221.0.73/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.192.203
COMMIT
# Completed on Thu Jun 7 16:52:00 2018
# Generated by iptables-save v1.4.14 on Thu Jun 7 16:52:00 2018
*filter
:INPUT ACCEPT [1738:195868]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1333:210602]
:ufw-after-forward - [0:0]
:ufw-after-input - [0:0]
:ufw-after-logging-forward - [0:0]
:ufw-after-logging-input - [0:0]
:ufw-after-logging-output - [0:0]
:ufw-after-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-before-input - [0:0]
:ufw-before-logging-forward - [0:0]
:ufw-before-logging-input - [0:0]
:ufw-before-logging-output - [0:0]
:ufw-before-output - [0:0]
:ufw-reject-forward - [0:0]
:ufw-reject-input - [0:0]
:ufw-reject-output - [0:0]
:ufw-track-input - [0:0]
:ufw-track-output - [0:0]
-A INPUT -j ufw-before-logging-input
-A INPUT -j ufw-before-input
-A INPUT -j ufw-after-input
-A INPUT -j ufw-after-logging-input
-A INPUT -j ufw-reject-input
-A INPUT -j ufw-track-input
-A FORWARD -j ufw-before-logging-forward
-A FORWARD -j ufw-before-forward
-A FORWARD -j ufw-after-forward
-A FORWARD -j ufw-after-logging-forward
-A FORWARD -j ufw-reject-forward
-A FORWARD -d 10.221.0.73/32 -p udp -m state --state NEW,RELATED,ESTABLISHED -m udp --dport 80 -j ACCEPT
-A FORWARD -d 10.221.0.73/32 -p tcp -m state --state NEW,RELATED,ESTABLISHED -m tcp --dport 80 -j ACCEPT
-A OUTPUT -j ufw-before-logging-output
-A OUTPUT -j ufw-before-output
-A OUTPUT -j ufw-after-output
-A OUTPUT -j ufw-after-logging-output
-A OUTPUT -j ufw-reject-output
-A OUTPUT -j ufw-track-output
COMMIT
# Completed on Thu Jun 7 16:52:00 2018
Como posso consertar isso? Obrigado antecipadamente.
Em segundo lugar, aqui está como eu consertei ...
Eu configuro o tcpdump na máquina que uso como roteador e em uma máquina para a qual estou encaminhando o tráfego. A chave era estabelecer regras suficientemente amplas para a escolha de pacotes relevantes a serem relatados, já que outro tráfego estava fluindo por ambas as máquinas e para reportar com verbosidade suficiente. E, para simplificar as coisas, mudei a máquina do roteador para uma que também era um host OpenVPN, em vez de ser um cliente OpenVPN.
Aqui está o comando que eu usei na máquina do roteador, cujo endereço IP da LAN é 192.168.192.166, e cujo endereço IP da VPN é 10.254.0.1:
tcpdump -n -vv -c 5000 "port 80 or port 10073 or host 10.254.0.1 or host 10.254.0.73 or (host 192.168.192.166 and port 80) or (host 192.168.192.166 and port 10073)" -i any
10.254.0.73 é a máquina para a qual estou encaminhando pacotes, usando sua porta 80. Estou enviando pacotes para a porta 10073 no roteador.
Aqui está o comando para a máquina para a qual estou encaminhando pacotes:
tcpdump -vv -n -c 5000 "port 80 or port 10073 or host 192.168.192.166 or host 10.254.0.1" -i any
O "-i any" pega o tráfego em minha porta "pública", eth0 e também em minha porta "privada", tun0.
Aqui estão as regras de roteamento que funcionam para mim:
root@B16:~# iptables-save
# Generated by iptables-save v1.3.8 on Wed Jun 13 14:52:56 2018
*mangle
:PREROUTING ACCEPT [73673:9416551]
:INPUT ACCEPT [71740:8067234]
:FORWARD ACCEPT [1933:1349317]
:OUTPUT ACCEPT [120157:14972014]
:POSTROUTING ACCEPT [122090:16321331]
COMMIT
# Completed on Wed Jun 13 14:52:56 2018
# Generated by iptables-save v1.3.8 on Wed Jun 13 14:52:56 2018
*nat
:PREROUTING ACCEPT [12313:867446]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [11426:951748]
-A PREROUTING -i eth0 -p udp -m udp --dport 10073 -j DNAT --to-destination 10.254.0.73:80
-A PREROUTING -i eth0 -p tcp -m tcp --dport 10073 -j DNAT --to-destination 10.254.0.73:80
-A POSTROUTING -j MASQUERADE
COMMIT
# Completed on Wed Jun 13 14:52:56 2018
# Generated by iptables-save v1.3.8 on Wed Jun 13 14:52:56 2018
*filter
:INPUT ACCEPT [71741:8067274]
:FORWARD ACCEPT [1250:1319002]
:OUTPUT ACCEPT [120162:14973202]
:INBOUND - [0:0]
:LOG_FILTER - [0:0]
:LSI - [0:0]
:LSO - [0:0]
:OUTBOUND - [0:0]
-A FORWARD -d 10.254.0.73 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -d 10.254.0.73 -p udp -m udp --dport 80 -j ACCEPT
COMMIT
# Completed on Wed Jun 13 14:52:56 2018
Eu não achei o TRACE no iptables útil porque era muito difícil conseguir as regras certas. Usando o tcpdump salvou o dia, UMA VEZ eu consegui as regras certas e verbosidade, porque eu pude ver quando o encaminhamento começou a funcionar, mas que os pacotes não estavam sendo retornados para o roteador; eles estavam sendo devolvidos ao laptop que estava tentando encaminhar mensagens pelo roteador. Eu também pude ver que erros de soma de verificação estavam ocorrendo - isso foi totalmente inesperado.
Eu leio muitos posts conflitantes, cada um com "isso funciona para mim", mas eles não funcionaram para mim. Um problema era que as regras do iptables aparentemente são dependentes do sistema operacional; Estou usando o Debian e isso mudou para quem sabe o porquê. Eu nunca consegui encontrar uma explicação completa de como construir regras de iptables, apenas alguns exemplos.
Felicidades.