LINUX.ORG.RU
решено ФорумAdmin

Маршрутизация через IPIP-туннель

 , ,


0

1

Приветствую, ЛОР!

Есть банальная задача: Соединить два centos7 сервера ipip-туннелем и смаршрутизировать через него локальные сети друг друга, которые висят на bridge интерфейсах. Что-то пошло не так на этапе маршрутизации, и если с host1 с адреса туннеля доступны адреса br1 и br2 на host2, то с адресов br1 и br2 на host1 - уже нет. Под катом инфа сети и диагностика.

Карта сети (или что должно быть в итоге)


#
# host1 config
#

#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:ae:37:c3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.76/24 brd 192.168.0.255 scope global dynamic enp0s3
       valid_lft 258553sec preferred_lft 258553sec
    inet6 fe80::3d29:1cc:c1ca:7437/64 scope link 
       valid_lft forever preferred_lft forever
3: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN qlen 1000
    link/ether fa:61:b6:cf:1e:14 brd ff:ff:ff:ff:ff:ff
4: dummy1: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 36:6f:b9:86:64:22 brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN qlen 1000
    link/ether 52:b8:91:9f:dc:91 brd ff:ff:ff:ff:ff:ff
    inet 10.10.0.1/24 brd 10.10.0.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::50b8:91ff:fe9f:dc91/64 scope link 
       valid_lft forever preferred_lft forever
6: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN qlen 1000
    link/ether 02:57:44:16:57:d2 brd ff:ff:ff:ff:ff:ff
    inet 10.10.1.1/24 brd 10.10.1.255 scope global br1
       valid_lft forever preferred_lft forever
    inet6 fe80::57:44ff:fe16:57d2/64 scope link 
       valid_lft forever preferred_lft forever
7: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1
    link/ipip 0.0.0.0 brd 0.0.0.0
8: tun0@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN qlen 1
    link/ipip 192.168.0.76 peer 192.168.0.77
    inet 192.168.254.1 peer 192.168.254.2/30 scope global tun0
       valid_lft forever preferred_lft forever
9: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:8b:75:9a:4a brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

#ip r s
default via 192.168.0.1 dev enp0s3 proto static metric 100 
10.10.0.0/24 dev br0 proto kernel scope link src 10.10.0.1 
10.10.1.0/24 dev br1 proto kernel scope link src 10.10.1.1 
10.20.0.0/24 dev tun0 scope link 
10.20.1.0/24 dev tun0 scope link 
169.254.0.0/16 dev br0 scope link metric 1005 
169.254.0.0/16 dev br1 scope link metric 1006 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
192.168.0.0/24 dev enp0s3 proto kernel scope link src 192.168.0.76 metric 100 
192.168.254.0/30 dev tun0 proto kernel scope link src 192.168.254.1 
192.168.254.0/24 dev tun0 scope link 

# ip ru
0:  from all lookup local 
32763:  from 192.168.254.1 lookup tabletun0 
32764:  from all to 10.20.1.0/24 lookup tabletun0 
32765:  from all to 10.20.0.0/24 lookup tabletun0 
32766:  from all lookup main 
32767:  from all lookup default 

# ip r s t tabletun0
default dev tun0 scope link 

# iptables-save 
# Generated by iptables-save v1.4.21 on Tue May 22 04:35:45 2018
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:DOCKER - [0:0]
COMMIT
# Completed on Tue May 22 04:35:45 2018
# Generated by iptables-save v1.4.21 on Tue May 22 04:35:45 2018
*filter
:INPUT ACCEPT [41:2780]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [21:2188]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
COMMIT
# Completed on Tue May 22 04:35:45 2018

#
# host2 config
#

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:ae:37:c3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.77/24 brd 192.168.0.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:feae:37c3/64 scope link 
       valid_lft forever preferred_lft forever
3: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UNKNOWN qlen 1000
    link/ether da:ec:60:9c:fc:91 brd ff:ff:ff:ff:ff:ff
4: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN qlen 1000
    link/ether 72:77:8b:b5:8b:1e brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether da:ec:60:9c:fc:91 brd ff:ff:ff:ff:ff:ff
    inet 10.20.0.1/24 brd 10.20.0.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::d8ec:60ff:fe9c:fc91/64 scope link 
       valid_lft forever preferred_lft forever
