Linux iptables проброс всех портов

How can I port forward with iptables?

How about this: I’m a programmer trying to set up an environment so I can debug my server application in eclipse being called from the innernet. Close enough?

8 Answers 8

First of all — you should check if forwarding is allowed at all:

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

If both returns 1 it’s ok. If not do the following:

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

Second thing — DNAT could be applied on nat table only. So, your rule should be extended by adding table specification as well ( -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 

Both rules are applied only to TCP traffic (if you want to alter UDP as well, you need to provide similar rules but with -p udp option set).

Last, but not least is routing configuration. Type:

and check if 192.168.1.0/24 is among returned routing entries.

second line: «iptables -A FORWARD -p tcp -d 192.168.1.200 —dport 8080 -m state —state NEW,ESTABLISHED,RELATED -j ACCEPT» is NOT required if you don’t have firewall restrictions/security, which is the case with most of home LANs, otherwise be careful with -A, be cause it will add it AFTER restrictions/security and may not work (so check -I instead, that is adding IN FRONT of iptables rules)

You forget postrouting source address 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 

And don’t forget to set your linux firewall as default gateway on computer with 192.168.1.200 address.

You got it backwards on the POSTROUNTING step. At this point the conversation is still about —destination rather than —source .

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 

ummm. that IS what I have already. I use iptables-restore to load it so each is in its own section, but that’s what I wrote above.

Okay, the syntax looked bad in the original. Did you try -i ppp0 in the rules? What is the problem exactly?

Читайте также:  Freeing memory in linux

The accepted solution works when the destination host and the gateway are on the same subnet (like is in your case, both are on eth0 192.168.1.0/24).

Below is a generic solution for when the gateway, source and destination are all on different subnets.

1) Enable IP forwarding:

sysctl net.ipv4.conf.eth0.forwarding=1 sysctl net.ipv6.conf.eth0.forwarding=1 

2) Add 2 iptables rules to forward a specific TCP port:

To rewrite the destination IP of the packet (and back in the reply packet):

iptables -A PREROUTING -t nat -p tcp -i ppp0 --dport 8001 -j DNAT --to-destination 192.168.1.200:8080 

To rewrite the source IP of the packet to the IP of the gateway (and back in the reply packet):

iptables -A POSTROUTING -t nat -p tcp -d 192.168.1.200 --dport 8080 -j MASQUERADE 

3) If you don’t have a default ACCEPT firewall rule, allow traffic to the destination:

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

4) Test the new setup. If it works, make sure the changes persist across reboots:

cat /etc/sysctl.d/99-forwarding.conf sysctl net.ipv4.conf.eth0.forwarding=1 sysctl net.ipv6.conf.eth0.forwarding=1 EOF iptables-save > /etc/network/iptables.up.rules echo '#!/bin/sh' > /etc/network/if-pre-up.d/iptables echo "`which iptables-restore` < /etc/network/iptables.up.rules" >> /etc/network/if-pre-up.d/iptables chmod +x /etc/network/if-pre-up.d/iptables 

I guess that should be the accepted answer because the others do not consider the POSTROUTING part which solves the problem of calling wanIP:8081 from the LAN.

This worked for me, first time, after months of flailing with various inferior alternatives. Most excellent. I guess someone named «rusty» can be trusted when it comes to iptables. 🙂

I have created the following bash script for doing this on my linux router. It automatically infers the WAN IP and confirms your selections before proceeding.

#!/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 

The use of the script is simple just copy and paste it to a file and then.

# 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 

I thought this might save someone time on their respective router.

Читайте также:  Best image viewers linux

Источник

Настройка netfilter с помощью iptables

Обновлено

Обновлено: 20.06.2023 Опубликовано: 22.02.2017

Утилита командной строки iptables используется для настройки брандмауэра netfilter, встроенного в систему на базе ядра Linux.

Данная инструкция подходит как для чайников, которые хотят разбираться в аспектах защиты сети, так и опытных специалистов в качестве шпаргалки.

Принцип настройки

Общий синтаксис использования iptables:

Правила netfilter распределены по 4-м таблицам, каждая из которых имеет свое назначение (подробнее ниже). Она указывается ключом -t, но если данный параметр не указан, действие будет выполняться для таблицы по умолчанию — filter.

Команды указывают, какое именно действие мы совершаем над netfilter, например, создаем или удаляем правило.

В каждой таблице есть цепочки, для каждой из которых создаются сами правила. Например, для вышеупомянутой таблицы filter есть три предопределенные цепочки — INPUT (входящие пакеты), OUTPUT (исходящие) и FORWARD (транзитные).

Некоторые команды требуют указания номера правила, например, на удаление или редактирование.

Условие описывает критерии отработки того или иного правила.

Ну и, собственно, что делаем с пакетом, если он подходит под критерии условия.

* справедливости ради, стоит отметить, что ключ с действием не обязан идти в конце. Просто данный формат чаще всего встречается в инструкциях и упрощает чтение правил.

