Jak utworzyć / skonfigurować VPN przy użyciu tylko SSH?


9

Oto problem, który próbuję rozwiązać. Istnieje serwer („system zdalny”), do którego mogę ssh z mojego komputera lokalnego, ale ten zdalny system nie ma połączenia z Internetem. Chcę zapewnić zdalnemu systemowi dostęp do Internetu za pośrednictwem lokalnego komputera za pomocą sieci VPN opartej na ssh. Jak to osiągnąć? Próbowałem następujących, które wydają się częściowo działać. Rozumiem przez „częściową pracę”, że pakiety połączenia (pakiety synchronizacji) są wysyłane na mój komputer lokalny, ale nie nawiązują połączenia z Internetem. Używam tcpdump do przechwytywania pakietów na komputerze lokalnym. Komputer lokalny i system zdalny działają w systemie centos 7.

Konfiguracja - Uwaga: poniższe polecenia są uruchamiane w kolejności. Polecenia użytkownika @ zdalne są uruchamiane na serwerze zdalnym, a polecenia użytkownika @ lokalne są uruchamiane na komputerze lokalnym.

[user @ remote ~] $ ip addr show
1: lo: mtu 65536 qdisc stan noqueue NIEZNANY 
    link / loopback 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00
    inet 127.0.0.1/8 zakres host lo
       valid_lft na zawsze preferowany_lft na zawsze
    Host inet6 :: 1/128 
       valid_lft na zawsze preferowany_lft na zawsze
2: eth0: mtu 1500 qdisc pfifo_fast stan UP qlen 1000
    link / ether AA: BB: CC: DD: EE: FF brd ff: ff: ff: ff: ff: ff
    inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255 zakres globalny dynamiczny eth0
       valid_lft 1785sec preferowany_lft 1785sec
    inet6 EEEE: FFFF: GGGG: HHHH: IIII: JJJJ: KKKK: zakres LLLL / 64 globalny noprefixroute dynamic 
       valid_lft 2591987sec prefer_lft 604787sec
    inet6 ABCD :: IIII: JJJJ: KKKK: LLLL / 64 link do zakresu 
       valid_lft na zawsze preferowany_lft na zawsze
[użytkownik @ lokalny ~] $ ip addr show
1: lo: mtu 65536 qdisc stan noqueue NIEZNANY 
    link / loopback 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00
    inet 127.0.0.1/8 zakres host lo
       valid_lft na zawsze preferowany_lft na zawsze
    Host inet6 :: 1/128 
       valid_lft na zawsze preferowany_lft na zawsze
2: eth0: mtu 1500 qdisc pfifo_fast stan UP qlen 1000
    link / ether AA: BB: CC: DD: EE: FF brd ff: ff: ff: ff: ff: ff
    inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255 zakres globalny dynamiczny eth0
       valid_lft 1785sec preferowany_lft 1785sec
    inet6 EEEE: FFFF: GGGG: HHHH: IIII: JJJJ: KKKK: zakres LLLL / 64 globalny noprefixroute dynamic 
       valid_lft 2591987sec prefer_lft 604787sec
    inet6 ABCD :: IIII: JJJJ: KKKK: LLLL / 64 link do zakresu 
       valid_lft na zawsze preferowany_lft na zawsze

Utwórz interfejs tun0 na zdalnym systemie.

[user @ remote ~] $ sudo ip tuntap dodaj tryb tun0 tun
[user @ remote ~] $ ip addr show
1: lo: mtu 65536 qdisc stan noqueue NIEZNANY 
    link / loopback 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00
    inet 127.0.0.1/8 zakres host lo
       valid_lft na zawsze preferowany_lft na zawsze
    Host inet6 :: 1/128 
       valid_lft na zawsze preferowany_lft na zawsze
2: eth0: mtu 1500 qdisc pfifo_fast stan UP qlen 1000
    link / ether AA: BB: CC: DD: EE: FF brd ff: ff: ff: ff: ff: ff
    inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255 zakres globalny dynamiczny eth0
       valid_lft 1785sec preferowany_lft 1785sec
    inet6 EEEE: FFFF: GGGG: HHHH: IIII: JJJJ: KKKK: zakres LLLL / 64 globalny noprefixroute dynamic 
       valid_lft 2591987sec prefer_lft 604787sec
    inet6 ABCD :: IIII: JJJJ: KKKK: LLLL / 64 link do zakresu 
       valid_lft na zawsze preferowany_lft na zawsze
3: tun0: mtu 1500 qdisc stan noop W DÓŁ qlen 500
    link / none 

Utwórz interfejs tun0 w systemie lokalnym .

