Chinaunix首页 | 论坛 | 博客
  • 博客访问: 555358
  • 博文数量: 114
  • 博客积分: 5611
  • 博客等级: 大校
  • 技术积分: 1027
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-19 08:55
文章分类

全部博文(114)

文章存档

2011年(29)

2010年(20)

2009年(1)

2008年(11)

2007年(53)

分类: LINUX

2007-12-17 14:22:48

#!/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="***.**.***.**"
# Local Interface Information
LOCAL_IFACE="eth1"
LOCAL_IP="172.21.41.15"
LOCAL_NET="172.21.41.0/24"
LOCAL_BCAST="172.21.41.255"
# Localhost Interface
LO_IFACE="lo"
LO_IP="127.0.0.1"
#####################################网络参数设置(结束)#######################################
#################################iptables策略改动后保存和重置(开始)########################
# 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
#################################iptables策略改动后保存和重置(结束)#######################
##################################载入相关iptables模块(开始)#################################
# Load Modules(这一部分还没完全理解)
echo "Loading kernel modules ..."
# core netfilter module
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_MASQUERADE
/sbin/modprobe ipt_mark
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_conntrack_irc
# /sbin/modprobe iptable_filter
# /sbin/modprobe iptable_mangle
# /sbin/modprobe ipt_LOG
# /sbin/modprobe ipt_limit
# /sbin/modprobe ipt_unclean
# /sbin/modprobe ipt_state
# /sbin/modprobe ipt_tcpmss
# /sbin/modprobe ipt_REJECT
##################################载入相关iptables模块(结束)#################################
#################################设定系统网络参数(开始)#####################################
# 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
#################################设定系统网络参数(结束)#####################################
###########################首先清空并删除所有的iptables策略##################################
# 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
#################################如果是stop 就结束了#######################################
if [ "$1" = "stop" ]
then
          echo "Firewall completely flushed!  Now running with no firewall."
          exit 0
fi
 
 
############################开始设定自己的策略前所有的iptables策略##########################
# Rules Configuration
# Filter Table
# Set Policies
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP

$IPT -P FORWARD DROP

#上面部分是照抄来的,主要是设定相关参数,如果可以考虑精简不需要的模块加载,提高效率。

 

################# INPUT策略  $INET_IFACE部分------丢弃的包(开始部分)###################

#丢弃进入$INET_IFACE源地址伪装成内网的的input

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

#丢弃进入$INET_IFACE,状态为 INVALID input

$IPT A INPUT -p ALL -i $INET_IFACE -m state --state INVALID -j DROP
 
#UDP协议下丢弃的进入的$INET_IFACE的包
$IPT -A INPUT -i $INET_IFACE -p UDP -s 0/0 --dport 137 -j DROP
$IPT -A INPUT -i $INET_IFACE -p UDP -s 0/0 --dport 138 -j DROP
$IPT -A INPUT -i $INET_IFACE P UDP -s 0/0 --dport 113 -j REJECT
################# INPUT策略  $INET_IFACE部分------丢弃的包(结束部分)###################

######################### INPUT策略-----------许可以及放行的包(开始部分)#####################

#放行所有$LOCAL_IFACEinput

$IPT A INPUT -i $LOCAL_IFACE j ACCEPT

 

#放行进入$INET_IFACE的响应包

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

 

#TCP协议下许可进入$INET_IFACE的包(以及许可的TCP端口)
#5000:5100 ICQ     6891:6900 MAN   30000:50000自定义的PASV端口  8080为后面要用到的重定向端口
$IPT -A INPUT -p TCP -i $INET_IFACE -m multiport --dports 20,21,22,25,80,110,8080 -j ACCEPT
$IPT -A INPUT -i $INET_IFACE -p TCP -s 0/0 -m multiport --dports 5000:5100 -j ACCEPT
$IPT -A INPUT -i $INET_IFACE -p TCP -s 0/0 -m multiport --dports 6891:6900 -j ACCEPT
$IPT -A INPUT -i $INET_IFACE -p TCP -s 0/0 -m multiport --dports 30000:50000 -j ACCEPT
 
#UDP协议下许可进入的$INET_IFACE(许可DNS协议)
$IPT -A INPUT -i $INET_IFACE -p UDP -s 0/0 --dport 53 -j ACCEPT

#########################INPUT策略-----------许可以及放行的包(结束部分)####################

