Как я могу портировать с iptables?

118

Я хочу, чтобы соединения, входящие на ppp0 через порт 8001, были направлены на 192.168.1.200 на eth0 на порт 8080.

У меня есть эти два правила

-A PREROUTING  -p tcp -m tcp --dport 8001 -j DNAT --to-destination 192.168.1.200:8080

-A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT

и это не работает. Что мне не хватает?

Stu
источник
6
NAT HOWTO
Пол Томблин
Я собираюсь пойти с тэгом npr (хотя это может быть связано с программированием, хотя и плохо сформулировано, конечно.)
Михай Лимбашан
Как насчет этого: я программист, пытающийся настроить среду, чтобы я мог отлаживать свое серверное приложение в eclipse, вызываемом из внутренней сети. Достаточно близко?
Конечно, это я и имел в виду под «плохо сформулированными» ... Не могли бы вы отредактировать вопрос соответствующим образом?
Михай Лимбашан

Ответы:

97

Прежде всего - вы должны проверить, разрешена ли переадресация вообще:

cat /proc/sys/net/ipv4/conf/ppp0/forwarding 
cat /proc/sys/net/ipv4/conf/eth0/forwarding 

Если оба возвращаются, 1все в порядке. Если нет, сделайте следующее:

echo '1' | sudo tee /proc/sys/net/ipv4/conf/ppp0/forwarding
echo '1' | sudo tee /proc/sys/net/ipv4/conf/eth0/forwarding

Второе - DNATможно наносить natтолько на стол. Итак, ваше правило должно быть расширено путем добавления спецификации таблицы ( -t nat):

iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport 8001 -j DNAT --to-destination 192.168.1.200:8080
iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Оба правила применяются только к TCP-трафику (если вы также хотите изменить UDP, вам нужно предоставить аналогичные правила, но с -p udpнабором опций).

И последнее, но не менее важное - это настройка маршрутизации. Тип:

ip route

и проверьте, есть ли 192.168.1.0/24среди возвращенных записей маршрутизации.

oo_olo_oo
источник
16
Я лично предпочитаю sysctlсинтаксис вродеsysctl net.ipv4.conf.eth0.forwarding=1
Doud
1
Как мне удалить неправильно введенное правило?
Николай Лещов
2
вторая строка: «iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m состояние --state NEW, ESTABLISHED, RELATED -j ACCEPT» НЕ требуется, если у вас нет ограничений / безопасности брандмауэра, которые в случае с большинством домашних локальных сетей, в противном случае будьте осторожны с -A, потому что он добавит его ПОСЛЕ ограничений / безопасности и может не работать (поэтому проверьте -I вместо этого, то есть добавление В
ПЕРЕД
2
@ ÁronLőrincz, Нет. Правила Iptables изменчивы, если они явно не загружены при загрузке.
sherrellbc
1
@ Николай Лешов, введите то же самое, заменяя -Aна-D
Алексей Мартианов
14

Я думаю, что вы хотите, это:

iptables -A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state 
    NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A PREROUTING -p tcp --dport 8001 -j DNAT --to-destination
    192.168.1.200:8080
Роберт Гэмбл
источник
2
ммм ... это то, что у меня уже есть. Я использую iptables-restore, чтобы загрузить его, чтобы каждый находился в отдельном разделе, но это то, что я написал выше.
Хорошо, синтаксис выглядел плохо в оригинале. Вы пробовали -i ppp0 в правилах? В чем именно проблема?
Роберт Гэмбл
13

Вы забыли отправить адрес источника SNAT 'ing:

sysctl net.ipv4.ip_forward=1
yours_wan_ip=101.23.3.1
-A PREROUTING  -p tcp -m tcp -d $yours_wan_ip --dport 8001 -j DNAT --to-destination 192.168.1.200:8080

-A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT

-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip

И не забудьте установить брандмауэр linux в качестве шлюза по умолчанию на компьютере с адресом 192.168.1.200.

Zealotous
источник
Вы получили это назад на POSTROUNTINGшаге. На данный момент разговор все еще о --destinationчем --source.
sherrellbc
6

Я создал следующий скрипт bash для этого на моем роутере linux. Он автоматически определяет WAN IP и подтверждает ваш выбор, прежде чем продолжить.

#!/bin/bash

# decide which action to use
action="add"
if [[ "-r" == "$1" ]]; then
  action="remove"
  shift
fi

# break out components
dest_addr_lan="$1"
dest_port_wan="$2"
dest_port_lan="$3"

# figure out our WAN ip
wan_addr=`curl -4 -s icanhazip.com`

# auto fill our dest lan port if we need to
if [ -z $dest_port_lan ]; then
  dest_port_lan="$dest_port_wan"
fi

# print info for review
echo "Destination LAN Address: $dest_addr_lan"
echo "Destination Port WAN: $dest_port_wan"
echo "Destination Port LAN: $dest_port_lan"
echo "WAN Address: $wan_addr"

# confirm with user
read -p "Does everything look correct? " -n 1 -r
echo    # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]; then
  if [[ "remove" == "$action" ]]; then
    iptables -t nat -D PREROUTING  -p tcp -m tcp -d $wan_addr --dport     $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -D FORWARD -m state -p tcp -d $dest_addr_lan --dport     $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -D POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport     $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Forwarding rule removed"
  else
    iptables -t nat -A PREROUTING  -p tcp -m tcp -d $wan_addr --dport     $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -A FORWARD -m state -p tcp -d $dest_addr_lan --dport     $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -A POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Forwarding rule added"
  fi
else
  echo "Info not confirmed, exiting..."
fi

Использование скрипта просто, просто скопируйте и вставьте его в файл, а затем.

# chmod +x port_forward.sh
# ./port_forward.sh 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule added

Удалить то же правило

# ./port_forward.sh -r 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule removed

Я думал, что это может сэкономить кому-то время на соответствующем маршрутизаторе.

Nullivex
источник
2

У меня была задача заставить MACHINE_A подумать, что служба физически работает на MACHINE_B, но прозрачно перенаправить все запросы на MACHINE_C.

Хитрость заключалась в том, чтобы использовать MASQUERADE.

sysctl net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp -d MACHINE_B --dport 443 -j DNAT --to-destination MACHINE_C

iptables -t nat -A POSTROUTING -s MACHINE_A -o INTERFACE_NAME -j MASQUERADE

Обратите внимание, что вы можете настроить команды:

  1. Разрешить пересылку пакетов только на определенном интерфейсе. Например:

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. Чтобы разрешить не только MACHINE_A, но и всем остальным использовать переадресацию портов, удалите:

    -s MACHINE_A
    
Денис Щербаков
источник
1

Пытаться

echo "1" > /proc/sys/net/ipv4/conf/ppp0/forwarding
echo "1" > /proc/sys/net/ipv4/conf/eth0/forwarding

Эти файлы сообщают ядру, что ему разрешено пересылать пакеты между интерфейсами.

Адам Лисс
источник
0

Эта команда не работает для меня:

-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip

У меня есть 2 LAN-интерфейса и FORWARD работают, когда я напишу:

iptables -t nat -A POSTROUTING -o $LAN_IF -p tcp -m tcp --dport $FW_PORT -j SNAT --to-source $LAN_IP
  • LAN_IF - интерфейс локальной сети (например, eth1, br0 ...)
  • FW_PORD - перенаправленный порт (на узле назначения)
  • LAN_IP - IP-адрес на интерфейсе локальной сети (на маршрутизаторе)

Конечно, тоже нужны PREROUTING и FORWARD :)

Андрей
источник