Проброс портов в Iptables на CentOS 7

Сценарий работы системы только с iptables на хосте, без firewalld:

[root@ip-172-31-95-207 ~]# cat iptables-firewall.sh

#!/bin/bash

iptables -F

iptables -t filter -A INPUT -i lo -j ACCEPT

iptables -t filter -A INPUT -s 0/0 -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -t filter -A INPUT -p icmp -j ACCEPT

iptables -t filter -A INPUT -s 0/0 -p tcp --dport 22 -j ACCEPT

iptables -t filter -P INPUT DROP


Проверяем iptables после добавления правил:

[root@ip-172-31-95-207 ~]# iptables -v -L -n --line-numbers


Альтернативные варианты просмотра правил: 
[root@ip-172-31-95-207 ~]# iptables -S -t filter
[root@ip-172-31-95-207 ~]# iptables-save 

Проверяем таблицу nat:


На локальном хосте работает веб-сервер Apache используя 8080 порт:



Открываем 8080 порт через iptables в таблице filter и цепочке INPUT, а так же добавляем в таблицу nat и цепочку PREROUTING редирект с 80 порта на 8080. В таблице nat цепочка PREROUTING сработает раньше с настроеным редиректом, поэтому в таблице filter и цепочке INPUT достаточно будет оставить открытым только один 8080 порт.

[root@ip-172-31-95-207 ~]# cat iptables-firewall.sh
#!/bin/bash
iptables -F
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A INPUT -s 0/0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A INPUT -s 0/0 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -s 0/0 -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
iptables -t filter -P INPUT DROP

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080


Проверяем после выполнения скрипта, что правила действительно добавлены:


AWS Security Group открыты только для 80 порта:



Подключаемся на публичный адрес и смотрим работает ли редирект с 80 порта на 8080:





NAT проброс iptables:


# echo 1 > /proc/sys/net/ipv4/ip_forward

# iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 172.31.94.52:80

# iptables -t filter -I FORWARD -p tcp -d 172.31.94.52 --dport 80 -m state --state NEW -j ACCEPT

# iptables -t filter -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT


# iptables -t nat -A POSTROUTING -j MASQUERADE


Еще один пример небольшого конфига iptables:

[root@ip-172-31-95-207 ~]# cat iptables-rules.sh

#!/bin/bash

iptables -t mangle -A PREROUTING -p tcp --dport 22 -j TOS --set-tos 0x10

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --name ssh-list --set -m comment --comment "track new ssh connections"
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --name ssh-list --update --seconds 1800 --hitcount 5 -j DROP -m coment --comment "drop ssh bruteforce atempt for 30 minutes after 4 atempts" 
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -s 172.16.0.0/12 -j ACCEPT
# log iptables denied calls (access via 'dmesg' command)
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
iptables -A INPUT -j DROP

iptables -t mangle -A OUTPUT -p tcp --sport 22 -j TOS --set-tos 0x10
iptables -t mangle -A OUTPUT -m tos --tos 0x10 -j LOG --log-prefix "iptables set TOS 0x10: " --log-level 4
iptables -A OUTPUT -j ACCEPT

iptables -A FORWARD -j DROP


Комментарии