############################ FORWORD策略-----------丢弃的包(开始部分)###########################
#这里应该没有要用的策略,因为缺省的FORWORD策略是DROP的,不符合许可部分,就是被抛弃的,除非是有#大量的攻击产生,首先判断包  drop   来提升效率。
# 以下这一句可以来放到FORWORD策略的最前面来防止恶意的FORWORD攻击(更改$LOCAL_NET为特定地址)
# $IPT -A FORWARD -p ALL -i $INET_IFACE -s $LOCAL_NET -j DROP
# $IPT -A FORWARD -p ALL -m state --state INVALID -j DROP
############################ FORWORD策略-----------丢弃的包(结束部分)###########################
###################### FORWORD策略-----------许可以及放行的包(开始部分)#####################
#许可从内网出去的forword 和外部ESTABLISHED,RELATED 回来的forword
$IPT -A FORWARD -p ALL -i $LOCAL_IFACE -j ACCEPT
$IPT -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
 
 
# 启动日志,记录(内/外网双向都记录)一般情况下关闭,除非是判断故障
# $IPT -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "FORWARD died: "
###################### FORWORD策略-----------许可以及放行的包(结束部分)#####################
############################ OUTPUT策略-----------丢弃的包(开始部分)#########################
#以下感觉没必要,如果有其他OUTPUT限制,把策略放OUTPUT许可部分策略的前面
#$IPT -A OUTPUT -m state -p icmp --state INVALID -j DROP
############################ OUTPUT策略-----------丢弃的包(结束部分)#########################
########################## OUTPUT策略-----------许可以及放行的包(开始部分)#####################
# 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
 
# OUTPUT日志部分,调试用
# $IPT -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG  --log-prefix "OUTPUT died: "
########################## OUTPUT策略-----------许可以及放行的包(结束部分)####################
######################## NAT策略-----------许可以及放行的包(开始部分)######################## 
# PREROUTING 部分(路由前)
# 内部网络代理部分的策略,透明代理,其中SQUID端口为3128803128
# $IPT -t nat -A PREROUTING -i $LOCAL_IFACE -p tcp --dport 80 -j REDIRECT --to-ports 3128
# 内部网络代理部分的策略,个人认为443没必要走squid 感觉不安全 (4433128
# $IPT -t nat -A PREROUTING -i $LOCAL_IFACE -p tcp --dport 443 -j REDIRECT --to-ports 3128
 
# POSTROUTING 部分(路由后)
# POSTROUTING nat策略2句作用一样,用一句就可以了,看个人喜好,个人认为第一句的效率高
$IPT -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_ADDRESS
# $IPT -t nat -A POSTROUTING -s $LOCAL_IFACE -o $INET_IFACE -j MASQUERADE
 
######################## NAT策略-----------许可以及放行的包(结束部分)#######################
######################## NAT策略-----------丢弃的包(开始部分)############################ 
#无内容
######################## NAT策略-----------丢弃的包(结束部分)############################
# mangle table
 

 

#重定向部分(把相关策略集中在一起了)
#这个是跟PREROUTING重定向有关的策略,主要是许可外网到172.21.41.13:3000 FORWORD通道
$IPT -A FORWARD -p tcp -i $INET_IFACE  -d 172.21.41.13 --dport 3000 -j ACCEPT
 
# 以下部分是目的地址的转换,主要是把特定端口8080转到内部网络特定计算机3000端口上,要跟FORWORD
# 中的一个许可策略配合起来,不然会被拒绝掉,这里只是转换,并没有ACCEPT
# 第一 从内、外网访问服务器外网ip:8080的包重定向到内网计算机3000端口---------目的地址转换
# 做了这一句之后才能 重定向访问成功 (-s 内、外网都可以)
$IPT -t nat -A PREROUTING -p tcp -i $INET_IFACE --dport 8080 -j DNAT --to 172.21.41.13:3000
 
# 第二 从内网访问服务器内网ip:8080的包重定向到内网计算机3000端口---------目的地址转换
# 做了这一句之后才能 重定向访问成功 (-s 内网)
# 如果没有访问$LOCAL_IP:8080的需求,这条策略可以不做
$IPT -t nat -A PREROUTING -p tcp -i $LOCAL_IFACE --dport 8080 -j DNAT --to 172.21.41.13:3000
 
# 以下这一句是跟重定向有关系(不管是-s 内网 还是 外网),必须做snat,不然包回不来,同时要注意的是这里是
# SNAT --to-source $LOCAL_IP 不是 $INET_ADDRESS,经过多次实验发现SNAT --to-source $INET_ADDRESS不可以,也许要
#打开外网到内网的forward的许可,没继续实验下去
$IPT -t nat -A POSTROUTING -o $LOCAL_IFACE -d 172.21.41.13 -p tcp --dport 3000 -j SNAT --to-source $LOCAL_IP
阅读(2874) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~