Я заметил при настройке VPN на моем сервере, что исходный IP-адрес всех исходящих пакетов всегда является публичным IP-адресом сервера. Но, согласно моему пониманию таблицы маршрутизации, это должен быть IP-адрес VPN. Также, если я использую ping -I 10.8.0.1 10.8.0.42
, это снова публичный IP-адрес моего сервера.
Что мне здесь не хватает?
Это результат выполнения команды tcpdump -n -i enp3s0 dst 213.225.3.191
при выполнении проверки связи с ping -I 10.8.0.1 213.225.3.191
17:34:36.285695 IP 5.9.142.112 > 213.225.3.191: ICMP echo request, id 10747, seq 34, length 64
Это результат tcpdump -n -i tun0
при выполнении проверки связи с ping -I 10.8.0.1 10.8.0.42
17:43:45.152792 IP 5.9.142.112 > 10.8.0.42: ICMP echo request, id 10834, seq 1, length 64
Вывод ip route
default via 5.9.142.97 dev enp3s0 proto static
5.9.142.97 dev enp3s0 proto kernel scope link src 5.9.142.112
10.8.0.0/30 via 10.8.0.2 dev tun0
10.8.0.0/24 via 10.8.0.2 dev tun0
10.8.0.2 dev tun0 proto kernel scope link src 10.8.0.1
Вывод route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default static.97.142.9 0.0.0.0 UG 0 0 0 enp3s0
static.97.142.9 0.0.0.0 255.255.255.255 UH 0 0 0 enp3s0
10.8.0.0 10.8.0.2 255.255.255.252 UG 0 0 0 tun0
10.8.0.0 10.8.0.2 255.255.255.0 UG 0 0 0 tun0
10.8.0.2 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
Вывод iptables -L -v -n -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 584K packets, 39M bytes)
pkts bytes target prot opt in out source destination
4 336 MASQUERADE all -- * enp3s0 10.0.0.0/8 0.0.0.0/0
0 0 MASQUERADE all -- * enp3s0 10.0.0.0/8 0.0.0.0/0
285 18732 SNAT all -- * * 10.0.0.0/8 0.0.0.0/0 to:5.9.142.112
0 0 MASQUERADE all -- * enp3s0 10.0.0.0/8 0.0.0.0/0
0 0 MASQUERADE all -- * tun0 0.0.0.0/0 0.0.0.0/0
0 0 MASQUERADE all -- * tun0 10.0.0.0/8 0.0.0.0/0
0 0 MASQUERADE all -- * tun0 0.0.0.0/0 0.0.0.0/0
0 0 SNAT all -- * * 0.0.0.0/0 10.8.0.42 to:10.8.0.1
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Чтобы полностью понять поток пакетов в Linux iptables
, вам понадобится эта диаграмма или что-то подобное для справки. На диаграмме ping
находится в блоке «локальный процесс» на уровне приложения.
С вашей текущей таблицей маршрутизации система будет «думать» только о трафике, адресованном 10.8.0.0/24. маршрутизируется на интерфейс туннеля VPN; все остальное должно выходить через enp3s0
без прохождения через VPN-туннель.
Когда вы запускаете ping -I 10.8.0.1 213.225.3.191
, IP-адрес назначения не входит в число 10.8 .0.0 / 24, поэтому будет использоваться enp3s0
. Но исходящий маршрут проходит через шлюз 5.9.142.97, и запись маршрута, используемая для достижения этого шлюза, включает src 5.9.142.112
, определяя адрес источника, который будет использоваться.
И если это не изменит исходный IP-адрес, то первое правило MASQUERADE в таблице постмаршрутизации iptables изменится.
4 336 MASQUERADE all -- * enp3s0 10.0.0.0/8 0.0.0.0/0
Правило соответствует для всех пакетов, исходящих из интерфейса enp3s0
(в соответствии с решением о маршрутизации) с исходным IP-адресом в диапазоне 10.0.0.0/8, а 10.8.0.1 соответствует этому диапазону. И поскольку это правило MASQUERADE, оно меняет исходный IP-адрес исходящего пакета ...на IP-адрес сетевого интерфейса, из которого исходит пакет. Первое совпадение побеждает, поэтому этот пакет выполняется с таблицей постмаршрутизации и выходит из системы через enp3s0
.
Результат будет точно соответствовать тому, что вы видите:
17:34:36.285695 IP 5.9.142.112 > 213.225.3.191: ICMP echo request, id 10747, seq 34, length 64
При запуске ping -I 10.8.0.1 10.8.0.42
, это действительный пункт назначения для tun0
, и адрес источника также действителен для него. Решение о маршрутизации выполнено.
В таблице постмаршрутизации NAT iptables / netfilter первые два правила ограничены совпадением для трафика, исходящего через enp3s0
, поэтому они не будут применяться. Но затем исходящий пакет попадает под это правило SNAT:
285 18732 SNAT all -- * * 10.0.0.0/8 0.0.0.0/0 to:5.9.142.112
Любой протокол, проверьте. В правиле не указан интерфейс, поэтому оно применяется к tun0
. Проверьте. Исходный адрес в пределах 10.0.0.0/8, проверьте. Адрес назначения что-нибудь, проверьте. Это матч. Это правило SNAT, поэтому оно изменяет IP-адрес S ource. И он меняет исходный IP на 5.9.142.112 . Возможно, это не то, что вы хотели, но это то, что гласит правило.
Первое совпадение побеждает, поэтому пакет теперь выполнен с таблицей постмаршрутизации: дальнейшие записи не будут обрабатываться для этого пакета. А поскольку таблица постмаршрутизации NAT является последней таблицей на исходящем пути, пакет выйдет из системы, как и сейчас.
Результат точно соответствует этому исходящему пакету на tun0
:
17:43:45.152792 IP 5.9.142.112 > 10.8.0.42: ICMP echo request, id 10834, seq 1, length 64
Если вы Если вы планируете пропускать весь ваш интернет-трафик через VPN, ваша таблица маршрутизации должна иметь:
5.9.142.97 dev enp3s0 proto kernel scope link src 5.9.142.112
маршрут для вашего физического сетевого интерфейса. Он у вас уже есть, так как он будет сгенерирован автоматически при настройке физического сетевого интерфейса. enp3s0
шлюз 5.9.142.97 на общедоступный IP-адрес удаленной конечной точки VPN-туннеля (который не является 10.8.0.2). Это позволяет пакетам, инкапсулированным в VPN, проходить через ваш реальный сетевой интерфейс и достигать удаленной конечной точки VPN, даже если вы указываете маршрут шлюза по умолчанию через интерфейс VPN. В противном случае исходящий трафик VPN будет повторно инкапсулироваться снова и снова, создавая петлю маршрутизации, которая не позволяет трафику VPN фактически попасть в удаленную конечную точку VPN. 10.8.0.2 dev Ссылка на область видимости ядра tun0 proto src 10.8.0.1
. Это, вероятно, также будет автоматически сгенерировано при настройке интерфейса tun0
. 10.8.0.0/30 через записи 10.8.0.2
и 10.8.0.0/24 через записи 10.8.0.2
. Если ваша система не является выступая в качестве VPN-шлюза для других систем, вам могут вообще не понадобиться записи в таблице NAT POSTROUTING.