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