Site Tools


software:freebsd:tcpproxy_on_pf

This is an old revision of the document!


TCP proxy on PF

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

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

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

Некоторые в такой ситуации запускают простенькую софтину, которая проксирует соединение из интернета в локалку на нужный адрес.

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.1431599176.txt.gz · Last modified: 2015/05/14 10:26 by root