werber
@werber
Системный администратор Windows

Как правильно настроить Ubuntu/Linux шлюз на прохождение через него FTP трафика?

На компьютер установлен Ubuntu 16.04 с Gnome GUI с целью поднять на нём шлюз для прохождения через него интернет-трафика. Сразу скажу, что я новичёк в Линуксе, как таковом, до этого с Ubuntu дело не имел, как и Линуксом в целом. Прочитал в интернете статьи по настройке проброса портов, чтобы трафик шёл между двумя сетевыми интерфейсами. Так-то всё работает хорошо, устройства внутри сети за этим сервером имеют доступ в Интернет. Появилась другая проблема. Дело в том, что внутри самой локальной сети имеется роутер, к которому подключен USB жёсткий диск, роутер TP-Link Archer C50. До того, как я взялся за поднятие сервера, шлюзом работал этот конкретный роутер, и к его FTP серверу можно было обратиться как из локальной сети, так и из внешней, указывая белый адрес, выданный провайдером. Сейчас же, не совсем понимаю почему, но внутри локальной сети всё так же хорошо работает, а вот извне уже подключиться к FTP серверу локального роутера я хоть и могу, но мне сообщается о проблеме перечисления папок на сервере. Вот моя нынешняя конфигурация IPTables:
/etc/rc.local
iptables -F

#Probros FTP traffika cherez server
iptables -t nat -A PREROUTING -i enp6s1 -p tcp --dport 21 -j DNAT --to-destination 192.168.0.1
iptables -I FORWARD -i enp6s1 -o enx000ec6a60252 -d 192.168.0.1 -p tcp -m tcp --dport 21 -j ACCEPT
iptables -t nat -A POSTROUTING -o enx000ec6a60252 -p tcp --dport 21 -d 192.168.0.1 -j SNAT --to-source 192.168.0.2

iptables -t nat -A PREROUTING -i enp6s1 -p tcp --dport 20 -j DNAT --to-destination 192.168.0.1
iptables -I FORWARD -i enp6s1 -o enx000ec6a60252 -d 192.168.0.1 -p tcp -m tcp --dport 20 -j ACCEPT
iptables -t nat -A POSTROUTING -o enx000ec6a60252 -p tcp --dport 20 -d 192.168.0.1 -j SNAT --to-source 192.168.0.2

iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT

#Probros veb-mordy routera na vneshnuu set
iptables -t nat -A PREROUTING -i enp6s1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1
iptables -I FORWARD 1 -i enp6s1 -o enx000ec6a60252 -d 192.168.0.1 -p tcp -m tcp --dport 80 -j ACCEPT
iptables -t nat -A POSTROUTING -o enx000ec6a60252 -p tcp --dport 80 -d 192.168.0.1 -j SNAT --to-source 192.168.0.2

#Probros trafika dlya rejima shluza
iptables -t nat -A POSTROUTING -o enp6s1 -j MASQUERADE
iptables -A FORWARD -i enp6s1 -o enp6s1 -j REJECT
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

exit 0

Поясню по вышенаписанному:
1. enp6s1 - интегрированный сетевой интерфейс на материнской плате, который смотрит во внешнюю сеть, само собой, он должен получать настройки по DHCP от провайдера.
2. enx000ec6a60252 - сетевой интерфейс внешней USB сетевой карты, смотрящий в локальную сеть. Кабель от него идёт в роутер, от которого уже по Wi-Fi или Ethernet проводом связываются другие устройства с внешним миром.
3. 192.168.0.1 - IP адрес роутера TP-Link Archer C50, на нём работает среди прочих 21 и 80 порт. Оба отлично работают внутри локальной сети.
4. 192.168.0.2 - IP адрес сервера в режиме шлюза (Ubuntu 16.04), у которого как раз и имеются вышеописанные сетевые интерфейсы.

Как видно, я сделал проброс как FTP трафика (21 порт), так и веб-морды интерфейса роутера (80 порт). Интересно, что таким образом, если подключаться к 80 порту белого IP-адреса, то трафик успешно перенаправится на веб-морду роутера, я могу поработать с ним, как и обычно, но с FTP этот фокус не работает. Вот, что выдаёт консоль FileZilla:
Консоль FileZilla
Status: Connecting to xxx.xxx.xxx.xxx:21...
Status: Connection established, waiting for welcome message...
Status: Insecure server, it does not support FTP over TLS.
Status: Logged in
Status: Retrieving directory listing...
Status: Server sent passive reply with unroutable address. Using server address instead.
Command: LIST
Error: The data connection could not be established: ECONNREFUSED - Connection refused by server

Я точно вижу, что сервер принял данные авторизации (логин и пароль), но когда хочет перечислить список папок - вылетает в ошибку. Мне кажется, что дело в каких-то кривых конфигурациях IPTables.

UPD: FTP клиент WinSCP ещё больше подтвердил мои подозрения. Он выдаёт такую ошибку:
Server sent passive reply with unroutable address 192.168.0.1, using host address instead.
Канал передачи не может быть открыт. Причина: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.

UPD2: Добавил в rc.local строки для 20 порта - ничего не поменялось... Я что-то не то явно пишу.
UPD3: Стал подозревать в неладном роутер, выступающий FTP-сервером. Поднял FTP-сервер на другом компьютере внутри локальной сети, всё работает аналогично. Что другие компьютеры, что шлюз-сервер - свободно подключаются к FTP серверу по внутреннему его адресу. Если же я обращаюсь через внешний белый IP адрес, постигаю неудачу, всё заканчивается в логах FileZilla сервера следующими строками:
(000009)25.07.2018 18:40:28 - user (192.168.0.2)> STAT
(000009)25.07.2018 18:40:28 - user (192.168.0.2)> 500 Syntax error, command unrecognized.
(000009)25.07.2018 18:40:28 - user (192.168.0.2)> SYST
(000009)25.07.2018 18:40:28 - user (192.168.0.2)> 215 UNIX emulated by FileZilla
(000009)25.07.2018 18:40:28 - user (192.168.0.2)> PASV
(000009)25.07.2018 18:40:28 - user (192.168.0.2)> 227 Entering Passive Mode (192,168,0,3,250,221)
  • Вопрос задан
  • 798 просмотров
Пригласить эксперта
Ответы на вопрос 3
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
FTP - очень старый протокол, разработанный в эпоху "безопасного Интернета", которая кончилась где-то в 2004 году... У него два порта и два направления трафика - порт управления и порт данных. И два режима - активный и пассивный. Порт 21 - это порт управления, по нему отдают команды. А вот все данные, даже оглавление папок передается по порту 20 - ftp-data. И тут как раз играет рояль - активный или пассивный (поручики, молчать!).
Активный сервер отдает клиенту порт, по которому он будет подключаться к клиенту и передавать данные. Пассивный ждет порт от клиента, но подключаться все равно будет сам.
Ответ написан
@notwrite
FTP дело муторное. там нужны еще 20 и gt 1024 порты в зависимости от режима подключения(активный , пассивный)
Для упрощения копать в сторону nf_conntrack.
Ответ написан
Комментировать
Znardi
@Znardi
IPT -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
разрешение для инициированных соединений можно попробовать добавить
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
20 апр. 2024, в 13:56
7000 руб./за проект
20 апр. 2024, в 13:52
7000 руб./за проект
20 апр. 2024, в 13:23
1000 руб./за проект