Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2019-02-05 11:35:01

  marpi82 - Nowy użytkownik

marpi82
Nowy użytkownik
Skąd: Tychy
Zarejestrowany: 2019-02-04

IPTABLES, przekierowanie portu - problem z uruchomieniem

Witam wszystkich.

Próbowałem podpiąć się pod temat o konfiguracji firewall'a ([url]https://forum.dug.net.pl/viewtopic.php?id=30822[/url]), ale a mam wrażenie, że mój post został nie zauważony. Jeśli jestem w błędzie bardzo przepraszam za otwarcie nowego tematu.

Mam problem z konfiguracją przekierowania portów. Od kilku dni próbuję się z tym uporać, ale nie wychodzi mi to zbyt dobrze - właściwie to w ogóle mi nie wychodzi :).

Z uwagi, że w mojej okolicy jedyna sensowna opcja dostępu do internetu to LTE, a co za tym idzie podwójny NAT zmuszony zostałem do zakupu VPS'a celem uruchomienia kilku usług które miały być dostępne z zewnątrz.
VPS jest na OpenVZ (najtańsza opcja ;]), na nim Debian 9 na standardowym w tej opcji kernelu 2.6.32.

VPS z moim domowym serwerkiem (dla uproszczenia będę pisać SRV) połączony jest tunelem OpenVPN.

Konfiguracja sieciowa wygląda tak:
VPS

Kod:

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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
       valid_lft forever preferred_lft forever
2: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/void
    inet 127.0.0.2/32 scope host venet0
    inet <publiczne_ip> brd <publiczne_ip> scope global venet0:0
       valid_lft forever preferred_lft forever
15: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
    link/none
    inet 10.0.0.1/24 brd 10.0.0.255 scope global tun0

SRV

Kod:

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 64:00:6a:92:c5:c6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.252/20 brd 192.168.15.255 scope global eno1
       valid_lft forever preferred_lft forever
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    link/none
    inet 10.0.0.2/24 brd 10.0.0.255 scope global tun0
       valid_lft forever preferred_lft forever

Tunel działa prawidłowo.
Działają pingi w obie strony i mogę połączyć się z ssh w jedną i w drugą stronę. Oczywiście z zewnątrz mogę połączyć się z SSH na VPS (jest na porcie 57185).


Jako pierwszą usługę chciałem przekierować SSH z SRV 10.0.0.2:22 na port VPS <publiczne_ip>:57186 by później kontynuować w podobny sposób z innymi - ale ugrzęzłem :/

Włączyłem net.ipv4.ip_forward w pliku /etc/sysctrl.conf

Z pomocą googla stworzyłem konfigurację firewalla i dodałem do niej moje przekierowanie portu

Kod:

# Tablica FILTER
*filter

# Pozwol na kazdy ruch na loopback (lo) i odrzuc wszysko
# do localhost co nie pochodzi z interfejsu lo.
-A INPUT   -i lo                -j ACCEPT
-A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT
-A OUTPUT  -o lo                -j ACCEPT

# Pozwol na ping i powrot bledow ICMP.
-A INPUT  -p icmp -m state --state NEW   --icmp-type 8 -j ACCEPT
-A INPUT  -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT

# Pozwol na ruch na porcie tcp 57185 (SSH).
-A INPUT  -p tcp -m state --state NEW,ESTABLISHED --dport 57185 -j ACCEPT
-A OUTPUT -p tcp -m state --state     ESTABLISHED --sport 57185 -j ACCEPT

# Pozwol na ruch na porcie tcp 57186 (SSH 10.0.0.2@tun0) na interfejsie VENET0.
-A INPUT  -i venet0 -p tcp -m state --state NEW,ESTABLISHED --dport 57186 -j ACCEPT
-A OUTPUT -o venet0 -p tcp -m state --state     ESTABLISHED --sport 57186 -j ACCEPT

# Pozwol na ruch UDP na portcie 1194 (OpenVPN) na interfejsie VENET0.
-A INPUT  -i venet0 -p udp -m state --state NEW,ESTABLISHED --dport 1194 -j ACCEPT
-A OUTPUT -o venet0 -p udp -m state --state     ESTABLISHED --sport 1194 -j ACCEPT

# Pozwol na rozwiazywanie nazw DNS
-A INPUT  -p udp -m state --state NEW,ESTABLISHED --dport 53 -j ACCEPT
-A INPUT  -p udp -m state --state     ESTABLISHED --sport 53 -j ACCEPT
-A OUTPUT -p udp -m state --state NEW,ESTABLISHED --dport 53 -j ACCEPT
-A OUTPUT -p udp -m state --state     ESTABLISHED --sport 53 -j ACCEPT

