Назад | Перейти на главную страницу

От определенного IP-адреса источника к определенному IP-адресу назначения с IP-маршрутом или таблицами IP

Проблема

Я уже создал разные псевдонимы IP (каждый с другим виртуальным Mac-адресом) таким образом в моей оболочке:

ip link add link eth0 address 00:11:11:11:11:11 eth0.1 type macvlan

ifconfig eth0.1 172.17.1.15/21 up

Я использовал eth0.1 вместо eth0: 1, потому что в противном случае он не работает с macvlan. Я знаю, что псевдоним IP записывается как: eth0: 1.

Установлено регулирование скорости до 10 Мбит / с на IP (или Mac Addr, я еще не знаю), и я изучаю его обход для благонамеренного проекта.

Теперь я хочу установить конкретный пункт назначения для каждого псевдонима IP, чтобы изучить регулирование скорости маршрутизатора. Теперь у него должно быть 10 Мбит / с на IP / соединение.

Например:

Маршрутизатор: 172.17.0.1/21

eth0> 172.17.1.14/21

eth0.1> 172.17.1.15/21

eth0.2> 172.17.1.16/21

Теперь мне нужно, чтобы eth0.1 был источником для доступа: URL (speedtest1Web).

И eth0.2 - источник доступа: URL (speedtest2Web).

Я пытался:

iptables -t nat -A POSTROUTING -p tcp -s 172.17.1.15 -o eth0.1 -j SNAT --to-source xxx.xxx.xxx.xxx

или

iptables -t nat -I POSTROUTING -o eth0 -d xxx.xxx.xxx.xxx/32 -s 10.255.0.127 -j SNAT --to-source 172.17.1.15

где xxx.xxx.xxx.xxx = speedtest1Web

Правильно ли "-o eth0"? Или мне написать "-o eth0.1"?

Я безуспешно пробовал много подобных команд или, по крайней мере, у меня по-прежнему 10 Мбит / с для всех соединений вместо 10 Мбит / с на соединение (что предполагается сейчас с псевдонимом IP).

В вашем случае использование macvlan не требуется.

  • Назначьте адреса на едином интерфейсе. Псевдонимы - это устаревший способ иметь несколько адресов на одном интерфейсе. Macvlan нужен только в том случае, если вы хотите иметь разные MAC-адреса для разных IP-адресов, но это усложняет настройку маршрутизации.
 l1:~# ip link set up dev eth0
 l1:~# ip address add 172.17.1.14/21 dev eth0
 l1:~# ip address add 172.17.1.15/21 dev eth0
 l1:~# ip address add 172.17.1.16/21 dev eth0
  • Проверить список адресов на eth0 интерфейс:
 l1:~# ip -4 a ls dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 172.17.0.14/21 scope global eth0
       valid_lft forever preferred_lft forever
    inet 172.17.0.15/21 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet 172.17.0.16/21 scope global secondary eth0
       valid_lft forever preferred_lft forever
  • Добавьте маршрут по умолчанию и адрес источника по умолчанию, затем проверьте конфигурацию:
l1:~# ip route add 0/0 via 172.17.0.1 src 172.17.0.14
l1:~# ip route list
default via 172.17.0.1 dev eth0 src 172.17.0.14 
172.17.0.0/21 dev eth0 proto kernel scope link src 172.17.0.14 
  • У вас есть два способа использовать вторичные адреса для конкретного пункта назначения. Вы можете добавить маршрут к конкретному пункту назначения, указав атрибут src:

Использовать 172.17.0.15 как исходный адрес для 192.168.10.2 место назначения

l1:~# ip route add 192.168.10.2 via 172.17.0.1 src 172.17.0.15

Использовать 172.17.0.16 как исходный адрес для 192.168.11.2 место назначения

l1:~# ip r add 192.168.11.2 via 172.17.0.1 src 172.17.0.16

Проверьте таблицу маршрутизации:

l1:~# ip r ls
default via 172.17.0.1 dev eth0 src 172.17.0.14 
172.17.0.0/21 dev eth0 proto kernel scope link src 172.17.0.14 
192.168.10.2 via 172.17.0.1 dev eth0 src 172.17.0.15 
192.168.11.2 via 172.17.0.1 dev eth0 src 172.17.0.16 

Также вы можете проверить фактические маршруты для конкретного пункта назначения с помощью ip route get команда:

l1:~# ip route get 192.168.10.2
192.168.10.2 via 172.17.0.1 dev eth0 src 172.17.0.15 uid 0 
    cache 