[użytkownik @ lokalny ~] $ sudo ip tuntap dodaj tryb tun0 tun
[użytkownik @ lokalny ~] $ ip addr show
1: lo: mtu 65536 qdisc stan noqueue NIEZNANY 
    link / loopback 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00
    inet 127.0.0.1/8 zakres host lo
       valid_lft na zawsze preferowany_lft na zawsze
    Host inet6 :: 1/128 
       valid_lft na zawsze preferowany_lft na zawsze
2: eth0: mtu 1500 qdisc pfifo_fast stan UP qlen 1000
    link / ether AA: BB: CC: DD: EE: FF brd ff: ff: ff: ff: ff: ff
    inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255 zakres globalny dynamiczny eth0
       valid_lft 1785sec preferowany_lft 1785sec
    inet6 EEEE: FFFF: GGGG: HHHH: IIII: JJJJ: KKKK: zakres LLLL / 64 globalny noprefixroute dynamic 
       valid_lft 2591987sec prefer_lft 604787sec
    inet6 ABCD :: IIII: JJJJ: KKKK: LLLL / 64 link do zakresu 
       valid_lft na zawsze preferowany_lft na zawsze
3: tun0: mtu 1500 qdisc stan noop W DÓŁ qlen 500
    link / none

Przypisz adres IP tun0 i wyświetl go:

[użytkownik @ lokalny ~] $ sudo ip addr add 10.0.2.1/30 dev tun0
[użytkownik @ lokalny ~] $ sudo ip link set dev tun0 up
[użytkownik @ lokalny ~] $ ip addr show tun0
3: tun0: mtu 1500 qdisc pfifo_fast stan W DÓŁ qlen 500
    link / none 
    inet 10.0.2.1/30 zakres globalny tun0
       valid_lft na zawsze preferowany_lft na zawsze
[user @ remote ~] $ sudo ip addr add 10.0.2.2/30 dev tun0
[user @ remote ~] $ sudo ip link set dev tun0 up
[użytkownik @ zdalny ~] $ ip addr show tun0
3: tun0: mtu 1500 qdisc pfifo_fast stan W DÓŁ qlen 500
    link / none 
    inet 10.0.2.2/30 zakres globalny tun0
       valid_lft na zawsze preferowany_lft na zawsze

Zmodyfikuj sshd_config zarówno w systemie zdalnym, jak i lokalnym, aby włączyć tunelowanie:

[użytkownik @ zdalny ~] $ sudo grep PermitTunnel / etc / ssh / sshd_config 
PermitTunnel punkt-punkt
[użytkownik @ lokalny ~] $ sudo grep PermitTunnel / etc / ssh / sshd_config 
PermitTunnel punkt-punkt

Utwórz tunel ssh:

[użytkownik @ lokalny ~] $ sudo ssh -f -w0: 0 root @ remote true
root @ hasło zdalnego: 
[użytkownik @ lokalny ~] $ ps aux | grep root @ remote
korzeń 1851 0,0 0,0 76112 1348? Ss 23:12 0:00 ssh -f -w0: 0 root @ remote true

Przetestuj ping na obu serwerach, używając nowych adresów IP:

[użytkownik @ lokalny ~] $ ping 10.0.2.2 -c 2
PING 10.0.2.2 (10.0.2.2) 56 (84) bajtów danych.
64 bajty od 10.0.2.2: icmp_seq = 1 ttl = 64 czas = 1,68 ms
64 bajty od 10.0.2.2: icmp_seq = 2 ttl = 64 czas = 0,861 ms

--- 10.0.2.2 statystyki ping ---
2 pakiety przesłane, 2 odebrane, 0% utraty pakietu, czas 1002 ms
rtt min / avg / max / mdev = 0,861 / 1,274 / 1,688 / 0,415 ms
[użytkownik @ zdalny ~] $ ping 10.0.2.1 -c 2
PING 10.0.2.1 (10.0.2.1) 56 (84) bajtów danych.
64 bajty od 10.0.2.1: icmp_seq = 1 ttl = 64 czas = 0,589 ms
64 bajty od 10.0.2.1: icmp_seq = 2 ttl = 64 czas = 0,889 ms

--- 10.0.2.1 statystyki ping ---
2 pakiety przesłane, 2 odebrane, 0% utraty pakietu, czas 1000ms
rtt min / avg / max / mdev = 0,589 / 0,739 / 0,889 / 0,150 ms
[użytkownik @ zdalny ~] $ route
Tabela routingu IP jądra
Brama docelowa Genmask Flagi Metryka Ref Użyj Iface
brama domyślna 0.0.0.0 UG 100 0 0 eth0
10.0.2.0 0.0.0.0 255.255.255.252 U 0 0 0 tun0
AAA.BBB.CCC.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[user @ remote ~] $ ip show route
domyślnie przez AAA.BBB.CCC.1 dev eth0 proto static metric 100 
10.0.2.0/30 dev tun0 proto link do zakresu jądra src 10.0.2.2 
AAA.BBB.CCC.0 / 24 dev eth0 proto link zakresu jądra src AAA.BBB.CCC.31 metryczny 100 

