Intereting Posts

трансляция сетевых адресов iptables из локальной сети в vpn

13 июня 2018 года: я нашел решение и отредактировал этот пост на тот случай, если он кому-нибудь пригодится.

Во-первых, оригинальный пост:

У меня есть портал, на котором я хочу выполнить преобразование сетевого адреса с его общедоступного IP-адреса и определенного номера публичного порта на конкретный IP-адрес VPN и конкретный номер порта VPN, как для трафика TCP, так и для UDP, для RTSP- и-RTP-туннелируется поверх HTTP. Проблема в том, что пакеты не проходят. Портал, кроме запуска openvpn, имеет сервер apache2, чьи операторы proxypass и proxypassreverse позволяют мне маршрутизировать трафик между LAN и VPN, но только для трафика TCP. Поскольку apache2 не может обрабатывать трафик UDP, я пытаюсь настроить iptables, чтобы сделать это для меня. Есть только один интерфейс Ethernet. Устройства в сети VPN находятся в Интернете, поэтому трафик eth0 и tun0 проходит через eth0.

Я установил правила в iptables и включил пересылку для eth0 ( /proc/sys/net/ipv4/conf/eth0/forwarding = 1 ) и tun0 ( /proc/sys/net/ipv4/conf/tun0/forwarding = 1 ) и все (‘/ proc / sys / net / ipv4 / ip_forward = 1’), но ничего не происходит.

Я добавил следующие правила в правила iptables по умолчанию:

 -A PREROUTING -d 192.168.192.203/32 -p udp -m udp --dport 10073 -j DNAT --to-destination 10.221.0.73:80 -A PREROUTING -d 192.168.192.203/32 -p tcp -m tcp --dport 10073 -j DNAT --to-destination 10.221.0.73:80 -A POSTROUTING -s 10.221.0.73/32 -p udp -m udp --sport 80 -j SNAT --to-source 192.168.192.203 -A POSTROUTING -s 10.221.0.73/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.192.203 

а также

 -A FORWARD -d 10.221.0.73/32 -p udp -m state --state NEW,RELATED,ESTABLISHED -m udp --dport 80 -j ACCEPT -A FORWARD -d 10.221.0.73/32 -p tcp -m state --state NEW,RELATED,ESTABLISHED -m tcp --dport 80 -j ACCEPT 

С этими правилами я пытаюсь получить трафик UDP и TCP из Интернета (в данном примере я использую 192.168.192.203) для порта 10073 и переслать его на IP-адрес VPN 10.221.0.73 и порт 80.

Вот полный набор правил:

 # Generated by iptables-save v1.4.14 on Thu Jun 7 16:52:00 2018 *raw :PREROUTING ACCEPT [1930:216976] :OUTPUT ACCEPT [1477:229328] -A PREROUTING -p udp -m udp --dport 8073 -j TRACE -A OUTPUT -p udp -m udp --sport 8073 -j TRACE COMMIT # Completed on Thu Jun 7 16:52:00 2018 # Generated by iptables-save v1.4.14 on Thu Jun 7 16:52:00 2018 *nat :PREROUTING ACCEPT [462:32832] :INPUT ACCEPT [462:32832] :OUTPUT ACCEPT [98:6069] :POSTROUTING ACCEPT [98:6069] -A PREROUTING -d 192.168.192.203/32 -p udp -m udp --dport 10073 -j DNAT --to-destination 10.221.0.73:80 -A PREROUTING -d 192.168.192.203/32 -p tcp -m tcp --dport 10073 -j DNAT --to-destination 10.221.0.73:80 -A POSTROUTING -s 10.221.0.73/32 -p udp -m udp --sport 80 -j SNAT --to-source 192.168.192.203 -A POSTROUTING -s 10.221.0.73/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.192.203 COMMIT # Completed on Thu Jun 7 16:52:00 2018 # Generated by iptables-save v1.4.14 on Thu Jun 7 16:52:00 2018 *filter :INPUT ACCEPT [1738:195868] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [1333:210602] :ufw-after-forward - [0:0] :ufw-after-input - [0:0] :ufw-after-logging-forward - [0:0] :ufw-after-logging-input - [0:0] :ufw-after-logging-output - [0:0] :ufw-after-output - [0:0] :ufw-before-forward - [0:0] :ufw-before-input - [0:0] :ufw-before-logging-forward - [0:0] :ufw-before-logging-input - [0:0] :ufw-before-logging-output - [0:0] :ufw-before-output - [0:0] :ufw-reject-forward - [0:0] :ufw-reject-input - [0:0] :ufw-reject-output - [0:0] :ufw-track-input - [0:0] :ufw-track-output - [0:0] -A INPUT -j ufw-before-logging-input -A INPUT -j ufw-before-input -A INPUT -j ufw-after-input -A INPUT -j ufw-after-logging-input -A INPUT -j ufw-reject-input -A INPUT -j ufw-track-input -A FORWARD -j ufw-before-logging-forward -A FORWARD -j ufw-before-forward -A FORWARD -j ufw-after-forward -A FORWARD -j ufw-after-logging-forward -A FORWARD -j ufw-reject-forward -A FORWARD -d 10.221.0.73/32 -p udp -m state --state NEW,RELATED,ESTABLISHED -m udp --dport 80 -j ACCEPT -A FORWARD -d 10.221.0.73/32 -p tcp -m state --state NEW,RELATED,ESTABLISHED -m tcp --dport 80 -j ACCEPT -A OUTPUT -j ufw-before-logging-output -A OUTPUT -j ufw-before-output -A OUTPUT -j ufw-after-output -A OUTPUT -j ufw-after-logging-output -A OUTPUT -j ufw-reject-output -A OUTPUT -j ufw-track-output COMMIT # Completed on Thu Jun 7 16:52:00 2018 

