Я пытался заставить перенаправление портов работать на машине. Я прочитал здесь много тем, касающихся этой проблемы, но я не могу заставить ее работать. План состоит в том, чтобы перенаправить весь входящий трафик на ppp0 на порт 5000 на устройство на eth0. Вот правила, которые я пробовал (собраны с этого сайта):
iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport 5000 -j DNAT --to-destination 192.168.5.242:5000
iptables -A FORWARD -p tcp -d 192.168.5.242 --dport 5000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -j MASQUERADE -o ppp0
Это не сработало. Следующая попытка была такой:
iptables -A PREROUTING -t nat -i ppp0 -p tcp --dport 5000 -j DNAT --to 192.168.5.242:5000
iptables -A INPUT -p tcp -m state --state NEW --dport 5000 -i ppp0 -j ACCEPT
iptables -t nat -A POSTROUTING -j MASQUERADE -o ppp0
При доступе к этому компьютеру на этом порту я получаю отказ в соединении без этих правил и тайм-аут соединения с правилами. Итак, что-то работает, но не так, как задумано.
Как я могу проверить, что делаю не так?
Вам нужно использовать правило FORWARD с PREROUTING. Причина в том, что изменение IP-адреса назначения выполняется до применения каких-либо правил из таблицы FILTER - проверьте этот рисунок для порядка, в котором правила различных таблиц iptables применяются к пакетам.
Таким образом, вам понадобится NAT на входе и пересылка для этого NAT. Ретрансляция на выходе (если соединение было инициализировано извне при адресации ppp0: 5000) будет выполняться правилом DNAT.
iptables -A PREROUTING -t nat -i ppp0 -p tcp --dport 5000 -j DNAT --to 192.168.5.242:5000
iptables -A FORWARD -p tcp -d 192.168.5.242 --dport 5000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Также необходимо активировать перенаправление IP как таковое; если вам это нужно только временно (до следующего выключения системы), вы можете использовать
echo 1 > /proc/sys/net/ipv4/ip_forward
Если вы хотите постоянно активировать переадресацию портов, вам необходимо изменить файл /etc/sysctl.conf
, изменяя значение net.ipv4.ip_forward
к 1
.
Если вы также хотите использовать NAT на выходе, чтобы компьютеры в вашей частной сети могли подключаться к внешнему миру, вы можете использовать
iptables -t nat -A POSTROUTING -j MASQUERADE -o ppp0
Примечание: для этого вам не нужно правило переадресации.
Чтобы узнать, какая таблица содержит какие правила, вы можете использовать
iptables -t [table] -S
для неструктурированного представления правил [table] (FILTER NAT MANGLE - это таблицы iptables; если вы хотите FILTER, вам не нужно -t FILTER
поскольку FILTER - это таблица по умолчанию, которую оценивают все вызовы iptables), или
iptables -t [table] -L
для просмотра правил разбивается на цепочки таблицы.
Проверить страницы руководства для ДЕЙСТВИТЕЛЬНО детального просмотра iptables - принесите много времени, если хотите глубже :)
Прежде всего, разрешив только NEW
подключений не хватает. Итак, вы должны использовать такое правило:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Возможно, вам потребуется включить маршрутизацию IPv4. Значение /proc/sys/net/ipv4/ip_forward
должно быть 1. Попробуйте использовать echo 1 > /proc/sys/net/ipv4/ip_forward
как суперпользователь.