Uzyskaj adresy IP Google:

[użytkownik @ lokalny ~] $ nslookup google.com
Serwer: serwer
Adres: serwer nr 53

Odpowiedź nieautorytatywna:
Nazwa: google.com
Adres: 173.194.219.101
Nazwa: google.com
Adres: 173.194.219.100
Nazwa: google.com
Adres: 173.194.219.113
Nazwa: google.com
Adres: 173.194.219.102
Nazwa: google.com
Adres: 173.194.219.139
Nazwa: google.com
Adres: 173.194.219.138

WAŻNE: Uruchomiłem powyższe polecenie w innym czasie i uzyskałem inny wynik. Nie zakładaj, że twoja odpowiedź będzie taka sama jak moja dla nslookup powyżej.

Ponieważ wszystkie adresy IP Google zaczynają się od 173.194.219, pozwól nam przekierować wszystkie te adresy IP przez komputer lokalny.

[użytkownik @ zdalny ~] $ sudo ip route add 173.194.219.0/24 dev tun0
[użytkownik @ zdalny ~] $ route
Tabela routingu IP jądra
Brama docelowa Genmask Flagi Metryka Ref Użyj Iface
brama domyślna 0.0.0.0 UG 100 0 0 eth0
10.0.2.0 0.0.0.0 255.255.255.252 U 0 0 0 tun0
AAA.BBB.CCC.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
173.194.219.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
[user @ remote ~] $ ip show route
domyślnie przez AAA.BBB.CCC.1 dev eth0 proto static metric 100 
10.0.2.0/30 dev tun0 proto link do zakresu jądra src 10.0.2.2 
AAA.BBB.CCC.0 / 24 dev eth0 proto link zakresu jądra src AAA.BBB.CCC.31 metryczny 100 
173.194.219.0/24 dev tun0 link do zakresu 

Włącz ip_forwarding:

[użytkownik @ lokalny ~] $ grep ip_forward /etc/sysctl.conf 
net.ipv4.ip_forward = 1
[użytkownik @ lokalny ~] $ sudo restart sieci
Ponowne uruchamianie sieci (przez systemctl): [OK]

Skonfiguruj przechwytywanie pakietów na komputerze lokalnym za pomocą tcpdump:

[użytkownik @ lokalny ~] $ sudo tcpdump -nn -vv 'port nie 22' -i dowolny
tcpdump: nasłuchuje na dowolnym LINUX_SLL typu linuksowego (Linux gotowy), przechwytuje rozmiar 65535 bajtów

Spróbuj połączyć się z Google ze zdalnego serwera.

[użytkownik @ zdalny ~] $ openssl s_client -connect google.com:443
gniazdo: Brak trasy do hosta
połącz: errno = 113

Gdy tylko komenda openssl zostanie uruchomiona na zdalnym serwerze, tcpdump przechwytuje niektóre pakiety:

    10.0.2.2.52768> 173.194.219.102.443: Flagi [S], cksum 0x8702 (poprawnie), seq 994650730, win 29200, opcje [mss 1460, sackOK, TS val 7701438 ecr 0, nop, wscale 7], długość 0
00: 49: 33.247753 IP (tos 0x0, tl 64, id 46037, przesunięcie 0, flagi [DF], proto TCP (6), długość 60)
    10.0.2.2.48774> 173.194.219.100.443: Flagi [S], cksum 0x47a7 (poprawnie), seq 2218733674, win 29200, opcje [mss 1460, sackOK, TS val 7701439 ecr 0, nop, wscale 7], długość 0
00: 49: 33.247883 IP (tos 0xc0, tl 64, id 9538, przesunięcie 0, flagi [brak], proto ICMP (1), długość 88)
    10.0.2.1> 10.0.2.2: Host ICMP 173.194.219.100 nieosiągalny - administrator zabroniony, długość 68
    IP (tos 0x0, tl 63, id 46037, offset 0, flagi [DF], proto TCP (6), długość 60)
    10.0.2.2.48774> 173.194.219.100.443: Flagi [S], cksum 0x47a7 (poprawnie), seq 2218733674, win 29200, opcje [mss 1460, sackOK, TS val 7701439 ecr 0, nop, wscale 7], długość 0
