Site Tools


software:freebsd:tcpproxy_on_pf

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Last revisionBoth sides next revision
software:freebsd:tcpproxy_on_pf [2022/02/04 18:32]
– removed - external edit (Unknown date) 127.0.0.1
software:freebsd:tcpproxy_on_pf [2022/02/04 18:32]
– ↷ Page moved from ru:software:freebsd:tcpproxy_on_pf to software:freebsd:tcpproxy_on_pf root
Line 1: Line 1:
 +====== TCP proxy on PF ======
 +Обычно, достаточно написать на шлюзе одно rdr и одно pass правило, чтобы по какому то порту подключится к любому компу в сети.\\
  
 +Однако это не работает, если компьютер к которому нужно подключится:
 +  * фильтрует все адреса не принадлежащие локальной сети;
 +  * не прописал шлюз вообще;
 +  * прописал шлюз отличный от того, через который мы подключаемся.
 +
 +Некоторые в такой ситуации запускают простенькую софтину, которая проксирует соединение из интернета в локалку на нужный адрес.\\
 +Минусом то что программа должна быть запущена, настроена, потребляет память и работает ощутимо медленнее чем ядерный PF.
 +
 +===== Шаблон =====
 +<code>rdr inet proto tcp from any to (self) port $host_port_ext -> $host_addr port $host_port
 +nat on $int_if inet proto tcp from any to $host_addr port $host_port -> ($int_if)
 +nat on $ext_if inet proto tcp from $host_addr port $host_port to any -> ($ext_if)
 +
 +pass in quick on $ext_if proto tcp from any to (self) port $host_port_ext keep state
 +pass quick proto tcp from any to $host_addr port $host_port keep state</code>
 +
 +**$int_if** - внутренний интерфейс; ($int_if) - адрес внутреннего интерфейса
 +**$ext_if** - внешний интерфейс; ($ext_if) - адрес внешнего интерфейса
 +**$host_port_ext** - порт на "проксе" соединения на который будут отпроксированы на хост в локалку
 +**$host_addr** - адрес хоста в локалке к которому нужно подключится извне
 +**$host_port** - порт хоста в локалке к которому нужно подключится извне
 +
 +  - Перенаправляем трафик адресованный компьютеру - "прокси" с Free BSD + PF [из инета] на определённый порт на нужный нам хост в локалке и нужный порт.
 +  - Заменяем в пакете из интернета адресованному для внутреннего хоста адрес источника на адрес нашего "прокси" в локалке.
 +  - В пакете от внутреннего хоста заменяем его адрес внешним адресом нашего "прокси". Адрес получателя заменится автоматом на основании предыдущего правила, которое оттранслирует его обратно.
 +
 +
 +===== Пример =====
 +<code>rdr inet proto tcp from any to (self) port 9999 -> 192.168.1.7 port 22
 +nat on rl0 inet proto tcp from any to 192.168.1.7 port 22 -> 192.168.1.239
 +nat on rl0 inet proto tcp from 192.168.1.7 port 22 to any -> 1.3.8.1
 +
 +pass quick proto tcp from any to (self) port 9999 keep state
 +pass quick proto tcp from any to 192.168.1.7 port 22 keep state</code>
 +
 +Машина с фряхой была подключена к локалке, в локалке у неё был адрес **192.168.1.239**, в инете **1.3.8.1** (оба на одном сетевом интерфейсе rl0), а мне нужно было по SSH попасть в рабочую станцию **192.168.1.7**, у которой шлюз был прописан совершенно другой (туда у меня доступа не было).\\
 +В итоге подключаясь в инете на адрес **1.3.8.1:9999** я попадал на свою рабочую станцию.\\
 +Всего то 3 строчки правил заменили целую софтину. Три - потому как они делают всю работу, а две разрешающих отдельная история.\\
software/freebsd/tcpproxy_on_pf.txt · Last modified: 2022/02/05 04:37 by root