6: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1
    link/ipip 0.0.0.0 brd 0.0.0.0
7: tun0@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN qlen 1
    link/ipip 192.168.0.77 peer 192.168.0.76
    inet 192.168.254.2 peer 192.168.254.1/30 scope global tun0
       valid_lft forever preferred_lft forever
8: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN qlen 1000
    link/ether 8a:4e:6e:00:3e:24 brd ff:ff:ff:ff:ff:ff
    inet 10.20.1.1/24 brd 10.20.1.255 scope global br1
       valid_lft forever preferred_lft forever
    inet6 fe80::884e:6eff:fe00:3e24/64 scope link 
       valid_lft forever preferred_lft forever


#ip r s
default via 192.168.0.1 dev enp0s3 proto static metric 100 
10.10.0.0/24 dev tun0 scope link 
10.10.1.0/24 dev tun0 scope link 
10.20.0.0/24 dev br0 proto kernel scope link src 10.20.0.1 
10.20.1.0/24 dev br1 proto kernel scope link src 10.20.1.1 
169.254.0.0/16 dev br0 scope link metric 1005 
169.254.0.0/16 dev br1 scope link metric 1008 
192.168.0.0/24 dev enp0s3 proto kernel scope link src 192.168.0.77 metric 100 
192.168.254.0/30 dev tun0 proto kernel scope link src 192.168.254.2 
192.168.254.0/24 dev tun0 scope link 


# ip ru
0:  from all lookup local 
32765:  from 192.168.254.2 lookup tabletun0 
32766:  from all lookup main 
32767:  from all lookup default 


# ip r s t tabletun0
default dev tun0 scope link


# iptables-save 
# Generated by iptables-save v1.4.21 on Mon May 21 14:27:29 2018
*nat
:PREROUTING ACCEPT [85:7608]
:INPUT ACCEPT [16:2688]
:OUTPUT ACCEPT [2:152]
:POSTROUTING ACCEPT [2:152]
COMMIT
# Completed on Mon May 21 14:27:29 2018
# Generated by iptables-save v1.4.21 on Mon May 21 14:27:29 2018
*filter
:INPUT ACCEPT [20:1467]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [11:1104]
COMMIT
# Completed on Mon May 21 14:27:29 2018

#
# host1 debug
#

# ping 10.20.1.1
PING 10.20.1.1 (10.20.1.1) 56(84) bytes of data.
64 bytes from 10.20.1.1: icmp_seq=1 ttl=64 time=0.417 ms
64 bytes from 10.20.1.1: icmp_seq=2 ttl=64 time=1.28 ms

# tcpdump -nni any not port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
04:41:36.016368 IP 192.168.0.63.137 > 192.168.0.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
04:41:36.159857 ARP, Request who-has 192.168.0.76 tell 192.168.0.77, length 46
04:41:36.159947 ARP, Reply 192.168.0.76 is-at 08:00:27:ae:37:c3, length 28
04:41:36.834556 IP 192.168.0.63.137 > 192.168.0.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
04:41:37.552177 IP 192.168.0.63.137 > 192.168.0.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
04:41:37.805327 IP 192.168.254.1 > 10.20.1.1: ICMP echo request, id 1743, seq 1, length 64
04:41:37.805345 IP 192.168.0.76 > 192.168.0.77: IP 192.168.254.1 > 10.20.1.1: ICMP echo request, id 1743, seq 1, length 64 (ipip-proto-4)
04:41:37.805663 IP 192.168.0.77 > 192.168.0.76: IP 10.20.1.1 > 192.168.254.1: ICMP echo reply, id 1743, seq 1, length 64 (ipip-proto-4)
04:41:37.805713 IP 10.20.1.1 > 192.168.254.1: ICMP echo reply, id 1743, seq 1, length 64
04:41:38.805772 IP 192.168.254.1 > 10.20.1.1: ICMP echo request, id 1743, seq 2, length 64
04:41:38.805815 IP 192.168.0.76 > 192.168.0.77: IP 192.168.254.1 > 10.20.1.1: ICMP echo request, id 1743, seq 2, length 64 (ipip-proto-4)
04:41:38.806769 IP 192.168.0.77 > 192.168.0.76: IP 10.20.1.1 > 192.168.254.1: ICMP echo reply, id 1743, seq 2, length 64 (ipip-proto-4)
04:41:38.806970 IP 10.20.1.1 > 192.168.254.1: ICMP echo reply, id 1743, seq 2, length 64
04:41:39.496721 ARP, Request who-has 192.168.0.113 tell 192.168.0.123, length 46


