На компьютер установлен 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:
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 порта - ничего не поменялось... Я что-то не то явно пишу.