Рейтинг:0

Мой внутренний сервер виртуальной машины не может видеть внешний IP-адрес, маршрутизируемый с помощью Iptables на внутренний IP-адрес VPN

флаг ar

Я использую Iptables для маршрутизации https-трафика из Интернета во внутреннюю сеть через HAproxy. Правила Iptables NAt:

iptables -i eth0 -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 10.0.0.7
iptables -i eth0 -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --к месту назначения 10.0.0.7

iptables -t nat -A POSTROUTING -j MASQUERADE

10.0.0.0/24 — это Wireguard VPN (IP-адрес сервера — 10.0.0.1, IP-адрес haproxy — 10.0.0.7)

Затем я хочу увидеть исходный IP-адрес, зарегистрированный в HAproxy, но я вижу только IP-адрес VPN-сервера:

# хвост -f /var/log/haproxy

14 июля 18:27:02 localhost haproxy[13304]: 10.0.0.1:57539 [14/Jul/2021:18:27:02.199] 1/-1/-1/0 503 99 - - SC-- 1/1/0/0/0 0/0 "GET /.env HTTP/1.1

Как я могу проксировать трафик прозрачным образом, чтобы HAproxy мог регистрировать внешний IP-адрес источника?

Спасибо

отредактировано:

Все правила Iptables:

# iptables -L --номера строк -v
Цепочка INPUT (политика ACCEPT 757M пакетов, 641G байт)
num pkts bytes target prot opt ​​in out source target         
1 0 0 ПРИНЯТЬ udp -- virbr10 любое где угодно udp dpt:domain
2 0 0 ПРИНЯТЬ tcp -- virbr10 любое где угодно tcp dpt:domain
3 83841 27M ПРИНЯТЬ udp -- virbr10 любое где угодно udp dpt:bootps
4 0 0 ПРИНЯТЬ tcp -- virbr10 любое в любом месте в любом месте tcp dpt:67
5 12 1008 ПРИНЯТЬ icmp -- любой любой 10.0.0.0/8 везде эхо-запрос icmp
6 0 0 ACCEPT icmp -- любой любой 10.0.0.0/8 везде эхо-ответ icmp

Цепочка FORWARD (политика ACCEPT 482M пакетов, 578G байт)
num pkts bytes target prot opt ​​in out source target         
1 589M 441G ПРИНЯТЬ все -- любой virbr10 где угодно 192.168.100.0/24 ctstate СВЯЗАННО, УСТАНОВЛЕНО
2 744M 637G ПРИНИМАТЬ все -- virbr10 любой 192.168.100.0/24 везде            
3 0 0 ПРИНЯТЬ все -- virbr10 virbr10 где угодно где угодно            
4 0 0 REJECT all -- любой virbr10 везде где угодно reject-with icmp-port-unreachable
5 296 11864 REJECT all -- virbr10 любой где угодно в любом месте reject-with icmp-port-unreachable

Цепочка OUTPUT (политика ACCEPT 753M пакетов, 664G байт)
num pkts bytes target prot opt ​​in out source target         
1 83839 28M ПРИНЯТЬ udp -- любой virbr10 везде где угодно udp dpt:bootpc

# iptables -L -n -t nat -v

Цепочка PREROUTING (политика ACCEPT 31M пакетов, 1964M байт)
 pkts bytes target prot opt ​​in out source target         
23743 1296K DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 to:10.0.0.7
 3935 182K DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:10.0.0.7


Цепочка INPUT (политика ACCEPT 0 пакетов, 0 байтов)
 pkts bytes target prot opt ​​in out source target         

Цепочка POSTROUTING (политика ACCEPT 9549 пакетов, 531К байт)
 pkts bytes target prot opt ​​in out source target         
    0 0 ВОЗВРАТИТЬ все -- * * 192.168.100.0/24 255.255.255.255     
 4660 280K MASQUERADE TCP -- * * 192.168.100.0/24 !192.168.100.0/24 masq порты: 1024-65535
 7729 704K MASQUERADE udp -- * * 192.168.100.0/24 !192.168.100.0/24 masq порты: 1024-65535
    2 168 МАСКАРАД все -- * * 192.168.100.0/24 !192.168.100.0/24    
    0 0 ВОЗВРАТ все -- * * 192.168.100.0/24 224.0.0.0/24        
    0 0 ВОЗВРАТИТЬ все -- * * 192.168.100.0/24 255.255.255.255     
    0 0 MASQUERADE tcp -- * * 192.168.100.0/24 !192.168.100.0/24 masq порты: 1024-65535
    0 0 MASQUERADE udp -- * * 192.168.100.0/24 !192.168.100.0/24 masq порты: 1024-65535
    0 0 МАСКАРАД все -- * * 192.168.100.0/24 !192.168.100.0/24    
  19M 1143M МАСКАРАД все -- * * 0.0.0.0/0 0.0.0.0/0           
    0 0 МАСКАРАД все -- * * 0.0.0.0/0 0.0.0.0/0           
    0 0 МАСКАРАД все -- * * 0.0.0.0/0 0.0.0.0/0           

Цепочка OUTPUT (политика ACCEPT 20209 пакетов, 2137К байт)
 pkts bytes target prot opt ​​in out source target   

(в основном это правила NAT по умолчанию для libvirt)

djdomi avatar
флаг za
просто аналогичный вопрос, почему бы не использовать HA-proxy на своем первом MAchine и использовать его для доступа к целям локальной сети?
Рейтинг:0
флаг cz

Указанное вами правило MASQUERADE слишком широкое. Вы указали маскировать весь трафик, исходящий от этого хоста через Любые Таким образом, весь трафик подвергается NAT-трансляции, а его исходный адрес перезаписывается, хотя это и не нужно, а в данном случае нежелательно.

(И почему-то правило там трижды.)

Маскарадинг следует применять только к трафику, исходящему от края в сторону Интернета, поэтому в правиле маскирования следует указать исходящий интерфейс (который имеет ваш глобальный IP-адрес). Например:

iptables -t nat -o eth0 -A POSTROUTING -j MASQUERADE

Остальные ошибочные правила маскарада следует удалить.

флаг ar
Большое спасибо за предложение о MASQUERADE только интерфейсу. К сожалению, в журнале HAproxy я все еще вижу только частный IP-адрес 10.0.0.1 вместо IP-адреса внешнего источника...
Michael Hampton avatar
флаг cz
@Ecofintech Вы также должны удалить другие правила.
флаг ar
Вы имеете в виду правила, связанные с 192.168.100.0/24? либвирт NAT?
флаг ar
Боюсь сломать virbr10 NAT libvirt...
флаг ar
Для справки, я следовал этому руководству о пользовательской конфигурации NAT Iptables libvirt: https://jamielinux.com/docs/libvirt-networking-handbook/custom-nat-based-network.html
Michael Hampton avatar
флаг cz
Нет, эти правила можно оставить в силе. Я имею в виду три правила, которые вы добавили. Или источником трафика является одна из ваших виртуальных машин? Вы сказали, что это пришло из Интернета?
флаг ar
Я удалил три правила MASQUERADE, да. Это была моя ошибка при проведении тестов. Хост-сервер отправляет трафик портов 443 и 80 на виртуальную машину с HAproxy, прослушивая интерфейс Wireguard VPN.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.