00: 49: 33.253068 IP (tos 0x0, tl 64, id 26282, przesunięcie 0, flagi [DF], proto TCP (6), długość 60)
    10.0.2.2.51312> 173.194.219.101.443: Flagi [S], cksum 0x6ff8 (poprawnie), seq 2634016105, win 29200, opcje [mss 1460, sackOK, TS val 7701443 ecr 0, nop, wscale 7], długość 0
00: 49: 33.254771 IP (tos 0xc0, ttl 64, id 9539, offset 0, flagi [brak], proto ICMP (1), długość 88)
    10.0.2.1> 10.0.2.2: Host ICMP 173.194.219.101 nieosiągalny - administrator zabroniony, długość 68
    IP (tos 0x0, tl 63, id 26282, offset 0, flagi [DF], proto TCP (6), długość 60)
    10.0.2.2.51312> 173.194.219.101.443: Flagi [S], cksum 0x6ff8 (poprawnie), seq 2634016105, win 29200, opcje [mss 1460, sackOK, TS val 7701443 ecr 0, nop, wscale 7], długość 0
00: 49: 33.258805 IP (tos 0x0, tl 64, id 9293, przesunięcie 0, flagi [DF], proto TCP (6), długość 60)
    10.0.2.2.33686> 173.194.219.139.443: Flagi [S], cksum 0x542b (poprawnie), seq 995927943, win 29200, opcje [mss 1460, sackOK, TS val 7701450 ecr 0, nop, wscale 7], długość 0
00: 49: 33.258845 IP (tos 0xc0, tl 64, id 9540, przesunięcie 0, flagi [brak], proto ICMP (1), długość 88)
    10.0.2.1> 10.0.2.2: Host ICMP 173.194.219.139 nieosiągalny - administrator zabroniony, długość 68
    IP (tos 0x0, tl 63, id 9293, offset 0, flagi [DF], proto TCP (6), długość 60)
    10.0.2.2.33686> 173.194.219.139.443: Flagi [S], cksum 0x542b (poprawnie), seq 995927943, win 29200, opcje [mss 1460, sackOK, TS val 7701450 ecr 0, nop, wscale 7], długość 0
^ C
Przechwycono 13 pakietów
13 pakietów odebranych przez filtr
0 pakietów upuszczonych przez jądro

Pakiety przechwycone przy użyciu tcpdump sugerują, że podjęto próbę nawiązania połączenia (pakiety synchronizacji są wysyłane), ale nic nie jest odbierane. Jest też komunikat, 10.0.2.1 > 10.0.2.2: ICMP host 173.194.219.139 unreachable - admin prohibited, length 68który wydaje się sugerować problem.

Wszelkie sugestie dotyczące obejścia tego problemu? Czy istnieją iptable reguły, które należy dodać? Wszelkie problemy z zaporą ogniową (firewall-d?).


Uwaga nr 1 Dane
wyjściowe z iptables-save:

[użytkownik @ lokalny ~] $ sudo iptables -t nat -A POSTROUTING -s 10.0.2.2/32! -d 10.0.2.1/30 -j MASQUERADE -o eth0
[użytkownik @ lokalny ~] $ sudo iptables-save
# Wygenerowane przez iptables-save v1.4.21 w sob. 15 kwietnia 01:40:57 2017
* nat
: AKCEPTACJA WSTĘPNA [35: 8926]
: AKCEPTACJA WEJŚCIA [1:84]
: AKCEPTACJA WYJŚCIA [6: 439]
: AKCEPTACJA POSTROUTINGU [6: 439]
: OUTPUT_direct - [0: 0]
: POSTROUTING_ZONES - [0: 0]
: POSTROUTING_ZONES_SOURCE - [0: 0]
: POSTROUTING_direct - [0: 0]
: POST_public - [0: 0]
: POST_public_allow - [0: 0]
: POST_public_deny - [0: 0]
: POST_public_log - [0: 0]
: PREROUTING_ZONES - [0: 0]
: PREROUTING_ZONES_SOURCE - [0: 0]
: PREROUTING_direct - [0: 0]
: PRE_public - [0: 0]
: PRE_public_allow - [0: 0]
: PRE_public_deny - [0: 0]
: PRE_public_log - [0: 0]
-A PREROUTING -j PREROUTING_direct
-A PREROUTING -j PREROUTING_ZONES_SOURCE
-A PREROUTING -j PREROUTING_ZONES
-A WYJŚCIE -j OUTPUT_direct
-A POSTROUTING -j POSTROUTING_direct
-A POSTROUTING -j POSTROUTING_ZONES_SOURCE
-A POSTROUTING -j POSTROUTING_ZONES
-A POSTROUTOWANIE -s 10.0.2.2/32! -d 10.0.2.0/30 -j MASQUERADE
-A POSTROUTING_ZONES -o eth0 -g POST_public
-A POSTROUTING_ZONES -g POST_public
-A POST_public -j POST_public_log
-A POST_public -j POST_public_deny
-A POST_public -j POST_public_allow
-A PREROUTING_ZONES -i eth0 -g PRE_public
-A PREROUTING_ZONES -g PRE_public
-A PRE_public -j PRE_public_log
-A PRE_publiczna -j PRE_publiczna_deny
-A PRE_publiczny -j PRE_publiczny_allow
POPEŁNIĆ
# Ukończone sob 15 kwietnia 01:40:57 2017
# Wygenerowane przez iptables-save v1.4.21 w sob. 15 kwietnia 01:40:57 2017
*magiel
: AKCEPTACJA WSTĘPNA [169: 18687]
: AKCEPTACJA WEJŚCIA [144: 11583]
: AKCEPTACJA DO PRZODU [0: 0]
: AKCEPTACJA WYJŚCIA [80: 8149]
: AKCEPTACJA POSTROUTINGU [80: 8149]
: FORWARD_direct - [0: 0]
: INPUT_direct - [0: 0]
: OUTPUT_direct - [0: 0]
: POSTROUTING_direct - [0: 0]
: PREROUTING_ZONES - [0: 0]
: PREROUTING_ZONES_SOURCE - [0: 0]
: PREROUTING_direct - [0: 0]
: PRE_public - [0: 0]
: PRE_public_allow - [0: 0]
: PRE_public_deny - [0: 0]
: PRE_public_log - [0: 0]
-A PREROUTING -j PREROUTING_direct
-A PREROUTING -j PREROUTING_ZONES_SOURCE
-A PREROUTING -j PREROUTING_ZONES
-A WEJŚCIE -j WEJŚCIE_dysk
-A DO PRZODU -j DO PRZODU_direct
-A WYJŚCIE -j OUTPUT_direct
-A POSTROUTING -j POSTROUTING_direct
-A PREROUTING_ZONES -i eth0 -g PRE_public
-A PREROUTING_ZONES -g PRE_public
-A PRE_public -j PRE_public_log
-A PRE_publiczna -j PRE_publiczna_deny
-A PRE_publiczny -j PRE_publiczny_allow
POPEŁNIĆ
# Ukończone sob 15 kwietnia 01:40:57 2017
# Wygenerowane przez iptables-save v1.4.21 w sob. 15 kwietnia 01:40:57 2017
*bezpieczeństwo
: AKCEPTACJA WEJŚCIA [2197: 163931]
: AKCEPTACJA DO PRZODU [0: 0]
: AKCEPTACJA WYJŚCIA [1229: 185742]
: FORWARD_direct - [0: 0]
: INPUT_direct - [0: 0]
: OUTPUT_direct - [0: 0]
-A WEJŚCIE -j WEJŚCIE_dysk
-A DO PRZODU -j DO PRZODU_direct
-A WYJŚCIE -j OUTPUT_direct
POPEŁNIĆ
# Ukończone sob 15 kwietnia 01:40:57 2017
# Wygenerowane przez iptables-save v1.4.21 w sob. 15 kwietnia 01:40:57 2017
*surowy
: AKCEPTACJA WSTĘPNA [2362: 184437]
: AKCEPTACJA WYJŚCIA [1229: 185742]
: OUTPUT_direct - [0: 0]
: PREROUTING_direct - [0: 0]
-A PREROUTING -j PREROUTING_direct
-A WYJŚCIE -j OUTPUT_direct
POPEŁNIĆ
# Ukończone sob 15 kwietnia 01:40:57 2017
# Wygenerowane przez iptables-save v1.4.21 w sob. 15 kwietnia 01:40:57 2017
*filtr
: AKCEPTACJA WEJŚCIA [0: 0]
: AKCEPTACJA DO PRZODU [0: 0]
: AKCEPTACJA WYJŚCIA [80: 8149]
: FORWARD_IN_ZONES - [0: 0]
: FORWARD_IN_ZONES_SOURCE - [0: 0]
: FORWARD_OUT_ZONES - [0: 0]
: FORWARD_OUT_ZONES_SOURCE - [0: 0]
: FORWARD_direct - [0: 0]
: FWDI_public - [0: 0]
: FWDI_public_allow - [0: 0]
: FWDI_public_deny - [0: 0]
: FWDI_public_log - [0: 0]
: FWDO_public - [0: 0]
: FWDO_public_allow - [0: 0]
: FWDO_public_deny - [0: 0]
: FWDO_public_log - [0: 0]
: INPUT_ZONES - [0: 0]
: INPUT_ZONES_SOURCE - [0: 0]
: INPUT_direct - [0: 0]
: IN_public - [0: 0]
: IN_public_allow - [0: 0]
: IN_public_deny - [0: 0]
: IN_public_log - [0: 0]
: OUTPUT_direct - [0: 0]
-A WEJŚCIE -m conntrack --ctstate POWIĄZANE, USTALONE -j AKCEPTUJ
-A WEJŚCIE -i lo -j AKCEPTUJĘ
-A WEJŚCIE -j WEJŚCIE_dysk
-A WEJŚCIE -j INPUT_ZONES_SOURCE
-A WEJŚCIE -j WEJŚCIE_ZONES
-A WEJŚCIE -m conntrack --ctstate NIEPRAWIDŁOWY -j DROP
-A WEJŚCIE -j ODRZUĆ --reject-with icmp-host-zabronione
-A DO PRZODU -m conntrack -ctstate POWIĄZANE, USTALONE -j AKCEPTUJĘ
-A DO PRZODU -i lo -j AKCEPTUJĘ
-A DO PRZODU -j DO PRZODU_direct
-A DO PRZODU -j FORWARD_IN_ZONES_SOURCE
-A DO PRZODU -j FORWARD_IN_ZONES
-A DO PRZODU -j FORWARD_OUT_ZONES_SOURCE
-A DO PRZODU -j FORWARD_OUT_ZONES
-A DO PRZODU -m conntrack --ctstate INVALID -j DROP
-A DO PRZODU -j ODRZUĆ -reject-with icmp-host-zabronione
-A WYJŚCIE -j OUTPUT_direct
-A FORWARD_IN_ZONES -i eth0 -g FWDI_public
-A FORWARD_IN_ZONES -g FWDI_public
-A FORWARD_OUT_ZONES -o eth0 -g FWDO_public
-A FORWARD_OUT_ZONES -g FWDO_public
-A FWDI_public -j FWDI_public_log
-A FWDI_public -j FWDI_public_deny
-A FWDI_public -j FWDI_public_allow
-A FWDI_public -p icmp -j AKCEPTUJ
-A FWDO_public -j FWDO_public_log
-A FWDO_public -j FWDO_public_deny
-A FWDO_public -j FWDO_public_allow
-A INPUT_ZONES -i eth0 -g IN_publiczna
-A INPUT_ZONES -g IN_publiczne
-A IN_publiczny -j IN_publiczny_log
-A IN_publiczne -j IN_publiczne_deny
-A IN_publiczny -j IN_publiczny_allow
-A IN_publiczna -p icmp -j AKCEPTUJ
-A IN_publiczny_allow -p tcp -m tcp --port 22 -m conntrack --ctstate NOWOŚĆ -j AKCEPTUJ
POPEŁNIĆ
# Ukończone sob 15 kwietnia 01:40:57 2017


