LinuxForum.Fans
Тема

iproute + iptables

Автор: andrey2005 2 сообщений 2243 просмотров
#43288

Задумка такая есть два провайдера, по одному из них хочу пустить только трафик для OPENVPN сервера, остальной по другому.
составил скрипт для iproute

text
#!/bin/sh
IF1="eth0"
IF2="eth1"
IF0="eth2"
IP1="192.168.10.2"
IP2="192.168.20.2"
P1="192.168.10.1"
P2="192.168.20.1"
P1_NET="192.168.10.0/24"
P2_NET="192.168.20.0/24"
P0_NET="192.168.0.0/24"

ip route flush table UKR ip route flush table ITL

ip route add $P1_NET dev $IF1 src $IP1 table UKR ip route add default via $P1 table UKR ip route add $P2_NET dev $IF2 src $IP2 table ITL ip route add default via $P2 table ITL

ip route add $P1_NET dev $IF1 src $IP1 ip route add $P2_NET dev $IF2 src $IP2

ip route add default via $P1

ip rule add from $IP1 table UKR ip rule add from $IP2 table ITL

ip route add $P0_NET dev $IF0 table UKR ip route add $P2_NET dev $IF2 table UKR ip route add 127.0.0.0/8 dev lo table UKR ip route add $P0_NET dev $IF0 table ITL ip route add $P1_NET dev $IF1 table ITL ip route add 127.0.0.0/8 dev lo table ITL

ip rule add fwmark 10 table UKR ip rule add fwmark 11 table ITL

ip route flush cache

exit 0

и скрипт iptables

text
#!/bin/sh
#

############################# # # Local Settings #

SYSCTL="/sbin/sysctl -w"

IPT="/sbin/iptables" IPTS="/sbin/iptables-save" IPTR="/sbin/iptables-restore"

# Internet Interface INET_IFACE="eth0" INET_ADDRESS="192.168.10.2"

# Internet Interface2 INET_IFACE2="eth1" INET_ADDRESS2="192.168.20.2"

# Local Interface Information LOCAL_IFACE="eth2" LOCAL_IP="192.168.0.1" LOCAL_NET="192.168.0.0/24" LOCAL_BCAST="192.168.0.255"

#block ICQ ICQ_SERVER1="64.12.0.0/16" ICQ_SERVER2="205.188.0.0/16" ICQ_SERVER3="81.19.0.0/16"

# Localhost Interface

LO_IFACE="lo" LO_IP="127.0.0.1"

NET_SUB1="192.168.0.222" #сервер openvpn #NET_SUB2="192.168.0.250"

# Save and Restore arguments handled here if [ "$1" = "save" ] then echo -n "Saving firewall to /etc/sysconfig/iptables ... " $IPTS > /etc/sysconfig/iptables echo "done" exit 0 elif [ "$1" = "restore" ] then echo -n "Restoring firewall from /etc/sysconfig/iptables ... " $IPTR < /etc/sysconfig/iptables echo "done" exit 0 fi

################################################ # # Load Modules #

echo "Loading kernel modules ..."

# core netfilter module /sbin/modprobe ip_tables

# the stateful connection tracking module /sbin/modprobe ip_conntrack

# nat table module /sbin/modprobe iptable_nat

# The ftp nat module is required for non-PASV ftp support /sbin/modprobe ip_nat_ftp

# the module for full ftp connection tracking /sbin/modprobe ip_conntrack_ftp

# the module for full irc connection tracking /sbin/modprobe ip_conntrack_irc

############################################## # # Kernel Parameter Configuration #

if [ "$SYSCTL" = "" ] then echo "1" > /proc/sys/net/ipv4/ip_forward else $SYSCTL net.ipv4.ip_forward="1" fi

if [ "$SYSCTL" = "" ] then echo "1" > /proc/sys/net/ipv4/tcp_syncookies else $SYSCTL net.ipv4.tcp_syncookies="1" fi

if [ "$SYSCTL" = "" ] then echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter else $SYSCTL net.ipv4.conf.all.rp_filter="1" fi

if [ "$SYSCTL" = "" ] then echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts else $SYSCTL net.ipv4.icmp_echo_ignore_broadcasts="1" fi

