NAT via iptables to VirtualMachine [Решено]

Вопросы связанные с сетями, их настройкой и работой...
Post Reply
User avatar
Gen1us2k
Модератор
Модератор
Posts: 771
Joined: 02 Mar 2010, 16:13

NAT via iptables to VirtualMachine [Решено]

Post by Gen1us2k » 17 Apr 2010, 10:53

Надо кинуть инет на виртульную машину. Сама виртуальная машина настроена как Host-Only Adapter. в таком случае инет кидаеться. Но где то у меня косяк. хз где
[spoiler]

Code: Select all

#!/bin/sh
#------------------------------------------------------------------------------
# Переменные
#------------------------------------------------------------------------------
IPT='/sbin/iptables' #iptables
MODPROBE="/sbin/modprobe"
ARP="/usr/sbin/arp"
IP6TABLES=/sbin/ip6tables
TC=/sbin/tc
INDEV=ppp0
#------------------------------------------------------------------------------
# Логи наше все
#------------------------------------------------------------------------------
LOG="LOG --log-level debug --log-tcp-sequence --log-tcp-options"
LOG="$LOG --log-ip-options"
#------------------------------------------------------------------------------
# лимит
#------------------------------------------------------------------------------
RLIMIT="-m limit --limit 3/s --limit-burst 8"
#------------------------------------------------------------------------------
# КГ Сетки
#------------------------------------------------------------------------------
aknet='212.112.96.0/19'
asia='195.38.160.0/19'
bitel='194.176.111.0/24'
bmc='85.26.220.0/22'
city='212.2.224.0/19'
comintech='81.20.16.0/20'
elcat1='212.42.96.0/19'
elcat2='77.95.56.0/21'
elcat3='94.143.192.0/21'
kt1='212.241.0.0/19'
kt2='212.97.0.0/19'
kt3='213.145.128.0/19'
kt4='85.113.0.0/19'
kt5='89.237.192.0/18'
mega1='77.235.0.0/19'
mega2='92.245.96.0/19'
nur1='194.152.36.0/24'
nur2='194.152.37.0/24'
energo1='91.205.48.0/22'
energo2='95.215.244.0/22'
saima='217.29.16.0/20'
totel='85.115.192.0/19'
transfer='81.88.192.0/20'
#------------------------------------------------------------------------------
$MODPROBE ip_conntrack_ftp
$MODPROBE ip_conntrack_irc
# Конфигурация ядра
# Включаем IP forwarding.
#------------------------------------------------------------------------------
echo 1 > /proc/sys/net/ipv4/ip_forward
# Включить защиту IP спуфинга
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $i; done
# зашита от SYN flood атак
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Игнорировать все входящие ICMP echo запросы
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
# Игнорировать ICMP echo запросы на broadcast
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Регистрировать пакеты с невозможными адресами.
for i in /proc/sys/net/ipv4/conf/*/log_martians; do echo 1 > $i; done
# Не логгировать invalid ответ на broadcast
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# Не принимать или отправлять ICMP редиректы.
for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do echo 0 > $i; done
for i in /proc/sys/net/ipv4/conf/*/send_redirects; do echo 0 > $i; done
# Не принимать source routed пакеты.
for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do echo 0 > $i; done
# Disable multicast routing
#for i in /proc/sys/net/ipv4/conf/*/mc_forwarding; do echo 0 > $i; done
# отключить proxy_arp.
for i in /proc/sys/net/ipv4/conf/*/proxy_arp; do echo 1 > $i; done
# Включить Секурные Редиректы, то есть только принимаем ICMP редиректы на шлюзы
for i in /proc/sys/net/ipv4/conf/*/secure_redirects; do echo 1 > $i; done
# Отключить bootp_relay
for i in /proc/sys/net/ipv4/conf/*/bootp_relay; do echo 0 > $i; done
# Правила по умолчанию.
#------------------------------------------------------------------------------
# Дропать все
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP
# Включаем nat/mangle/raw Цепочки принимать пакеты
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t mangle -P PREROUTING ACCEPT
$IPT -t mangle -P INPUT ACCEPT
$IPT -t mangle -P FORWARD ACCEPT
$IPT -t mangle -P OUTPUT ACCEPT
$IPT -t mangle -P POSTROUTING ACCEPT
# Ебля (зачистка)
#------------------------------------------------------------------------------

# Ебнуть все найух
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F

# Удаляем все
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

# все обнуляем
$IPT -Z
$IPT -t nat -Z
$IPT -t mangle -Z

# Отключаем IPv6.
#------------------------------------------------------------------------------

# Блочить весь IPv6 Траффик
# если ip6tables Доступна то пытаемся отключить
if test -x $IP6TABLES; then
# По дефолту
# Дропать все
$IP6TABLES -P INPUT DROP 2>/dev/null
$IP6TABLES -P FORWARD DROP 2>/dev/null
$IP6TABLES -P OUTPUT DROP 2>/dev/null

# Таблица mangle может пропустить все
$IP6TABLES -t mangle -P PREROUTING ACCEPT 2>/dev/null
$IP6TABLES -t mangle -P INPUT ACCEPT 2>/dev/null
$IP6TABLES -t mangle -P FORWARD ACCEPT 2>/dev/null
$IP6TABLES -t mangle -P OUTPUT ACCEPT 2>/dev/null
$IP6TABLES -t mangle -P POSTROUTING ACCEPT 2>/dev/null

# Удалить все правила.
$IP6TABLES -F 2>/dev/null
$IP6TABLES -t mangle -F 2>/dev/null

# все цепочки.
$IP6TABLES -X 2>/dev/null
$IP6TABLES -t mangle -X 2>/dev/null

# все обнулить
$IP6TABLES -Z 2>/dev/null
$IP6TABLES -t mangle -Z 2>/dev/null
fi

# А вот тут вот и начинаецца сама ебля с iptables....
#------------------------------------------------------------------------------

# Логгируем и потом принимаем пакеты.
$IPT -N ACCEPTLOG
$IPT -A ACCEPTLOG -j $LOG $RLIMIT --log-prefix "ACCEPT "
$IPT -A ACCEPTLOG -j ACCEPT

# Логгируем и шлем найух.
$IPT -N DROPLOG
$IPT -A DROPLOG -j $LOG $RLIMIT --log-prefix "DROP "
$IPT -A DROPLOG -j DROP

# Логгируем и режектим.
$IPT -N REJECTLOG
$IPT -A REJECTLOG -j $LOG $RLIMIT --log-prefix "REJECT "
$IPT -A REJECTLOG -p tcp -j REJECT --reject-with tcp-reset
$IPT -A REJECTLOG -j REJECT

# Только разрешаем RELATED ICMP типы
$IPT -N RELATED_ICMP
$IPT -A RELATED_ICMP -p icmp --icmp-type any -j ACCEPT
$IPT -A RELATED_ICMP -p icmp --icmp-type time-exceeded -j ACCEPT
$IPT -A RELATED_ICMP -p icmp --icmp-type parameter-problem -j ACCEPT
$IPT -A RELATED_ICMP -j DROPLOG

# против мульти пинга
$IPT  -A INPUT -p icmp -m limit --limit 1/s --limit-burst 2 -j ACCEPT
$IPT  -A INPUT -p icmp -m limit --limit 1/s --limit-burst 2 -j LOG --log-prefix PING-DROP:
$IPT  -A INPUT -p icmp -j DROP
$IPT  -A OUTPUT -p icmp -j ACCEPT

# Разрешить только минимально необходимые / рекомендованные части ICMP. Остальное в пезду
# Дропаем все фрагментированные ICMP пакеты ( почти всегда злоебучие)
#$IPT -A INPUT -p icmp --fragment -j DROPLOG
#$IPT -A OUTPUT -p icmp --fragment -j DROPLOG
#$IPT -A FORWARD -p icmp --fragment -j DROPLOG
# Разрешаем ESTABLISHED ICMP траффик.
$IPT -A INPUT -p icmp -m state --state ESTABLISHED -j ACCEPT $RLIMIT
$IPT -A OUTPUT -p icmp -m state --state ESTABLISHED -j ACCEPT $RLIMIT
# Разрешить не весь RELATED ICMP траффик, остальное блочим
$IPT -A INPUT -p icmp -m state --state RELATED -j RELATED_ICMP $RLIMIT
$IPT -A OUTPUT -p icmp -m state --state RELATED -j RELATED_ICMP $RLIMIT
# Разрешить входящие эхо ICMP запросы (пинг), только с ограничением по конекту
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT $RLIMIT

# ЗА ПИНГЕ ОТВЕЧАЕМ ХУЛЕ!1 %)
$IPT -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT $RLIMIT

# То что не проходит по правилам Шлем в пезду (или найух, кого куда).
$IPT -A INPUT -p icmp -j DROPLOG
$IPT -A OUTPUT -p icmp -j DROPLOG
$IPT -A FORWARD -p icmp -j DROPLOG
#------------------------------------------------------------------------------
# Не ограничиваем lo
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
# Пропускаем ESTABLISHED и RELATED пакеты (не знаешь чо это то пиздуй кури маны %))
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# отвечаем, кроме invalid
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# ХУЕТА
#------------------------------------------------------------------------------

# Нам ПОХУЙ на Мелкософт, так что шлем его нахуй... No Windows, no Gates :P
$IPT -A INPUT -p tcp -m multiport --dports 135,137,138,139,445,1433,1434 -j DROP
$IPT -A INPUT -p udp -m multiport --dports 135,137,138,139,445,1433,1434 -j DROP

# Дропаем хуйпонятный Входящий траффик (INVALID)
$IPT -A INPUT -m state --state INVALID -j DROP

# Таже фигня с исходящим
$IPT -A OUTPUT -m state --state INVALID -j DROP

# Если мы будем использовать NAT, INVALID пакеты посылаем на...
$IPT -A FORWARD -m state --state INVALID -j DROP

# АА фиг просканишь порты эжжэ ээээ %)
$IPT -A INPUT -m state --state NEW -p tcp --tcp-flags ALL ALL -j DROP
$IPT -A INPUT -m state --state NEW -p tcp --tcp-flags ALL NONE -j DROP
$IPT -A PREROUTING -i $INDEV -t mangle -p tcp --syn \
  -j MARK --set-mark 1
# а вот тут вот нам будет похуй на школьнегоф %)
$IPT -N SYN_FLOOD
$IPT -A INPUT -p tcp --syn -j SYN_FLOOD
$IPT -A SYN_FLOOD -m limit --limit 2/s --limit-burst 6 -j RETURN
$IPT -A SYN_FLOOD -j DROP
$IPT -A SYN_FLOOD -j REJECT
# есле мудак какой то накосячил то ебем его вот тут..
# $IPT -A INPUT -s АЙПИ_МУДАКА -j DROPLOG

# разрешаем исходящий трафф
$IPT -A OUTPUT -j ACCEPT
# Входяшие DNS запросы
$IPT -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
$IPT -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
# а вот тут вот уже правила на то что разрешено %)
$IPT -A INPUT -p tcp -m tcp -s $mega1 --dport 21 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $mega2 --dport 21 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $elcat1 --dport 21 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $elcat2 --dport 21 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $elcat3 --dport 21 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $city --dport 21 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $aknet --dport 21 -j ACCEPT
#ssh но не всем...
$IPT -A INPUT -p tcp -m tcp -s $aknet --dport 22 -j ACCEPT
#$IPT -A INPUT -p tcp -m tcp -s 92.245.108.200 --dport 22 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $mega1 --dport 22 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $mega2 --dport 22 -j ACCEPT
# открываем HTTP трафф на КГ зону
$IPT -A INPUT -p tcp -m tcp -s $mega1 --dport 80 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $mega2 --dport 80 -j ACCEPT
#iptables -t nat -A POSTROUTING -j MASQUERADE
#$IPT -A INPUT -i eth0 -j ACCEPT
#$IPT -A OUTPUT -o eth0 -j ACCEPT
#NAT to vboxnet0
$IPT -t nat -A POSTROUTING -s 192.168.56.3 -o ppp0 -j SNAT --to-source 77.235.12.36

# Ну и то что мы тут забыли то логируем и отправляем далеко %)
#------------------------------------------------------------------------------
$IPT -A INPUT -j REJECTLOG
$IPT -A OUTPUT -j REJECTLOG
$IPT -A FORWARD -j REJECTLOG
#    exit 0
[/spoiler]
при таком раскладе инета нету на виртуальной машине

Code: Select all

iptables -I FORWARD -i vboxnet0 -o ppp0 -j ACCEPT
iptables -I FORWARD -i ppp0 -o vboxnet0 -j ACCEPT
после этих строк, инет есть, но http не грузиться. under links когда захажу на gentoo.mega.kg/gentoo оно пишет что REQUEST SEND но не получает.
ЗЫ syslog молчит. ничего не дропает и режектит
Image
Home: Windows Heaven
Home: Debian 6
For Servers: Debian || RHEL Based || Gentoo || FreeBSD
User avatar
Raven
Бородатый сис
Бородатый сис
Posts: 2791
Joined: 03 Mar 2010, 15:12
ОС: RHEL 8
Location: Из серверной

Re: NAT via iptables to VirtualMachine

Post by Raven » 17 Apr 2010, 10:59

Gen1us2k wrote:$IPT -A OUTPUT -j ACCEPT
А интерморды не нужно ли указать?
Я не злопамятный, я просто часто ковыряю логи
User avatar
Infernal Flame
Злой Модер
Posts: 1796
Joined: 03 Mar 2010, 11:25
ОС: Centos 7
Contact:

Re: NAT via iptables to VirtualMachine

Post by Infernal Flame » 17 Apr 2010, 11:00

ахренеть... это откуда такой дикий конф на иптраблах???
а вот над задачкой поразмышляем-с...
Image
Image
Work: Centos 7 х 'all Servers'
User avatar
Raven
Бородатый сис
Бородатый сис
Posts: 2791
Joined: 03 Mar 2010, 15:12
ОС: RHEL 8
Location: Из серверной

Re: NAT via iptables to VirtualMachine

Post by Raven » 17 Apr 2010, 11:02

А где маскарад?
Я не злопамятный, я просто часто ковыряю логи
User avatar
Gen1us2k
Модератор
Модератор
Posts: 771
Joined: 02 Mar 2010, 16:13

Re: NAT via iptables to VirtualMachine

Post by Gen1us2k » 17 Apr 2010, 11:09

Raven
я SNAT'ом.. Натю, также я исходящий трафф разрешил
Infernal Flame
в смысле дикий?%)

ЗЫ комменты лучше не читать, забыл отредактировать %)
Image
Home: Windows Heaven
Home: Debian 6
For Servers: Debian || RHEL Based || Gentoo || FreeBSD
User avatar
Infernal Flame
Злой Модер
Posts: 1796
Joined: 03 Mar 2010, 11:25
ОС: Centos 7
Contact:

Re: NAT via iptables to VirtualMachine

Post by Infernal Flame » 17 Apr 2010, 11:11

Gen1us2k
да так... сурово выглядит просто....
Gen1us2k wrote:я SNAT'ом.. Натю, также я исходящий трафф разрешил
имхо, стоит попробовать маскарад....
Image
Image
Work: Centos 7 х 'all Servers'
User avatar
Gen1us2k
Модератор
Модератор
Posts: 771
Joined: 02 Mar 2010, 16:13

Re: NAT via iptables to VirtualMachine

Post by Gen1us2k » 17 Apr 2010, 11:17

Infernal Flame
ок, щас попробую маскарад
UPD: через маскарад такая же ситуация
Image
Home: Windows Heaven
Home: Debian 6
For Servers: Debian || RHEL Based || Gentoo || FreeBSD
User avatar
Gen1us2k
Модератор
Модератор
Posts: 771
Joined: 02 Mar 2010, 16:13

Re: NAT via iptables to VirtualMachine

Post by Gen1us2k » 18 Apr 2010, 21:43

Code: Select all

iptables -t mangle -A FORWARD -o ppp0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu 
Решение проблемы. При конфигурации ppp0 интерфейса, должно корректироваться значение MTU чего у меня не было. добавил правило, все заработало! %)
Отдельное спасибо Лелику за решение проблемы:)
Image
Home: Windows Heaven
Home: Debian 6
For Servers: Debian || RHEL Based || Gentoo || FreeBSD
Post Reply