Uwaga 2:
Instaluję serwer Apache na oddzielnym hoście, do którego ma dostęp tylko serwer lokalny. Uruchomiłem tcpdump na serwerze sieciowym nasłuchującym na porcie 80. Po uruchomieniu telnet webserver 80przechwytuję następujące pakiety. Jest to oczekiwane zachowanie od momentu ustanowienia połączenia TCP (S, S-Ack, Ack).

[user @ webserver ~] $ sudo tcpdump -nn -vv 'port nie 22 i 80' -i eth0 
tcpdump: nasłuch na eth0, typ łącza EN10MB (Ethernet), przechwytywanie rozmiaru 65535 bajtów
07: 17: 30.411474 IP (tos 0x10, tl 64, id 34376, przesunięcie 0, flagi [DF], proto TCP (6), długość 60)
    local.server.46710> web.server.80: Flagi [S], cksum 0x8412 (niepoprawne -> 0x6d96), seq 3018586542, win 29200, opcje [mss 1460, sackOK, TS val 3047398 ecr 0, nop, wscale 7] , długość 0
07: 17: 30.411557 IP (tos 0x0, tl 64, id 0, offset 0, flagi [DF], proto TCP (6), długość 60)
    web.server.80> local.server.46710: Flagi [S.], cksum 0x8412 (niepoprawne -> 0x9114), seq 2651711943, ack 3018586543, win 28960, opcje [mss 1460, sackOK, TS val 37704524 ecr 3047398, nop , wscale 7], długość 0
07: 17: 30.411725 IP (tos 0x10, tl 64, id 34377, przesunięcie 0, flagi [DF], proto TCP (6), długość 52)
    local.server.46710> web.server.80: Flags [.], cksum 0x840a (niepoprawny -> 0x301c), seq 1, ack 1, win 229, opcje [nop, nop, TS val 3047398 ecr 37704524], długość 0