# ip r get 10.20.1.1
10.20.1.1 dev tun0 src 192.168.254.1 
    cache expires 396sec mtu 1480 


# ping 10.20.1.1 -I br0
PING 10.20.1.1 (10.20.1.1) from 10.10.0.1 br0: 56(84) bytes of data.
^C
--- 10.20.1.1 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms

# tcpdump -nni any not port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
04:43:34.401275 ARP, Request who-has 10.20.1.1 tell 10.10.0.1, length 28
04:43:35.403213 IP 10.10.0.1 > 10.10.0.1: ICMP host 10.20.1.1 unreachable, length 92
04:43:35.403238 IP 10.10.0.1 > 10.10.0.1: ICMP host 10.20.1.1 unreachable, length 92
04:43:35.403254 IP 10.10.0.1 > 10.10.0.1: ICMP host 10.20.1.1 unreachable, length 92
04:43:35.403269 IP 10.10.0.1 > 10.10.0.1: ICMP host 10.20.1.1 unreachable, length 92
04:43:36.397348 ARP, Request who-has 10.20.1.1 tell 10.10.0.1, length 28
04:43:36.708938 ARP, Request who-has 192.168.0.76 (08:00:27:ae:37:c3) tell 192.168.0.83, length 46
04:43:36.708997 ARP, Reply 192.168.0.76 is-at 08:00:27:ae:37:c3, length 28
04:43:37.399550 ARP, Request who-has 10.20.1.1 tell 10.10.0.1, length 28
04:43:38.401714 ARP, Request who-has 10.20.1.1 tell 10.10.0.1, length 28
04:43:39.403103 IP 10.10.0.1 > 10.10.0.1: ICMP host 10.20.1.1 unreachable, length 92
04:43:39.403128 IP 10.10.0.1 > 10.10.0.1: ICMP host 10.20.1.1 unreachable, length 92
04:43:39.403144 IP 10.10.0.1 > 10.10.0.1: ICMP host 10.20.1.1 unreachable, length 92
04:43:39.403157 IP 10.10.0.1 > 10.10.0.1: ICMP host 10.20.1.1 unreachable, length 92
04:43:39.512526 ARP, Request who-has 192.168.0.113 tell 192.168.0.123, length 46


Последнее исправление: Grotesque (всего исправлений: 3)

:FORWARD DROP

И почему маршруты такие странные:

10.10.0.0/24 dev tun0 scope link

А не ″via 192.168.254.1 dev tun0″?

mky ★★★★★
()
Ответ на: комментарий от mky
# # ip route change 10.20.0.0/24 dev tun0 via 192.168.254.1 scope link
# iptables -P FORWARD ACCEPT

# ping 10.20.0.1 -I br0
PING 10.20.0.1 (10.20.0.1) from 10.10.0.1 br0: 56(84) bytes of data.
^C
--- 10.20.0.1 ping statistics ---
27 packets transmitted, 0 received, 100% packet loss, time 25999ms

17:13:25.234256 ARP, Request who-has 10.20.0.1 tell 10.10.0.1, length 28
17:13:26.236260 ARP, Request who-has 10.20.0.1 tell 10.10.0.1, length 28
17:13:27.238238 IP 10.10.0.1 > 10.10.0.1: ICMP host 10.20.0.1 unreachable, length 92
17:13:27.238248 IP 10.10.0.1 > 10.10.0.1: ICMP host 10.20.0.1 unreachable, length 92
17:13:27.238255 IP 10.10.0.1 > 10.10.0.1: ICMP host 10.20.0.1 unreachable, length 92
17:13:27.238261 IP 10.10.0.1 > 10.10.0.1: ICMP host 10.20.0.1 unreachable, length 92
17:13:28.231315 ARP, Request who-has 10.20.0.1 tell 10.10.0.1, length 28
17:13:29.234258 ARP, Request who-has 10.20.0.1 tell 10.10.0.1, length 28