if [ "$SYSCTL" = "" ] then echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route else $SYSCTL net.ipv4.conf.all.accept_source_route="0" fi

if [ "$SYSCTL" = "" ] then echo "1" > /proc/sys/net/ipv4/conf/all/secure_redirects else $SYSCTL net.ipv4.conf.all.secure_redirects="1" fi

# This option logs packets from impossible addresses. if [ "$SYSCTL" = "" ] then echo "1" > /proc/sys/net/ipv4/conf/all/log_martians else $SYSCTL net.ipv4.conf.all.log_martians="1" fi

########################################## # # Flush Any Existing Rules or Chains #

echo "Flushing Tables ..."

# Reset Default Policies $IPT -P INPUT ACCEPT $IPT -P FORWARD ACCEPT $IPT -P OUTPUT ACCEPT $IPT -t nat -P PREROUTING ACCEPT $IPT -t nat -P POSTROUTING ACCEPT $IPT -t nat -P OUTPUT ACCEPT $IPT -t mangle -P PREROUTING ACCEPT $IPT -t mangle -P OUTPUT ACCEPT

# Flush all rules $IPT -F $IPT -t nat -F $IPT -t mangle -F

# Erase all non-default chains $IPT -X $IPT -t nat -X $IPT -t mangle -X

if [ "$1" = "stop" ] then echo "Firewall completely flushed! Now running with no firewall." exit 0 fi

####################################### # # Rules Configuration #

############################################ # # Filter Table # ##########################################

# Set Policies

$IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP

###################################### # # User-Specified Chains # # Create user chains to reduce the number of rules each packet # must traverse.

echo "Create and populate custom rule chains ..."

# Create a chain to filter INVALID packets

$IPT -N bad_packets

$IPT -N bad_tcp_packets

$IPT -N icmp_packets

# Used for UDP packets inbound from the Internet $IPT -N udp_inbound

$IPT -N udp_outbound

$IPT -N tcp_inbound

$IPT -N tcp_outbound

######################################### # # Populate User Chains #

# bad_packets chain #

# Drop packets received on the external interface # claiming a source of the local network $IPT -A bad_packets -p ALL -i $INET_IFACE -s $LOCAL_NET -j LOG \ --log-prefix "Illegal source: "

$IPT -A bad_packets -p ALL -i $INET_IFACE -s $LOCAL_NET -j DROP

$IPT -A bad_packets -p ALL -i $INET_IFACE2 -s $LOCAL_NET -j LOG \ --log-prefix "Illegal source: "

$IPT -A bad_packets -p ALL -i $INET_IFACE2 -s $LOCAL_NET -j DROP

# Drop INVALID packets immediately $IPT -A bad_packets -p ALL -m state --state INVALID -j LOG \ --log-prefix "Invalid packet: "

$IPT -A bad_packets -p ALL -m state --state INVALID -j DROP

# Then check the tcp packets for additional problems $IPT -A bad_packets -p tcp -j bad_tcp_packets

# All good, so return $IPT -A bad_packets -p ALL -j RETURN

# bad_tcp_packets chain #

$IPT -A bad_tcp_packets -p tcp -i $LOCAL_IFACE -j RETURN

$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \ --log-prefix "New not syn: " $IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP

$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j LOG \ --log-prefix "Stealth scan: " $IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j DROP

$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j LOG \ --log-prefix "Stealth scan: " $IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j DROP

$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j LOG \ --log-prefix "Stealth scan: " $IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG \ --log-prefix "Stealth scan: " $IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j LOG \ --log-prefix "Stealth scan: " $IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOG \ --log-prefix "Stealth scan: " $IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

# All good, so return $IPT -A bad_tcp_packets -p tcp -j RETURN

# icmp_packets chain #

$IPT -A icmp_packets --fragment -p ICMP -j LOG \ --log-prefix "ICMP Fragment: " $IPT -A icmp_packets --fragment -p ICMP -j DROP

$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j DROP

# Time Exceeded $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT

# Not matched, so return so it will be logged $IPT -A icmp_packets -p ICMP -j RETURN

# TCP & UDP

# udp_inbound chain #

$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 137 -j DROP $IPT -A udp_inbound -p UDP -s 0/0 --destination-port 138 -j DROP

# Not matched, so return for logging $IPT -A udp_inbound -p UDP -j RETURN