Kiedy próbuję połączyć się z serwerem zdalnym z serwera zdalnego przez serwer lokalny, tcpdump na serwerze nie przechwytuje żadnych pakietów (nawet początkowej synchronizacji), ale serwer lokalny przechwytuje pakiet synchronizacji wysyłany do serwera (patrz poniżej). To sprawia, że ​​wierzę, że coś uniemożliwia wysyłanie pakietów do serwera WWW - być może błędna konfiguracja lub zapora ogniowa.

[użytkownik @ lokalny ~] $ sudo tcpdump -nn -vv 'port nie 22 i 80' -i dowolny
tcpdump: nasłuchuje na dowolnym LINUX_SLL typu linuksowego (Linux gotowy), przechwytuje rozmiar 65535 bajtów
02: 24: 09.135842 IP (tos 0x10, tl 64, id 38062, offset 0, flagi [DF], proto TCP (6), długość 60)
    10.0.2.2.50558> web.server.80: Flagi [S], cksum 0x668d (poprawnie), seq 69756226, win 29200, opcje [mss 1460, sackOK, TS val 4780524 ecr 0, nop, wscale 7], długość 0

WAŻNE: pakiety nie są kierowane przez eth0, ale zamiast tego podejmowana jest próba wysłania pakietów do serwera przez tun0 (co się nie powiedzie). Mogę to potwierdzić, uruchamiając tcpdump na interfejsie tun0:

[użytkownik @ lokalny ~] $ sudo tcpdump -nn -vv 'port nie 22 i 80' -i tun0
tcpdump: nasłuchuje na tun0, RAW typu link (Raw IP), przechwytuje rozmiar 65535 bajtów
02: 28: 10.295972 IP (tos 0x10, tl 64, id 46976, offset 0, flagi [DF], proto TCP (6), długość 60)
    10.0.2.2.50560> webserver.80: Flagi [S], cksum 0xd560 (poprawnie), seq 605366388, win 29200, opcje [mss 1460, sackOK, TS val 5021684 ecr 0, nop, wscale 7], długość 0


Uwaga 3:
Wyłączyłem firewalld na komputerze lokalnym i pakiety synchronizacji zostały odebrane przez serwer WWW.

[użytkownik @ lokalny ~] $ sudo systemctl stop firewalld
[user@webserver ~]$ sudo tcpdump -nn -vv 'port not 22 and 80' -i eth0
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
08:25:17.390912 IP (tos 0x10, ttl 63, id 61767, offset 0, flags [DF], proto TCP (6), length 60)
    10.0.2.2.50580 > web.server.80: Flags [S], cksum 0x30dc (correct), seq 2601927549, win 29200, options [mss 1460,sackOK,TS val 7123514 ecr 0,nop,wscale 7], length 0
08:25:17.391003 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
    web.server.80 > 10.0.2.2.50580: Flags [S.], cksum 0x4e23 (incorrect -> 0xa316), seq 959115533, ack 2601927550, win 28960, options [mss 1460,sackOK,TS val 41771503 ecr 7123514,nop,wscale 7], length 0
08:25:17.391192 IP (tos 0x0, ttl 128, id 60032, offset 0, flags [none], proto TCP (6), length 40)
    10.0.2.2.50580 > web.server.80: Flags [R], cksum 0x7339 (correct), seq 2601927550, win 8192, length 0
08:25:18.393794 IP (tos 0x10, ttl 63, id 61768, offset 0, flags [DF], proto TCP (6), length 60)
    10.0.2.2.50580 > web.server.80: Flags [S], cksum 0x2cf1 (correct), seq 2601927549, win 29200, options [mss 1460,sackOK,TS val 7124517 ecr 0,nop,wscale 7], length 0
08:25:18.393898 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
    web.server.80 > 10.0.2.2.50580: Flags [S.], cksum 0x4e23 (incorrect -> 0x7e71), seq 974785773, ack 2601927550, win 28960, options [mss 1460,sackOK,TS val 41772506 ecr 7124517,nop,wscale 7], length 0
08:25:18.394003 IP (tos 0x0, ttl 128, id 60033, offset 0, flags [none], proto TCP (6), length 40)
    10.0.2.2.50580> web.server.80: Flagi [R], cksum 0x566a (poprawnie), sekw. 2601927550, wygrana 8192, długość 0

Oczywiście, źródłowy adres IP musi zostać zaktualizowany, aby pasował do adresu IP lokalnego serwera, zanim pakiet zostanie wysłany do serwera WWW. Jak sugerował @xin, NAT musi zostać skonfigurowany na serwerze lokalnym.


Uwaga # 4:
Kiedy próbuję połączyć się z serwerem internetowym, widzę, że liczba punktów dla reguły 9 wzrasta o 1 (jak pokazano poniżej).

