Tendo problemas com pacotes que não estão no Fedora 16 Apache [closed]

2

Antecedentes: Eu não fiz nada com iptables em alguns anos ... Eu tenho o Fedora 16 rodando em uma VM no VMWare, com o redirecionamento de porta do meu firewall (TomatoUSB) para a VM.

A VM está em 192.168.1.155 . Eu sei que os pacotes estão chegando na VM ...

Baseado em esta ilustração para ver como os pacotes devem ir , Eu esperaria que os pacotes saíssem de nat-PREROUTING e iriam para mangle-INPUT ou mangle-FORWARD , a menos que o kernel os esteja soltando por algum outro motivo.

Por isso, liguei alguns registos:

iptables -t mangle -v -A PREROUTING -j LOG -p tcp --destination-port 80 --log-prefix 'mangle-PREROUTING '
iptables -t nat -v -A PREROUTING -j LOG -p tcp --destination-port 80 --log-prefix 'nat-PREROUTING '
iptables -t filter -v -I INPUT 1 -j LOG -p tcp --destination-port 80 --log-prefix 'filter-INPUT '
iptables -t filter -v -I FORWARD 1 -j LOG -p tcp --destination-port 80 --log-prefix 'filter-FORWARD '
iptables -t mangle -v -I INPUT 1 -j LOG -p tcp --destination-port 80 --log-prefix 'mangle-INPUT ' 
iptables -t mangle -v -I FORWARD 1 -j LOG -p tcp --destination-port 80 --log-prefix 'mangle-FORWARD '

e, em seguida, usei um serviço de teste externo e posso ver os pacotes chegando em PREROUTING chains, mas então sendo ignorado:

Apr 23 19:11:52 webmail64 kernel: [  351.116042] mangle-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20466 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0 
Apr 23 19:11:52 webmail64 kernel: [  351.121701] nat-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20466 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0 
Apr 23 19:11:55 webmail64 kernel: [  354.113372] mangle-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20467 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0 
Apr 23 19:11:55 webmail64 kernel: [  354.114834] nat-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20467 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0 
Apr 23 19:12:01 webmail64 kernel: [  360.109534] mangle-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20468 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0 
Apr 23 19:12:01 webmail64 kernel: [  360.111023] nat-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20468 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0 

Você pode ver que TTL está bem. O IP da VM é 192.168.1.155 , por isso, deve ir para INPUT a seguir, mas isso nunca acontece. Se o pacote veio de dentro da minha rede, é como esperado:

Apr 23 19:20:03 webmail64 kernel: [  841.725402] mangle-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4562 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK FIN URGP=0 
Apr 23 19:20:03 webmail64 kernel: [  841.729647] mangle-INPUT IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4562 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK FIN URGP=0 
Apr 23 19:20:03 webmail64 kernel: [  841.731056] filter-INPUT IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4562 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK FIN URGP=0 
Apr 23 19:20:03 webmail64 kernel: [  841.732784] mangle-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4563 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK URGP=0 
Apr 23 19:20:03 webmail64 kernel: [  841.734257] mangle-INPUT IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4563 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK URGP=0 
Apr 23 19:20:03 webmail64 kernel: [  841.735676] filter-INPUT IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4563 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK URGP=0 

O que eu tentei?

  • Desativado o SELinux
  • Totalmente desativado iptables
  • Assegure-se de que as políticas padrão sejam ACCEPT
    • Vimos que o pacote conta para o ACCEPT incrementado
  • Ativou o encaminhamento de IP ( /proc/sys/net/ipv4/ip_forward ) apenas no caso

Minha configuração:  * kernel = Linux webmail64 3.3.2-1.fc16.x86_64 #1 SMP Sat Apr 14 00:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux  * iptables v1.4.12

Aqui estão todos os iptables caso isso seja importante:

[root@webmail64 ~]# iptables-save 
# Generated by iptables-save v1.4.12 on Mon Apr 23 20:47:24 2012
*nat
:PREROUTING ACCEPT [916:127527]
:INPUT ACCEPT [1:60]
:OUTPUT ACCEPT [87:7857]
:POSTROUTING ACCEPT [87:7857]
-A PREROUTING -p tcp -m tcp --dport 80 -j LOG --log-prefix "nat-PREROUTING "
COMMIT
# Completed on Mon Apr 23 20:47:24 2012
# Generated by iptables-save v1.4.12 on Mon Apr 23 20:47:24 2012
*mangle
:PREROUTING ACCEPT [1402:193108]
:INPUT ACCEPT [1343:189856]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [303:67789]
:POSTROUTING ACCEPT [303:67789]
-A PREROUTING -p tcp -m tcp --dport 80 -j LOG --log-prefix "mangle-PREROUTING "
-A INPUT -p tcp -m tcp --dport 80 -j LOG --log-prefix "mangle-INPUT "
-A FORWARD -p tcp -m tcp --dport 80 -j LOG --log-prefix "mangle-FORWARD "
COMMIT
# Completed on Mon Apr 23 20:47:24 2012
# Generated by iptables-save v1.4.12 on Mon Apr 23 20:47:24 2012
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1075:220262]
-A INPUT -p tcp -m tcp --dport 80 -j LOG --log-prefix "filter-INPUT "
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -p tcp -m tcp --dport 80 -j LOG --log-prefix "filter-FORWARD "
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Mon Apr 23 20:47:24 2012

Onde posso ver a seguir?

Atualizar

Fui solicitado a executar tcpdump e parece que nunca estou enviando ACK pacotes?:

tcpdump -i eth1 -An -vvv \(net 50 or net 173\)
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
19:31:26.305048 IP (tos 0x20, ttl 53, id 26094, offset 0, flags [DF], proto TCP (6), length 60)
    50.22.90.226.48891 > 192.168.1.155.http: Flags [S], cksum 0xca12 (correct), seq 2918539684, win 5840, options [mss 1460,sackOK,TS val 1152517194 ecr 0,nop,wscale 7], length 0
E .<[email protected]....................
D..J........
19:31:26.521815 IP (tos 0x20, ttl 53, id 61033, offset 0, flags [DF], proto TCP (6), length 60)
    50.22.90.226.48892 > 192.168.1.155.http: Flags [S], cksum 0x82b4 (correct), seq 1826089481, win 5840, options [mss 1460,sackOK,TS val 1152517216 ecr 0,nop,wscale 7], length 0
E .<[email protected]..     ...................
D..'........
19:31:29.300994 IP (tos 0x20, ttl 53, id 26095, offset 0, flags [DF], proto TCP (6), length 60)
    50.22.90.226.48891 > 192.168.1.155.http: Flags [S], cksum 0xc8e6 (correct), seq 2918539684, win 5840, options [mss 1460,sackOK,TS val 1152517494 ecr 0,nop,wscale 7], length 0
E .<[email protected]....................
D..v........
19:31:29.521214 IP (tos 0x20, ttl 53, id 61034, offset 0, flags [DF], proto TCP (6), length 60)
    50.22.90.226.48892 > 192.168.1.155.http: Flags [S], cksum 0x8188 (correct), seq 1826089481, win 5840, options [mss 1460,sackOK,TS val 1152517516 ecr 0,nop,wscale 7], length 0
E .<[email protected]..     ...................
D...........
19:31:35.302578 IP (tos 0x20, ttl 53, id 26096, offset 0, flags [DF], proto TCP (6), length 60)
    50.22.90.226.48891 > 192.168.1.155.http: Flags [S], cksum 0xc68e (correct), seq 2918539684, win 5840, options [mss 1460,sackOK,TS val 1152518094 ecr 0,nop,wscale 7], length 0