Ключи iptables и примеры их использования

Для работы с таблицами (iptables -t)

Напоминаю, все правила в netfilter распределены по таблицам. Чтобы работать с конкретной таблицей, необходимо использовать ключ -t.

Ключ Описание
-t filter Таблица по умолчанию. С ней работаем, если упускаем ключ -t. Встроены три цепочки — INPUT (входящие), OUTPUT (исходящие) и FORWARD (проходящие пакеты)
-t nat Для пакетов, устанавливающий новое соединение. По умолчанию, встроены три цепочки — PREROUTING (изменение входящих), OUTPUT (изменение локальных пакетов перед отправкой) и POSTROUTING (изменение всех исходящих).
-t mangle Для изменения пакетов. Цепочки — INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING.
-t raw Для создания исключений в слежении за соединениями. Цепочки: PREROUTING, OUTPUT.

Команды

Нижеперечисленные ключи определяют действия, которые выполняет утилита iptables.

Ключ Описание и примеры
-A Добавление правила в конец списка:
iptables -A INPUT -s 192.168.0.15 -j DROP
запретить входящие с 192.168.0.15.
-D Удаление правила:
iptables -D INPUT 10
удалить правило в цепочке INPUT с номером 10.
-I Вставка правила в определенную часть списка:
iptables -I INPUT 5 -s 192.168.0.15 -j DROP
вставить правило 5-м по списку.
-R Замена правила.
iptables -R OUTPUT 5 -s 192.168.0.15 -j ACCEPT
заменить наше 5-е правило с запрещающего на разрешающее.
-F Сброс правил в цепочке.
iptables -F INPUT
-Z Обнуление статистики.
iptables -Z INPUT
-N Создание цепочки.
iptables -N CHAINNEW
-X Удаление цепочки.
iptables -X CHAINNEW
-P Определение правила по умолчанию.
iptables -P INPUT DROP
-E Переименовывание цепочки.
iptables -E CHAINNEW CHAINOLD

Условия

Данные ключи определяют условия правила.

Читайте также:  Install firmware linux debian
Ключ Описание и примеры
-p Сетевой протокол. Допустимые варианты — TCP, UDP, ICMP или ALL.
iptables -A INPUT -p tcp -j ACCEPT
разрешить все входящие tcp-соединения.
-s Адрес источника — имя хоста, IP-адрес или подсеть в нотации CIDR.
iptables -A INPUT -s 192.168.0.50 -j DROP
запретить входящие с узла 192.168.0.50
-d Адрес назначения. Принцип использования аналогичен предыдущему ключу -s.
iptables -A OUTPUT -d 192.168.0.50 -j DROP
запретить исходящие на узел 192.168.0.50
-i Сетевой адаптер, через который приходят пакеты (INPUT).
iptables -A INPUT -i eth2 -j DROP
запретить входящие для Ethernet-интерфейса eth2.
-o Сетевой адаптер, с которого уходят пакеты (OUTPUT).
iptables -A OUTPUT -o eth3 -j ACCEPT
разрешить исходящие с Ethernet-интерфейса eth3.
—dport Порт назначения.
iptables -A INPUT -p tcp —dport 80 -j ACCEPT
разрешить входящие на порт 80.
—sport Порт источника.
iptables -A INPUT -p tcp —sport 1023 -j DROP
запретить входящие с порта 1023.

Перечисленные ключи также поддерживают конструкцию с использованием знака !. Он инвертирует условие, например,
iptables -A INPUT -s ! 192.168.0.50 -j DROP
запретит соединение всем хостам, кроме 192.168.0.50.

Действия

Действия, которые будут выполняться над пакетом, подходящим под критерии условия. Для каждой таблицы есть свой набор допустимых действий. Указываются с использованием ключа -j.

Таблица Действие Описание
filter ACCEPT Разрешает пакет.
DROP Запрещает пакет.
REJECT Запрещает с отправкой сообщения источнику.
nat MASQUERADE Для исходящих пакетов заменяет IP-адрес источника на адрес интерфейса, с которого уходит пакет.
SNAT Аналогично MASQUERADE, но с указанием конкретного сетевого интерфейса, чей адрес будет использоваться для подмены.
DNAT Подмена адреса для входящих пакетов.
REDIRECT Перенаправляет запрос на другой порт той же самой системы.
mangle TOS Видоизменение поля TOS (приоритезация трафика).
DSCP Изменение DSCP (тоже приоритезация трафика).
TTL Изменение TTL (время жизни пакета).
HL Аналогично TTL, но для IPv6.
MARK Маркировка пакета. Используется для последующей фильтрации или шейпинга.
CONNMARK Маркировка соединения.
TCPMSS Изменение значения MTU.

Примеры часто используемых команд iptables

Общие команды

Просмотр правил с их номерами:

Для каждой таблицы смотреть правила нужно отдельно:

Источник

Оцените статью
Adblock
detector