Задумка такая есть два провайдера, по одному из них хочу пустить только трафик для OPENVPN сервера, остальной по другому.
составил скрипт для iproute
#!/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
#!/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
Было сделано
#echo "101 UKR" >> /etc/iproute2/rt_tables
#echo "102 ITL" >> /etc/iproute2/rt_tablesИнтернет у пользователей работает, а когда подключаешься по openvpn в логи сыпяться логи "марсианские пакеты" marcian source ..... Соединение не происходит, сам openvpn сервер работает 100% (проверено в варианте с одним провайдером). Получается ошибка где в скрипте IPTABLES или IPROUTE .