# udp_outbound chain #

$IPT -A udp_outbound -p UDP -i $LOCAL_IFACE -s 192.168.0.222 --dport 123 -j ACCEPT

# No match, so ACCEPT $IPT -A udp_outbound -p UDP -s 0/0 -j REJECT

# tcp_inbound chain #

echo "Zagruzau polzovatelskie pravila ..... "

# sshd $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 22 -j ACCEPT

# Not matched, so return so it will be logged $IPT -A tcp_inbound -p TCP -j RETURN

# tcp_outbound chain #

echo "BLOCK ICQ ....... " $IPT -A tcp_outbound -p TCP -i $LOCAL_IFACE -d $ICQ_SERVER1 ! -s 192.168.0.222 -j DROP $IPT -A tcp_outbound -p TCP -i $LOCAL_IFACE -d $ICQ_SERVER2 ! -s 192.168.0.222 -j DROP $IPT -A tcp_outbound -p TCP -i $LOCAL_IFACE -d $ICQ_SERVER3 ! -s 192.168.0.222 -j DROP

#Приём почты

$IPT -A tcp_outbound -p TCP -i $LOCAL_IFACE -s 192.168.0.0/24 --dport 995 -j ACCEPT

#Отправка почты #$IPT -A tcp_outbound -p TCP -i $LOCAL_IFACE -s 192.168.0.0/24 --dport 25 -j ACCEPT $IPT -A tcp_outbound -p TCP -i $LOCAL_IFACE -s 192.168.0.0/24 --dport 465 -j ACCEPT

#HTTPS $IPT -A tcp_outbound -p TCP -i $LOCAL_IFACE -s 192.168.0.0/24 --dport 443 -j ACCEPT

#ETO MNE $IPT -A tcp_outbound -p TCP -i $LOCAL_IFACE -s 192.168.0.3 -j ACCEPT $IPT -A udp_outbound -p UDP -i $LOCAL_IFACE -s 192.168.0.3 -j ACCEPT

$IPT -A tcp_outbound -p TCP -s 0/0 -j REJECT

############################################### # # INPUT Chain #

echo "Process INPUT chain ..."

# Allow all on localhost interface $IPT -A INPUT -p ALL -i $LO_IFACE -j ACCEPT

# Drop bad packets $IPT -A INPUT -p ALL -j bad_packets

$IPT -A INPUT -p ALL -d 224.0.0.1 -j DROP # The rule to accept the packets. # $IPT -A INPUT -p ALL -d 224.0.0.1 -j ACCEPT

# Rules for the private network (accessing gateway system itself) $IPT -A INPUT -p ALL -i $LOCAL_IFACE -s $LOCAL_NET -j ACCEPT $IPT -A INPUT -p ALL -i $LOCAL_IFACE -d $LOCAL_BCAST -j ACCEPT

# Inbound Internet Packet Rules

# Accept Established Connections $IPT -A INPUT -p ALL -i $INET_IFACE -m state --state ESTABLISHED,RELATED \ -j ACCEPT

$IPT -A INPUT -p ALL -i $INET_IFACE2 -m state --state ESTABLISHED,RELATED \ -j ACCEPT

# Route the rest to the appropriate user chain $IPT -A INPUT -p TCP -i $INET_IFACE -j tcp_inbound $IPT -A INPUT -p UDP -i $INET_IFACE -j udp_inbound $IPT -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets

$IPT -A INPUT -p TCP -i $INET_IFACE2 -j tcp_inbound $IPT -A INPUT -p UDP -i $INET_IFACE2 -j udp_inbound $IPT -A INPUT -p ICMP -i $INET_IFACE2 -j icmp_packets

. $IPT -A INPUT -m pkttype --pkt-type broadcast -j DROP

# Log packets that still don't match $IPT -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \ --log-prefix "INPUT packet died: "

########################################### # # FORWARD Chain #

echo "Process FORWARD chain ..."

# Used if forwarding for a private network

$IPT -A FORWARD -p ALL -j LOG --log-level debug # Drop bad packets $IPT -A FORWARD -p ALL -j bad_packets

# Accept TCP packets we want to forward from internal sources $IPT -A FORWARD -p tcp -i $LOCAL_IFACE -j tcp_outbound

