Перевод этой страницы:
ru

Инструменты пользователя

Инструменты сайта


ru:software:freebsd:tcpproxy_on_pf

Это старая версия документа!


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 строчки правил заменили целую софтину. Три - потому как они делают всю работу, а две разрешающих отдельная история.

ru/software/freebsd/tcpproxy_on_pf.1431599176.txt.gz · Последние изменения: 2015/05/14 10:26 — root