E .<[email protected]....................
D...........
19:31:35.532347 IP (tos 0x20, ttl 53, id 61035, offset 0, flags [DF], proto TCP (6), length 60)
    50.22.90.226.48892 > 192.168.1.155.http: Flags [S], cksum 0x7f2f (correct), seq 1826089481, win 5840, options [mss 1460,sackOK,TS val 1152518117 ecr 0,nop,wscale 7], length 0
E .<[email protected]..     ........./.........
D...........
    
por Aaron D. Marasco 24.04.2012 / 01:27

2 respostas

1

Eu sei que isso é um pouco tarde, no entanto ... O host sabe é responsável por esse IP? Aqui está um esquema que eu coloco no topo dos arquivos de regras que eu crio. Você pode encontrar diagramas de fluxo semelhantes em outro lugar, mas tê-lo em ASCII (não gostaria de chamar de arte;)) pode ser bastante útil no terminal.

Na maior parte eu sei disso de coração, mas hey, não faz mal ter uma referência se o esquecimento ataca.

###############################################################################
###
###            PACKET FLOW THROUGH NETFILTER TABLES AND CHAINS
###
###
###                          {Packet in}
###                               |
###                               v
###                       +-----------------+
###                       |mangle/PREROUTING|
###                       +-----------------+
###                               |
###                               v
###                       +-----------------+
###                       |  nat/PREROUTING |
###                       +-----------------+
###                               |
###                               v
###                       *~~~~~~~~~~~~~~~~~*
###                       |  kernel routing |
###                       *~~~~~~~~~~~~~~~~~*
###                               |
###                               v
###           .------------{?for this host?}------------.
###      yes! |                                         | no!
###           v                                         v
###  +-----------------+                       +-----------------+
###  |   mangle/INPUT  |                       |  mangle/FORWARD |
###  +-----------------+                       +-----------------+
###           |                                         |
###           v                                         v
###  +-----------------+                       +-----------------+
###  |   filter/INPUT  |                       |  filter/FORWARD |
###  +-----------------+                       +-----------------+
###           |                                         |
###           v                                         |
### *~~~~~~~~~~~~~~~~~~~~*                              |
### | response & routing |                              |
### *~~~~~~~~~~~~~~~~~~~~*                              |
###           |                                         |
###           v                                         |
###  +-----------------+                                |
###  |  mangle/OUTPUT  |                                |
###  +-----------------+                                |
###           |                                         |
###           v                                         |
###  +-----------------+                                |
###  |    nat/OUTPUT   |                                |
###  +-----------------+                                |
###           |                                         |
###           v                                         |
###  +-----------------+                                |
###  |  filter/OUTPUT  |                                |
###  +-----------------+                                |
###           |                                         |
###           .-------------------+---------------------.
###                               |
###                               v
###                      +------------------+
###                      |mangle/POSTROUTING|
###                      +------------------+
###                               |
###                               v
###                      +------------------+
###                      |  nat/POSTROUTING |
###                      +------------------+
###                               |
###                               v
###                          {Packet out}
###
###############################################################################

Agora, o que isso significa?

O roteamento pode acontecer usando a tabela de roteamento ("roteamento de kernel" no fluxograma acima) ou usando o netfilter. Agora, se - e esse é o cenário mais provável no seu caso - você não configurou a tabela de roteamento de acordo, o kernel não saberia onde o pacote deve ir e, eventualmente, descartá-lo. Btw: em tais casos, é útil criar uma cadeia personalizada que LOG e DROP ou adicione as regras nessa ordem. Desta forma, você verá quais regras foram atingidas. Também é útil iptables-save -c , que irá preceder os contadores de pacotes e bytes para cada linha de regra, semelhante à forma como ela é anexada às cadeias (formato [packets:bytes] ).

Para portas encaminhadas para uma VM via DNAT , tenho a seguinte receita (explicarei abaixo):

