Linux IP Alias не работает - Amazon EC2
Я не могу понять этот псевдоним IP на Amazon EC2. Я знаю, что это должно быть прямо сейчас.
В итоге у меня есть два вопроса (подробности моего сценария следуют после вопросов), в приоритете:
- Как заставить работать маршрутизацию через команды CLI?
- Затем после того, как [1] сработает, как заставить конфиги прикрепляться через конфигурационные файлы так, чтобы они прилипали даже после перезагрузок?
Конфигурационные файлы - моя вторичная проблема, поскольку я не могу запустить маршрутизацию через CLI.
Вот что у меня по умолчанию:
eth0 Link encap:Ethernet HWaddr 0a:64:bd:67:d6:4a
inet addr:172.31.16.15 Bcast:172.31.31.255 Mask:255.255.240.0
inet6 addr: fe80::864:bdff:fe67:d64a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:266 errors:0 dropped:0 overruns:0 frame:0
TX packets:257 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:29714 (29.7 KB) TX bytes:29843 (29.8 KB)
Со следующей таблицей маршрутизации:
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.31.16.1 0.0.0.0 UG 0 0 0 eth0
172.31.16.0 0.0.0.0 255.255.240.0 U 0 0 0 eth0
Что я хочу это:
eth0 -> 172.31.16.15
eth0:0 -> 172.31.16.100
eth0:1 -> 172.31.16.101
Конечно, с правильной маршрутизацией (и я думаю, что здесь все идет не так, как надо), чтобы я мог успешно выполнить это:
1. telnet -b 172.31.16.15 172.31.16.20 5222
2. telnet -b 172.31.16.100 172.31.16.20 5222
3. telnet -b 172.31.16.101 172.31.16.20 5222
Даже пинг работает только с 172.31.16.15 ip:
1. ping -I 172.31.16.15 172.31.16.20
2. ping -I 172.31.16.100 172.31.16.20
3. ping -I 172.31.16.101 172.31.16.20
Только [1] работает для команд telnet и ping выше.
Когда я выполняю команду telnet и tcpdump трафик, результат выглядит следующим образом:
For 172.31.16.15 when it works:
12:58:14.082176 IP (tos 0x10, ttl 64, id 59547, offset 0, flags [DF], proto TCP (6), length 60)
172.31.16.15.26798 > 172.31.16.20.5222: Flags [S], cksum 0x7890 (incorrect -> 0x455e), seq 2790518412, win 29200, options [mss 1460,sackOK,TS val 2360855 ecr 0,nop,wscale 7], length 0
12:58:14.082848 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
172.31.16.20.5222 > 172.31.16.15.26798: Flags [S.], cksum 0xfb9b (correct), seq 1051320718, ack 2790518413, win 28960, options [mss 1460,sackOK,TS val 2304582 ecr 2360855,nop,wscale 7], length 0
12:58:14.082877 IP (tos 0x10, ttl 64, id 59548, offset 0, flags [DF], proto TCP (6), length 52)
172.31.16.15.26798 > 172.31.16.20.5222: Flags [.], cksum 0x7888 (incorrect -> 0x9aa3), ack 1, win 229, options [nop,nop,TS val 2360855 ecr 2304582], length 0
For 172.31.16.100 when it doesn't work (also, nothing arrives at receiving end):
12:59:01.001723 IP (tos 0x10, ttl 64, id 45034, offset 0, flags [DF], proto TCP (6), length 60)
172.31.16.100.17006 > 172.31.16.20.5222: Flags [S], cksum 0x78e5 (incorrect -> 0xf906), seq 1028496387, win 29200, options [mss 1460,sackOK,TS val 2372585 ecr 0,nop,wscale 7], length 0
12:59:02.000831 IP (tos 0x10, ttl 64, id 45035, offset 0, flags [DF], proto TCP (6), length 60)
172.31.16.100.17006 > 172.31.16.20.5222: Flags [S], cksum 0x78e5 (incorrect -> 0xf80c), seq 1028496387, win 29200, options [mss 1460,sackOK,TS val 2372835 ecr 0,nop,wscale 7], length 0
12:59:04.004827 IP (tos 0x10, ttl 64, id 45036, offset 0, flags [DF], proto TCP (6), length 60)
172.31.16.100.17006 > 172.31.16.20.5222: Flags [S], cksum 0x78e5 (incorrect -> 0xf617), seq 1028496387, win 29200, options [mss 1460,sackOK,TS val 2373336 ecr 0,nop,wscale 7], length 0
12:59:08.012822 IP (tos 0x10, ttl 64, id 45037, offset 0, flags [DF], proto TCP (6), length 60)
172.31.16.100.17006 > 172.31.16.20.5222: Flags [S], cksum 0x78e5 (incorrect -> 0xf22d), seq 1028496387, win 29200, options [mss 1460,sackOK,TS val 2374338 ecr 0,nop,wscale 7], length 0
12:59:16.036831 IP (tos 0x10, ttl 64, id 45038, offset 0, flags [DF], proto TCP (6), length 60)
172.31.16.100.17006 > 172.31.16.20.5222: Flags [S], cksum 0x78e5 (incorrect -> 0xea57), seq 1028496387, win 29200, options [mss 1460,sackOK,TS val 2376344 ecr 0,nop,wscale 7], length 0
12:59:32.068840 IP (tos 0x10, ttl 64, id 45039, offset 0, flags [DF], proto TCP (6), length 60)
172.31.16.100.17006 > 172.31.16.20.5222: Flags [S], cksum 0x78e5 (incorrect -> 0xdaaf), seq 1028496387, win 29200, options [mss 1460,sackOK,TS val 2380352 ecr 0,nop,wscale 7], length 0
Я пробовал это в /etc/network/interfaces:
auto eth0:0
iface eth0:0 inet static
address 172.31.16.100
netmask 255.255.240.0
broadcast 172.31.31.255
network 172.31.16.0
gateway 172.31.16.1
auto eth0:1
iface eth0:1 inet static
address 172.31.16.101
netmask 255.255.240.0
broadcast 172.31.31.255
network 172.31.16.0
gateway 172.31.16.1
Когда я перезагружаю сеть, это не вступает в силу. Также, когда я перезагружаю машину, я не могу снова подключиться к ней. Кажется, что-то вступает в силу тогда, но, очевидно, очень неправильно.
Я также сделал CLI sudo ifconfig следующим образом:
$ sudo ifconfig eth0:0 172.31.16.100 netmask 255.255.240.0 broadcast 172.31.31.255 up
$ sudo ifconfig eth0:1 172.31.16.101 netmask 255.255.240.0 broadcast 172.31.31.255 up
где мой IP-псевдоним вступает в силу немедленно:
$ ifconfig
eth0 Link encap:Ethernet HWaddr 0a:64:bd:67:d6:4a
inet addr:172.31.16.15 Bcast:172.31.31.255 Mask:255.255.240.0
inet6 addr: fe80::864:bdff:fe67:d64a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1224 errors:0 dropped:0 overruns:0 frame:0
TX packets:943 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:93498 (93.4 KB) TX bytes:118463 (118.4 KB)
eth0:0 Link encap:Ethernet HWaddr 0a:64:bd:67:d6:4a
inet addr:172.31.16.100 Bcast:172.31.31.255 Mask:255.255.240.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
eth0:1 Link encap:Ethernet HWaddr 0a:64:bd:67:d6:4a
inet addr:172.31.16.101 Bcast:172.31.31.255 Mask:255.255.240.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
с таблицей маршрутизации все еще выглядит так же:
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.31.16.1 0.0.0.0 UG 0 0 0 eth0
172.31.16.0 0.0.0.0 255.255.240.0 U 0 0 0 eth0
но опять же, я не могу сделать телнет, как описано выше для [2] и [3].
Также после ввода следующих команд (и очистки таблиц маршрутизации):
echo 200 EJ0 >> /etc/iproute2/rt_tables
echo 201 EJ1 >> /etc/iproute2/rt_tables
ip route add 172.31.16.0 dev eth0:0 src 172.31.16.100 table EJ0
ip route add default via 172.31.16.1 table EJ0
ip route add 172.31.16.0 dev eth0:1 src 172.31.16.101 table EJ1
ip route add default via 172.31.16.1 table EJ1
ip route add 172.31.16.0 dev eth0:0 src 172.31.16.100
ip route add 172.31.16.0 dev eth0:1 src 172.31.16.101
ip rule add from 172.31.16.100 table EJ0
ip rule add from 172.31.16.101 table EJ1
ping
а также telnet
Команды все еще не работают.
Больше информации:
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 0a:64:bd:67:d6:4a brd ff:ff:ff:ff:ff:ff
inet 172.31.16.15/20 brd 172.31.31.255 scope global eth0
valid_lft forever preferred_lft forever
inet 172.31.16.100/20 brd 172.31.31.255 scope global secondary eth0:0
valid_lft forever preferred_lft forever
inet 172.31.16.101/20 brd 172.31.31.255 scope global secondary eth0:1
valid_lft forever preferred_lft forever
inet6 fe80::864:bdff:fe67:d64a/64 scope link
valid_lft forever preferred_lft forever
а также
$ ip route show
default via 172.31.16.1 dev eth0
172.31.16.0 dev eth0 scope link src 172.31.16.100
172.31.16.0/20 dev eth0 proto kernel scope link src 172.31.16.15
Это все для того, чтобы HAProxy мог успешно подключаться к экземпляру ejabberd, но делал это с двух разных IP-адресов src (eth0:0 и eth0:1).
Любые советы приветствуются и приветствуются.
2 ответа
Псевдоним IP действительно возможен с Amazon EC2 VPC!!
Если вы используете Ubuntu Linux (как, например, сейчас), вам все равно нужно добавить свой IP-псевдоним, как обычно для Linux, НО критической частью является также ДОПОЛНИТЕЛЬНАЯ его настройка на самой консоли Amazon EC2, как показано здесь. Несколько Частные IP-адреса.
Спасибо всем за ваши комментарии и вклады.
Подобно маршрутизации, когда linux находит несколько объектов в одной сети, он использует первый соответствующий маршрут / интерфейс, чтобы добраться туда. В этом случае это eth0
а также 172.31.16.15
,
Чтобы Linux использовал эти псевдонимы как в качестве адресов источника, так и в качестве полностью функциональных интерфейсов, вам необходимо создать несколько таблиц маршрутизации, по одной для каждого виртуального интерфейса.
echo 200 EJ0 >> /etc/iproute2/rt_tables
echo 201 EJ1 >> /etc/iproute2/rt_tables
Добавить маршруты
ip route add 172.31.16.0 dev eth0:0 src 172.31.16.100 table EJ0
ip route add default via 172.31.16.1 table EJ0
ip route add 172.31.16.0 dev eth0:1 src 172.31.16.101 table EJ1
ip route add default via 172.31.16.1 table EJ1
Тогда скажите основной стол.
ip route add 172.31.16.0 dev eth0:0 src 172.31.16.100
ip route add 172.31.16.0 dev eth0:1 src 172.31.16.101
затем добавьте правила
ip rule add from 172.31.16.100 table EJ0
ip rule add from 172.31.16.101 table EJ1
Многое из этого взято со страницы когда-либо полезной политики маршрутизации Linux