От определенного исходного 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).
1 ответ
Вам не нужно использовать 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 в другой консоли. Вы можете использовать wireshark вместо 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
правила.
- Исправьте IP-адрес, связанный с именем домена. Вы можете использовать