#!/bin/bash
VMNET=192.168.1.0/24
MAINIP=66.249.67.195
CONTIP=192.168.1.2
VMPORT=80
INPORT=80
ACTION="-I"
iptables -t nat    $ACTION PREROUTING  -d $MAINIP -p tcp --dport $INPORT -j DNAT --to-destination $CONTIP:$VMPORT
iptables -t nat    $ACTION POSTROUTING -s $VMNET ! -d $VMNET -p tcp -j MASQUERADE --to-ports 1024-65535
iptables -t nat    $ACTION POSTROUTING -s $VMNET ! -d $VMNET -p udp -j MASQUERADE --to-ports 1024-65535
iptables -t nat    $ACTION POSTROUTING -s $VMNET ! -d $VMNET -j MASQUERADE
iptables -t filter $ACTION INPUT       -p tcp -d $MAINIP --dport $INPORT -j ACCEPT
iptables -t filter $ACTION FORWARD     -p tcp --dport $INPORT -d $VMNET -j ACCEPT
iptables -t filter $ACTION FORWARD     -p tcp --dport $INPORT -d $MAINIP -j ACCEPT

Lembre-se de que você pode querer alterar a ordem para se adequar às regras com a sua. Além disso, se a cadeia OUTPUT não tiver ACCEPT como sua política padrão, adicione uma regra de saída, embora, para todos os fins práticos, isso deva ser fornecido com uma regra de estado RELATED,ESTABLISHED . Você também pode refinar as interfaces para corresponder ou corresponder por curinga. Por exemplo, eu forneci às pontes de meus convidados virtuais todo o prefixo _ (um sublinhado) e, portanto, posso corresponder a -i _+ e -o _+ . Da mesma forma, para várias placas de rede ( eth0 , eth1 ) você corresponderia a -i eth+ .

Então, o que acontece aqui é que:

  1. uma regra DNAT é inserida, recebendo entrada na porta (host) $INPORT para o TCP e "encaminhando" para $CONTIP:$VMPORT , ou seja, o IP do contêiner e a porta no contêiner. Sim, eles poderiam diferir. Se não, não há problema em deixar de fora a parte de destino (ou seja, apenas '' $ CONTIP '').
  2. três regras para mascarar o tráfego que é da sub-rede dos convidados virtuais, mas não para outro convidado virtual.
  3. uma regra INPUT para permitir pacotes de entrada no IP público (sem interface dada, mas poderia ser!) para a porta $INPORT through. Eu acho que esta regra não é estritamente necessária, pelo menos não se você amarrá-lo à interface pública.
  4. uma regra para encaminhar tráfego para $INPORT para a sub-rede virtual convidada ( $VMNET )
  5. uma regra para encaminhar tráfego para $INPORT no IP público ( $MAINIP )

Por último, mas não menos importante, o valor de sysctl ( /proc/sys/net/ipv4/ip_forward ) deve ser:

# cat /proc/sys/net/ipv4/ip_forward
1

para tornar seu host um roteador.

Se não for usado echo 1 para escrever no "arquivo" acima, em procfs , ou melhor ainda, usar sysctl -w net.ipv4.ip_forward=1 as root .

    
por 12.06.2014 / 03:14
0

Eu ainda não sei porque , mas consegui que funcionasse.

Eu tinha duas interfaces, eth0 (192.168.99.x) e eth1 (192.168.1.x). Eles estavam lá por razões de legado, eu era preguiçoso quando queria uma nova VM e copiei a minha anterior. De qualquer forma, eu simplesmente desabilitei eth0 e tudo funcionou.

Eu verifiquei algumas das configurações de rp_filter em /etc/sysctl.conf , mas isso não resolveu (mas me fez pensar que era um problema estranho no FI). As configurações estão documentadas em /usr/share/doc/kernel-doc-x.x.x/Documentation/networking/ip-sysctl.txt no pacote kernel-doc .

Então funciona agora, e vou deixar isso aqui para os mecanismos de busca encontrarem e talvez isso ajude alguém mais algum dia.

    
por 26.04.2012 / 04:27