Как я могу это исправить? Заранее спасибо.

Во-вторых, вот как я это исправил …

Я настроил tcpdump на машине, которую я использую в качестве маршрутизатора, и на машине, на которую я пересылаю трафик. Ключ должен был установить достаточно широкие правила для выбора соответствующих пакетов для отчета, так как другой трафик проходил через обе машины, и сообщать с достаточной детализацией. И, чтобы упростить задачу, я изменил маршрутизатор на тот, который был также хостом OpenVPN, а не клиентом OpenVPN.

Вот команда, которую я использовал на компьютере с маршрутизатором, чей IP-адрес локальной сети 192.168.192.166, а чей IP-адрес VPN 10.254.0.1:

 tcpdump -n -vv -c 5000 "port 80 or port 10073 or host 10.254.0.1 or host 10.254.0.73 or (host 192.168.192.166 and port 80) or (host 192.168.192.166 and port 10073)" -i any 

10.254.0.73 – это машина, на которую я пересылаю пакеты, используя ее порт 80. Я отправляю пакеты на порт 10073 на маршрутизаторе.

Вот команда для машины, на которую я пересылаю пакеты:

 tcpdump -vv -n -c 5000 "port 80 or port 10073 or host 192.168.192.166 or host 10.254.0.1" -i any 

«-I any» принимает трафик как на мой «публичный» порт eth0, так и на мой «частный» порт tun0.

Вот правила маршрутизации, которые работают для меня:

 root@B16:~# iptables-save # Generated by iptables-save v1.3.8 on Wed Jun 13 14:52:56 2018 *mangle :PREROUTING ACCEPT [73673:9416551] :INPUT ACCEPT [71740:8067234] :FORWARD ACCEPT [1933:1349317] :OUTPUT ACCEPT [120157:14972014] :POSTROUTING ACCEPT [122090:16321331] COMMIT # Completed on Wed Jun 13 14:52:56 2018 # Generated by iptables-save v1.3.8 on Wed Jun 13 14:52:56 2018 *nat :PREROUTING ACCEPT [12313:867446] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [11426:951748] -A PREROUTING -i eth0 -p udp -m udp --dport 10073 -j DNAT --to-destination 10.254.0.73:80 -A PREROUTING -i eth0 -p tcp -m tcp --dport 10073 -j DNAT --to-destination 10.254.0.73:80 -A POSTROUTING -j MASQUERADE COMMIT # Completed on Wed Jun 13 14:52:56 2018 # Generated by iptables-save v1.3.8 on Wed Jun 13 14:52:56 2018 *filter :INPUT ACCEPT [71741:8067274] :FORWARD ACCEPT [1250:1319002] :OUTPUT ACCEPT [120162:14973202] :INBOUND - [0:0] :LOG_FILTER - [0:0] :LSI - [0:0] :LSO - [0:0] :OUTBOUND - [0:0] -A FORWARD -d 10.254.0.73 -p tcp -m tcp --dport 80 -j ACCEPT -A FORWARD -d 10.254.0.73 -p udp -m udp --dport 80 -j ACCEPT COMMIT # Completed on Wed Jun 13 14:52:56 2018 

Я не нашел TRACE в iptables полезным, потому что было слишком сложно получить правильные правила. Использование tcpdump спасло день, ОДНАЖДЫ я получил правильные правила и многословие, потому что я мог видеть, когда пересылка начала работать, но эти пакеты не возвращались маршрутизатору; их возвращали на ноутбук, который пытался пересылать сообщения через маршрутизатор. Я также мог видеть, что ошибки контрольной суммы происходили – это было совершенно неожиданно.

Я прочитал много противоречивых постов, каждый с «это работает для меня», но они не работали для меня. Одна проблема заключалась в том, что правила iptables, по-видимому, зависят от ОС; Я использую Debian, и это изменило их, кто знает почему. Я никогда не мог найти подробное объяснение того, как создать правила iptables, только несколько примеров.

Приветствия.