# Pozwol na ruch na portach HTTP/S
-A INPUT  -p tcp -m state --state NEW,ESTABLISHED --sport 80  -j ACCEPT
-A INPUT  -p tcp -m state --state NEW,ESTABLISHED --sport 443 -j ACCEPT
-A OUTPUT -p tcp -m state --state     ESTABLISHED --dport 80  -j ACCEPT
-A OUTPUT -p tcp -m state --state     ESTABLISHED --dport 443 -j ACCEPT

# Pozwol na ruch na interfejsie TUN (dla OpenVPN).
-A INPUT   -i tun+ -j ACCEPT
-A FORWARD -i tun+ -j ACCEPT
-A OUTPUT  -o tun+ -j ACCEPT

# Pozwol na ruch na interfejsie TAP (dla OpenVPN).
-A INPUT   -i tap+ -j ACCEPT
-A FORWARD -i tap+ -j ACCEPT
-A OUTPUT  -o tap+ -j ACCEPT

# Loguj wszystkie pakiety ktore nie spelniaja powyzszych zasad.
# (opcjonalne, ale przydatne)
-A INPUT   -m limit --limit 3/min -j LOG --log-prefix "iptables_INP_denied: " --log-level 4
-A FORWARD -m limit --limit 3/min -j LOG --log-prefix "iptables_FWD_denied: " --log-level 4
-A OUTPUT  -m limit --limit 3/min -j LOG --log-prefix "iptables_OUT_denied: " --log-level 4

# ...i odrzuc je.
-A INPUT   -j REJECT
-A FORWARD -j REJECT
-A OUTPUT  -j REJECT

COMMIT


# Tablica NAT
*nat

# Przekierowanie portu dla SSH na 10.0.0.2:22@tun0 na port 57186
-A PREROUTING -p tcp --dport 57186 -j DNAT --to-destination 10.0.0.2:22

# Maskarada dla ruchu z 10.0.0.0/24 do interfejsu VENET0
-A POSTROUTING -s 10.0.0.0/24 -o venet0 -j MASQUERADE

COMMIT

Tak to wygląda po zastosowaniu:

Kod:

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  loopback/8           anywhere             reject-with icmp-port-unreachable
ACCEPT     icmp --  anywhere             anywhere             state NEW icmp echo-request
ACCEPT     icmp --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             state NEW,ESTABLISHED tcp dpt:57185
ACCEPT     tcp  --  anywhere             anywhere             state NEW,ESTABLISHED tcp dpt:57186
ACCEPT     udp  --  anywhere             anywhere             state NEW,ESTABLISHED udp dpt:openvpn
ACCEPT     udp  --  anywhere             anywhere             state NEW,ESTABLISHED udp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             state ESTABLISHED udp spt:domain
ACCEPT     tcp  --  anywhere             anywhere             state NEW,ESTABLISHED tcp spt:http
ACCEPT     tcp  --  anywhere             anywhere             state NEW,ESTABLISHED tcp spt:https
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 5 LOG level warning prefix "iptables_INPUT_denied: "
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 5 LOG level warning prefix "iptables_FORWARD_denied: "
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere             state ESTABLISHED tcp spt:57185
ACCEPT     tcp  --  anywhere             anywhere             state ESTABLISHED tcp spt:57186
ACCEPT     udp  --  anywhere             anywhere             state ESTABLISHED udp spt:openvpn
ACCEPT     udp  --  anywhere             anywhere             state NEW,ESTABLISHED udp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             state ESTABLISHED udp spt:domain
ACCEPT     tcp  --  anywhere             anywhere             state ESTABLISHED tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             state ESTABLISHED tcp dpt:https
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 5 LOG level warning prefix "iptables_OUTPUT_denied: "
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  anywhere             anywhere             tcp dpt:57186 to:10.0.0.2:22

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  10.0.0.0/24          anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Niestety przekierowanie nie chce mi śmigać - nie da się połączyć z <publiczne_ip>:57186

Zastanowił mnie fakt, choć nie wiem, czy dobrze to interpretuję, że gdy wyzeruję liczniki iptables i próbuję połączyć się z <publiczne_ip>:57186 to, żaden pakiet nie jest przefiltrowany przez moją regułę POSTROUTING.
Wygląda to tak:

Kod:

# iptables -Z -t nat
# iptables -t nat -vL
Chain PREROUTING (policy ACCEPT 3 packets, 120 bytes)
 pkts bytes target     prot opt in     out     source               destination
    1    60 DNAT       tcp  --  any    any     anywhere             anywhere             tcp dpt:57186 to:10.0.0.2:22