# Accept UDP packets we want to forward from internal sources $IPT -A FORWARD -p udp -i $LOCAL_IFACE -j udp_outbound

# If not blocked, accept any other packets from the internal interface $IPT -A FORWARD -p ALL -i $LOCAL_IFACE -j ACCEPT

# Deal with responses from the internet $IPT -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED \ -j ACCEPT

$IPT -A FORWARD -i $INET_IFACE2 -m state --state ESTABLISHED,RELATED \ -j ACCEPT

$IPT -A FORWARD -j LOG --log-prefix "forward " #$IPT -A FORWARD -p udp -i $INET_IFACE2 --destination-port 1194 \ # --destination 192.168.0.222 -j ACCEPT $IPT -A FORWARD -i $INET_IFACE2 -d 192.168.0.222 -p udp --dport 1194 -m state --state NEW -j ACCEPT $IPT -A FORWARD -i $LOCAL_IFACE -s 192.168.0.222 -j ACCEPT

$IPT -A FORWARD -p udp -i $INET_IFACE2 --destination-port 123 \ --destination 192.168.0.222 -j ACCEPT

# Log packets that still don't match $IPT -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG \ --log-prefix "FORWARD packet died: "

############################################################################### # # OUTPUT Chain #

echo "Process OUTPUT chain ..."

$IPT -A OUTPUT -m state -p icmp --state INVALID -j DROP

# Localhost $IPT -A OUTPUT -p ALL -s $LO_IP -j ACCEPT $IPT -A OUTPUT -p ALL -o $LO_IFACE -j ACCEPT

# To internal network $IPT -A OUTPUT -p ALL -s $LOCAL_IP -j ACCEPT $IPT -A OUTPUT -p ALL -o $LOCAL_IFACE -j ACCEPT

# To internet $IPT -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT

$IPT -A OUTPUT -p ALL -o $INET_IFACE2 -j ACCEPT

# Log packets that still don't match $IPT -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \ --log-prefix "OUTPUT packet died: "

################################################ # # nat table #

echo "Load rules for nat table ..."

################################################# # # PREROUTING chain #

# Port Forwarding #

$IPT -t nat -A PREROUTING -p udp -i $INET_IFACE2 --destination-port 1194 \ -j DNAT --to-destination 192.168.0.222:1194

# Redirect HTTP for a transparent proxy $IPT -t nat -A PREROUTING -p tcp --destination-port 80 \ -j REDIRECT --to-ports 8080 # Redirect HTTPS for a transparent proxy - commented by default

$IPT -t nat -A PREROUTING -p tcp --destination-port 3128 \ -j REDIRECT --to-ports 8080

################################################### # # POSTROUTING chain # $IPT -t nat -A POSTROUTING -j LOG --log-prefix "postrouting " #$IPT -t nat -A POSTROUTING -m mark --mark 10 -j MASQUERADE $IPT -t nat -A POSTROUTING -m mark --mark 11 -j MASQUERADE

$IPT -t nat -A POSTROUTING -o $INET_IFACE \ -j SNAT --to-source $INET_ADDRESS

$IPT -t nat -A POSTROUTING -o $INET_IFACE2 \ -j SNAT --to-source $INET_ADDRESS2

############################################# # # mangle table #

echo "Load rules for mangle table ..."

$IPT -t mangle -A PREROUTING -p udp -s $NET_SUB1 --destination-port 1194 \ -j MARK --set-mark 11

$IPT -t mangle -A PREROUTING -s $NET_SUB1 ! -d $LOCAL_NET -j MARK --set-mark 11 #$IPT -t mangle -A PREROUTING -s $NET_SUB2 -d ! $LOCAL_NET -j MARK --set-mark 10

Было сделано

text
#echo "101 UKR" >> /etc/iproute2/rt_tables
#echo "102 ITL" >> /etc/iproute2/rt_tables

Интернет у пользователей работает, а когда подключаешься по openvpn в логи сыпяться логи "марсианские пакеты" marcian source ..... Соединение не происходит, сам openvpn сервер работает 100% (проверено в варианте с одним провайдером). Получается ошибка где в скрипте IPTABLES или IPROUTE .

#43421

tcpdump Вам в помощь.

Войдите или зарегистрируйтесь, чтобы ответить.