Толку никакого :(

Grotesque
() автор топика
Ответ на: комментарий от Grotesque
ping 10.20.0.1 -I br0

Это вообще должно работать? Я правильно проверяю коннективность? Как по-другому её проверить? Допустим, я создаю интерфейс dummy0 с адресом 10.10.0.3/24 и добавляю его в бридж br0 на host1, должен ли я в этом случае видеть пинги через ping 10.20.0.1 -I dummy0 ? Может всё работает, но я просто этого не понимаю :)

Grotesque
() автор топика
Ответ на: комментарий от Grotesque

Предположу, что адрес должен быть на бридже, а не на девайсе, который ты в него добавляешь. По крайне мере так было во времена, когда я последний раз трогал бриджи в linux.

BOOBLIK ★★★
()
Ответ на: комментарий от BOOBLIK

Дык, адресацию я и так на бриджи повешал. Я пробовал и без адресации на бриджах, только на dummy интерфейсы вешал её, а потом в бриджи включал, сейчас переделал на просто бриджи с адресами... не понимаю в чём разница, бридж это l2 уровень, интерфейс это тоже l2 уровень, у них есть связность в широковещательном домене, делаем из того и другого l3 уровень вешая адреса из одной сети, всё ж в теории должно работать. А потом маршрутизацией отдаём в туннель и создаём связность с другими широковещательными доменами с другой машины. Почему на практике-то не работает :(

Grotesque
() автор топика
Ответ на: комментарий от Grotesque

″scope link″ кто придумал дописать в маршрут? У вас не долно быть:

ARP, Request who-has 10.20.0.1 tell 10.10.0.1

раз вам нужна маршрутизация.

mky ★★★★★
()
Ответ на: комментарий от mky

«scope link» дописывает система при поднятии tun0

# cat /etc/sysconfig/network-scripts/route-tun0 
default dev tun0 table tabletun0
192.168.254.0/24 dev tun0
10.20.0.0/24 dev tun0
10.20.1.0/24 dev tun0
поменял маршрут # ip route change 10.20.0.0/24 dev tun0 via 192.168.254.1 - ничего не изменилось

Grotesque
() автор топика
Ответ на: комментарий от Grotesque

Точно ничего не изменилось? и в выводе tcpdump?

На машине с 10.10.x.1/24 нужно:
10.20.0.0/24 dev tun0 via 192.168.254.2 
На машине с 10.20.x.1/24 нужно:
10.10.0.0/24 dev tun0 via 192.168.254.1 

P.S. Если у вас там есть таблица маршрутизации tabletun0, наверное нужно в неё прописывать маршруты и показать её.

mky ★★★★★
()
Последнее исправление: mky (всего исправлений: 1)
Ответ на: комментарий от mky

Точно

 # ip route change 10.20.0.0/24 dev tun0 via 192.168.254.2

# ping 10.20.0.1 -I br0
PING 10.20.0.1 (10.20.0.1) from 10.10.0.1 br0: 56(84) bytes of data.
^C
--- 10.20.0.1 ping statistics ---
14 packets transmitted, 0 received, 100% packet loss, time 12999ms


18:29:38.782256 ARP, Request who-has 10.20.0.1 tell 10.10.0.1, length 28
18:29:39.784249 ARP, Request who-has 10.20.0.1 tell 10.10.0.1, length 28
18:29:40.786295 IP 10.10.0.1 > 10.10.0.1: ICMP host 10.20.0.1 unreachable, length 92
18:29:40.786306 IP 10.10.0.1 > 10.10.0.1: ICMP host 10.20.0.1 unreachable, length 92
18:29:40.786313 IP 10.10.0.1 > 10.10.0.1: ICMP host 10.20.0.1 unreachable, length 92
18:29:40.786320 IP 10.10.0.1 > 10.10.0.1: ICMP host 10.20.0.1 unreachable, length 92
18:29:41.779307 ARP, Request who-has 10.20.0.1 tell 10.10.0.1, length 28

Но при этом без -I br0 оно как пиналось, так и продолжает пинаться. Может я проверяю просто не правильно всё-таки? Ничего не помогает, я уже и snat/masquerade пробовал - толку 0

Grotesque
() автор топика
Ответ на: комментарий от mky

В первом посте есть инфа про tabletun0

# ip ru
0:  from all lookup local 
32763:  from 192.168.254.1 lookup tabletun0 
32764:  from all to 10.20.1.0/24 lookup tabletun0 
32765:  from all to 10.20.0.0/24 lookup tabletun0 
32766:  from all lookup main 
32767:  from all lookup default 

# ip r s t tabletun0
default dev tun0 scope link 

Grotesque
() автор топика

Пробовал проверить связность внутри бриджа br0 между dummy0 (10.10.0.10) и виртуальным интерфейсом:

# ip netns add ns1
# ip link add tap1 type veth peer name br-tap1
# brctl addif br0 br-tap1 
# ip link set tap1 netns ns1
# ip netns exec ns1 ip link set dev tap1 up
# ip link set dev br-tap1 up
# ip netns exec ns1 ip a a 10.10.0.5/24 dev tap1

Связности нет. В дампе то же самое. У меня уже голова от этого болит.

Grotesque
() автор топика
Ответ на: комментарий от Grotesque

При всё при этом, если проверять вот так ping 10.20.0.1 -I 10.10.0.1 то есть вместо ifname указывать адрес, то связность есть вообще всего со всем.

If interface is an address, it sets source address to specified interface address.  If interface in an interface name, it sets source interface to specified interface.
Я уже понять вообще ничего не могу: Как правильно-то всё же проверять доступность из сети с одного бриджа в сеть с другого бриджа? FACEPALM

Grotesque
() автор топика
Ответ на: комментарий от Grotesque

Точно, то, что у вас пакеты шли не туда и вызывали arp-запросы было из-за указания интерфейса команде ping. ping создаёт icmp-пакет с указанным исходящим интерфейсом, сделать так, чтобы пакет как-бы пришёл в систему с br0-интерфейса ping не может.

Через создание veth и namespace'ы можно попробовать проверить то, что вам нужно. Но в ns1 нужно прописать маршрут по умолчанию и там запускать просто ″ping 10.20.0.1″, без указания интерфейса. Потом проверть, что форвардинг включён (/proc/sys/net/ipv4/ip_forward) и в iptables в FORWARD разрешить прохождение пакетов.

mky ★★★★★
()
Ответ на: комментарий от mky

Ничего не получается, что-то всё равно не работает. Я уже упростил схему до невозможного: сделал 3 вирт. машины и 2 внутренние сети, соединил их последовательно как-то так [host1 eth0: 10.10.0.100/24] ----> [host2 br1 (eth0 + eth1)] <==== [host3 eth0: 10.10.0.200/24] Так вот когда я пинаю с host1 host3, на host3 я вижу arp request, и arp reply, но на host2 arp reply уже нет. Куда он девается? Почему уже в такой простой схеме нет связности? Дурацкие бриджи :(

Grotesque
() автор топика

В порядке бреда(на обоих серверах):

sysctl -w net.ipv4.ip_forward=1

Я конечно чую, что это уже сделано, но мало ли...

Pinkbyte ★★★★★
()
Ответ на: комментарий от Pinkbyte

Да в общем разобрался я. В предыдущем вопросе про виртуалки виноват вообще virtualbox - как мне посоветовали, в настройках сети в виртуалке в параметре «неразборчивый режим» выставить «разрешить всё» - и пинг, и ARP'ы соответственно стали проходить.

А тот вопрос что в топике, - я хер его знает почему при передаче аргументом имени интерфейса как будто бы ничего не работает, это надо в исходники пинга лезть. В общем, я просто на host1 и на host2 в бриджах создал докер контейнеры и виртуалки - и всё отовсюду пингается. Я до сих пор не уверен, может и я в процессе что-то сделал, потому что я перепробовал 100500 всего что уже и не вспомню, может что-то и вкатило, но как факт ping 10.20.1.1 -I br1 как не работал, так до сих пор и не работает. Ну и фиг с ним :)

Grotesque
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.