Chain POSTROUTING (policy ACCEPT 3 packets, 194 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 MASQUERADE  all  --  any    any     10.0.0.0/24          anywhere

Chain OUTPUT (policy ACCEPT 2 packets, 134 bytes)
 pkts bytes target     prot opt in     out     source               destination

Jeśli ktoś byłby mi w stanie pomóc to byłbym bardzo wdzięczny.

Edit:
Dodałem jeszcze do firewall'a regułę

Kod:

-A FORWARD -i venet0 -o tun+ -j ACCEPT

z logów wywnioskowałem że były DROPy, ale nadal brak połączenia.

Edit2:
Zrobiłem sobie logowanie, dodałem do tablicy NAT:

Kod:

-A PREROUTING  -j LOG --log-prefix "iptables_PRR: "
-A POSTROUTING -j LOG --log-prefix "iptables_POR: "

Po przestudiowaniu togo co zaczęło mi wyrzucać:
w PREROUTING tylko dodałem interfejs wejściowy więc nic to właściwie nie wnosi,
a POSTROUTING zmieniłem z maskarady na SNAT wg tego co pojawiało się w logach

Kod:

-A PREROUTING  -i venet0 -p tcp --dport 57186 -d <publiczny_ip> -j DNAT --to 10.0.0.2:22
-A POSTROUTING -o tun+   -p tcp --dport 22    -d 10.0.0.2       -j SNAT --to <publiczny_ip>:57186

Wygląda, że firewall jest skonfigurowany na chwilę obecną tak jak powinien.
Przekierowania są ok, po śledzeniu liczników w tablicach iptables wygląda, że jest ok.
Sęk w tym, że nadal nie mogę się połączyć na przekierowany SSH. Ma ktoś pomysł dlaczego tak może się dziać?

Edit3:
Popatrzyłem na dodany przed chwilą SNAT, popatrzyłem na zakomentowaną maskaradę i olśniło mnie, że robiłem z nią czeski błąd
miałem

Kod:

-A POSTROUTING -s 10.0.0.0/24 -o venet0 -j MASQUERADE

a miało być

Kod:

-A POSTROUTING -d 10.0.0.0/24 -o tun+ -j MASQUERADE

Zakomentowałem jeszcze raz SNAT i włączyłem poprawioną maskaradę i śmiga...
Tylko teraz mnie nurtuje dlaczego nie działa SNAT?

Na razie zostawię wpisy w tablicy NAT z SNAT i MASQUERADE jeśli działają,
ale jeśli ktoś miałby pomysł dlaczego nie działa SNAT (wolał bym jednak SNAT niż MASQUERADE) to proszę o info.

Pozdrawiam i zostawiam dla innych - może komuś się przyda coś z powyższego...

Ostatnio edytowany przez marpi82 (2019-02-06 12:28:38)

Offline

 

#2  2019-04-29 18:21:57

  KapitanBomba - Użytkownik

KapitanBomba
Użytkownik
Zarejestrowany: 2013-11-21

Re: IPTABLES, przekierowanie portu - problem z uruchomieniem

Cześć, mam bardzo podobny problem, identyczna sytuacja LTE + OpenVPN - w domu BananPi podłączona jako klient do VPN, z tym że ja nie chcę przekierowywać ruchu na publiczne IP, a chciałbym przekierować jakiś port z tun0 do eth0 na Bananie i przyznam szczerze, że się już pogubiłem.

Wydaje mi się, że powinno być coś takiego

Kod:

-A FORWARD -i tun0 -p tcp -d 192.168.2.12 --dport 9999 -j DNAT --to 192.168.3.1:80

ale nawet mi tego przyjąć nie chce :/
Próbowałem też tak: https://raspberrypi.stackexchange.com/questions/42827/how-to-forward-traffic-from-tun0-to-specific-ip-behind-eth0-iptables
ale nie działa.

Chcę żeby po podłączeniu się do VPN po wpisaniu 192.168.2.12:9999 w przeglądarkę dostać się do sieci lokalnej 192.168.3.1 na port 80 czyli do routera ;)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)

[ Generated in 0.008 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00014 SET CHARSET latin2
0.00004 SET NAMES latin2
0.00111 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='13.58.18.135' WHERE u.id=1
0.00072 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '13.58.18.135', 1732183105)
0.00056 SELECT * FROM punbb_online WHERE logged<1732182805
0.00076 SELECT topic_id FROM punbb_posts WHERE id=323623
0.00092 SELECT id FROM punbb_posts WHERE topic_id=30831 ORDER BY posted
0.00066 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=30831 AND t.moved_to IS NULL
0.00005 SELECT search_for, replace_with FROM punbb_censoring
0.00117 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=30831 ORDER BY p.id LIMIT 0,25
0.00079 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=30831
Total query time: 0.00692 s