[użytkownik @ lokalny ~] $ sudo iptables -nvL --line-numbers
..........
Chain FORWARD (polityka AKCEPTUJE 0 pakietów, 0 bajtów)
num pkts bajty target prot opt ​​w źródłowym źródle docelowym         
1 0 0 AKCEPTUJ wszystko - * * 0,0,0,0/0 0,0,0,0/0 ctstate POWIĄZANE, USTANOWIONE
2 0 0 AKCEPTUJ wszystko - lo * 0,0,0,0/0 0,0,0,0/0           
3 1 60 FORWARD_direct all - * * 0.0.0.0/0 0.0.0.0/0           
4 1 60 FORWARD_IN_ZONES_SOURCE wszystkie - * * 0.0.0.0/0 0.0.0.0/0           
5 1 60 FORWARD_IN_ZONES wszystkie - * * 0,0,0,0/0 0,0,0,0/0           
6 1 60 FORWARD_OUT_ZONES_SOURCE wszystkie - * * 0.0.0.0/0 0.0.0.0/0           
7 1 60 FORWARD_OUT_ZONES wszystkie - * * 0,0,0,0/0 0,0,0,0/0           
8 0 0 DROP all - * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
9 1 60 ODRZUĆ wszystko - * * 0.0.0.0/0 0.0.0.0/0 odrzucenie z icmp-host-zabronione
..........
[użytkownik @ lokalny ~] $ sudo iptables -D DO PRZODU 9

Po usunięciu reguły 9 z łańcucha FORWARD (z góry, jak sugerował @xin), mogę połączyć się z serwerem internetowym.

[użytkownik @ lokalny ~] $ sudo iptables -nvL --line-numbers
..........
Chain FORWARD (polityka AKCEPTUJE 1 pakiety, 60 bajtów)
num pkts bajty target prot opt ​​w źródłowym źródle docelowym         
1 12 5857 AKCEPTUJ wszystko - * * 0,0,0,0/0 0,0,0,0/0 ctstate POWIĄZANE, USTANOWIONE
2 0 0 AKCEPTUJ wszystko - lo * 0,0,0,0/0 0,0,0,0/0           
3 2 120 FORWARD_direct all - * * 0.0.0.0/0 0.0.0.0/0           
4 2 120 FORWARD_IN_ZONES_SOURCE wszystkie - * * 0.0.0.0/0 0.0.0.0/0           
5 2 120 FORWARD_IN_ZONES wszystkie - * * 0,0,0,0/0 0,0,0,0/0           
6 2 120 FORWARD_OUT_ZONES_SOURCE wszystkie - * * 0.0.0.0/0 0.0.0.0/0           
7 2 120 FORWARD_OUT_ZONES wszystkie - * * 0,0,0,0/0 0,0,0,0/0           
8 0 0 DROP all - * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
..........

Odpowiedzi:


4

Adres źródłowy pakietów powinien zostać zastąpiony jednym z adresów komputera lokalnego, aby odpowiedzi mogły być odbierane przez komputer lokalny, w przeciwnym razie nie ma (dobrego) powodu do wysyłania tych pakietów do następnych routerów, odpowiedź i tak nie zostałaby złapana. iptables MASQUERADEi SNATsą przydatne do zmiany adresu źródłowego tych pakietów:

[user@local ~]$ iptables -t nat -A POSTROUTING -s 10.0.2.2/32 ! -d 10.0.2.1/30 -j MASQUERADE -o eth0

Dzięki za odpowiedź @xin. Uruchomiłem polecenie, które podałeś, ale wciąż otrzymałem tę samą odpowiedź. Uruchomiłem tcpdump na eth0 i tun0. pakiety nie są kierowane do eth0. tun0 wciąż próbuje dotrzeć do Google. Czy muszę jakoś przekierowywać pakiety z tun0 do eth0?
Ali,

1
Jeśli komputer lokalny używa interfejsu eth0 do łączenia się z Internetem, pakiety powinny przejść do eth0 nawet bez tego polecenia. Więc może niektóre ustawienia zapory są zaangażowane. Czy potrafisz umieścić iptables-savedane wyjściowe z lokalnej maszyny?
Reith

Dodałem wyjście z iptables-save do oryginalnego postu.
Ali,

Zapora ogniowa musiała zostać wyłączona. Uruchomiłem polecenie po wyłączeniu zapory ogniowej i połączenie zaczęło działać! Doceniam Twoją pomoc! Zamówienie Uwagi w oryginalnym poście, aby zobaczyć postępy.
Ali,

1
dobra robota. Wygląda na to, że problem jest regułą łatwą do przyjęcia -A FORWARD -j REJECT --reject-with icmp-host-prohibited. pakiety przychodzące do twojego komputera i posiadające adres docelowy poza nim, przejdą do łańcucha FORWARD, więc porzuć tę regułę.
Reith
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.