Есть краткая версия этой же команды:

l1:~# ip r g 192.168.11.2
192.168.11.2 via 172.17.0.1 dev eth0 src 172.17.0.16 uid 0 
    cache 

Проверьте результаты с помощью ping и tcpdump. Пропингуйте хосты и проверьте вывод tcpdump в другой консоли. Вы можете использовать wirehark вместо tcpdump .:

l1:~# tcpdump -ni eth0 'icmp'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:21:07.972535 IP 172.17.0.14 > 172.17.0.1: ICMP echo request, id 23048, seq 0, length 64
10:21:07.974416 IP 172.17.0.1 > 172.17.0.14: ICMP echo reply, id 23048, seq 0, length 64
10:21:15.391709 IP 172.17.0.15 > 192.168.10.2: ICMP echo request, id 23304, seq 0, length 64
10:21:15.393515 IP 192.168.10.2 > 172.17.0.15: ICMP echo reply, id 23304, seq 0, length 64
10:21:18.207461 IP 172.17.0.16 > 192.168.11.2: ICMP echo request, id 23560, seq 0, length 64
10:21:18.209391 IP 192.168.11.2 > 172.17.0.16: ICMP echo reply, id 23560, seq 0, length 64
  • Другой способ - использовать SNAT цель в iptables. Но если у вас есть сотни похожих правил, это может повлиять на производительность.
l1:~# iptables -t nat -A POSTROUTING \
               -o eth0 --dst 192.168.10.2 \
          -j SNAT --to-source 172.17.0.15
l1:~# iptables -t nat -A POSTROUTING \
               -o eth0 --dst 192.168.11.2 \
          -j SNAT --to-source 172.17.0.16

Лучше используйте iptables-save и iptables-apply для безопасной настройки iptables. Проверка такая же, как и в случае с маршрутом - с ping и tcpdump. Кроме того, вы можете проверить счетчики правил, чтобы убедиться, что эти правила работают.

l1:~# iptables-save -c -t nat
# Generated by iptables-save v1.6.2 on Wed May 15 10:31:26 2019
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [4:336]
:POSTROUTING ACCEPT [0:0]
[2:168] -A POSTROUTING -d 192.168.10.2/32 -o eth0 -j SNAT --to-source 172.17.0.15
[2:168] -A POSTROUTING -d 192.168.11.2/32 -o eth0 -j SNAT --to-source 172.17.0.16
COMMIT
# Completed on Wed May 15 10:31:26 2019
  • Есть третий способ использовать конкретный источник. В некоторых приложениях вы можете указать источник в файле конфигурации или с аргументами командной строки. Для ping это -I вариант:
l1:~# ping -c 2 -I 172.17.0.15 192.168.11.2
PING 192.168.11.2 (192.168.11.2) from 172.17.0.15: 56 data bytes
64 bytes from 192.168.11.2: seq=0 ttl=63 time=2.348 ms
64 bytes from 192.168.11.2: seq=1 ttl=63 time=1.270 ms

--- 192.168.11.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 1.270/1.809/2.348 ms
l1:~# tcpdump -ni eth0 'icmp'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:37:08.724723 IP 172.17.0.15 > 192.168.11.2: ICMP echo request, id 37384, seq 0, length 64
10:37:08.726805 IP 192.168.11.2 > 172.17.0.15: ICMP echo reply, id 37384, seq 0, length 64
10:37:09.724985 IP 172.17.0.15 > 192.168.11.2: ICMP echo request, id 37384, seq 1, length 64
10:37:09.726084 IP 192.168.11.2 > 172.17.0.15: ICMP echo reply, id 37384, seq 1, length 64
  • Кроме того, вы должны знать, что ни ip route или iptables ничего не знает о доменных именах и может использовать только IP-адрес назначения. Iptables может разрешать доменное имя при создании правила, но IP-адрес в нем не будет обновляться волшебным образом. Есть несколько приемов, чтобы избежать этого ограничения:
    • Исправьте IP-адрес, связанный с доменным именем. Вы можете использовать /etc/hosts файл, чтобы сделать это. Этот способ подходит для быстрых тестов и записей DNS с длинным TTL.
    • Самый гибкий способ: использование dnsmasq, ipset и iptables. В таком случае dnsmasq разрешает доменные имена и сохраняет свои IP-адреса в ipset списки. Вы можете использовать эти списки в iptables SNAT правила.