Site Tools


software:freebsd:tcpproxy_on_pf

TCP proxy on PF

Обычно, достаточно написать на шлюзе одно rdr и одно pass правило, чтобы по какому то порту подключится к любому компу в сети.

Однако это не работает, если компьютер к которому нужно подключится:

  • фильтрует все адреса не принадлежащие локальной сети;
  • не прописал шлюз вообще;
  • прописал шлюз отличный от того, через который мы подключаемся.

Некоторые в такой ситуации запускают простенькую софтину, которая проксирует соединение из интернета в локалку на нужный адрес.
Минусом то что программа должна быть запущена, настроена, потребляет память и работает ощутимо медленнее чем ядерный PF.

Шаблон

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

$int_if - внутренний интерфейс; ($int_if) - адрес внутреннего интерфейса $ext_if - внешний интерфейс; ($ext_if) - адрес внешнего интерфейса $host_port_ext - порт на “проксе” соединения на который будут отпроксированы на хост в локалку $host_addr - адрес хоста в локалке к которому нужно подключится извне $host_port - порт хоста в локалке к которому нужно подключится извне

  1. Перенаправляем трафик адресованный компьютеру - “прокси” с Free BSD + PF [из инета] на определённый порт на нужный нам хост в локалке и нужный порт.
  2. Заменяем в пакете из интернета адресованному для внутреннего хоста адрес источника на адрес нашего “прокси” в локалке.
  3. В пакете от внутреннего хоста заменяем его адрес внешним адресом нашего “прокси”. Адрес получателя заменится автоматом на основании предыдущего правила, которое оттранслирует его обратно.

Пример

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

Машина с фряхой была подключена к локалке, в локалке у неё был адрес 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