如来神掌第一式第六招----Iptables详解

###############################################################################
# Name : Mahavairocana                                                                                                                                           
# Author : Mahavairocana                                                                                                                                         
# QQ : 10353512                                                                                                                                                    
# WeChat : shenlan-qianlan                                                                                                                                      
# Blog : http://www.cnblogs.com/Mahavairocana/                                                                                                       
# Description : You are welcome to reprint, or hyperlinks to indicate the                                                                        
#                    source of the article, as well as author information.                                                                                ###############################################################################

 

 

 1、"链"与"表"的关系

  PREROUTING      的规则可以存在于:raw表,mangle表,nat表。
  INPUT          的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。
  FORWARD         的规则可以存在于:mangle表,filter表。
  OUTPUT         的规则可以存在于:raw表mangle表,nat表,filter表。
  POSTROUTING      的规则可以存在于:mangle表,nat表。

 2、 "表"与"链"的关系


  raw     表中的规则可以被哪些链使用:PREROUTING,OUTPUT
  mangle  表中的规则可以被哪些链使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
  nat     表中的规则可以被哪些链使用:PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有)
  filter  表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT

 3、iptables为我们定义了4张"表",当他们处于同一条"链"时,执行的优先级如下。(规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。)

  (由高而低):raw --> mangle --> nat --> filter

 4、规则链之间的优先顺序(分三种情况):

  第一种情况:入站数据流向

       从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。

  第二冲情况:转发数据流向

       来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。

  第三种情况:出站数据流向
       防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

 

 

5、常用操作  ()

# Generated by iptables-save v1.4.7 on Thu Dec 28 15:20:52 2017
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [72:7668]
-A INPUT -j REJECT --reject-with icmp-port-unreachable 
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p icmp -m icmp --icmp-type 8/0 -j DROP 
-A INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT --reject-with icmp-port-unreachable 
-A INPUT -p udp -m udp --dport 53 -j DROP 
-A INPUT -p icmp -m limit --limit 10/min --limit-burst 3 -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 22 -m connlimit --connlimit-above 2 --connlimit-mask 32 -j REJECT --reject-with icmp-port-unreachable 
-A INPUT -m string --string "123" --algo bm --to 65535 -j REJECT --reject-with icmp-port-unreachable 
-A INPUT -s 192.168.115.1/32 -p tcp -m multiport --dports 22,23,24 -j ACCEPT 
-A INPUT -s 192.168.115.1/32 -p tcp -m tcp --dport 22 -j ACCEPT 
-A INPUT -s 192.168.115.1/32 -d 192.168.115.128/32 -p tcp -j ACCEPT 
-A INPUT -s 192.168.115.1/32 -j ACCEPT 
-A INPUT ! -s 10.0.2.1/32 -j DROP 
-A INPUT -i eth0 -p icmp -j ACCEPT 
-A INPUT -m iprange --src-range 192.168.115.1-192.168.115.2 -j ACCEPT 
-A INPUT -p icmp -j REJECT --reject-with icmp-port-unreachable 
COMMIT
# Completed on Thu Dec 28 15:20:52 2017

 

6、常用三个脚本

#!/bin/sh
#加载内核模块
modprobe ipt_MASQUERADE
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -F  清除所有规则
iptables -t nat -F 清除nat表所有规则
iptables -X   杀掉自定的链
iptables -t nat -X  杀掉nat表自定的链
###########################INPUT键###################################
iptables -P INPUT DROP 默认丢弃
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  //添加默认模块状态连接成功同意主机发出封包
iptables -A INPUT -p tcp -m multiport --dports 110,25 -j ACCEPT   //添加tcp协议 允许邮件端口pop3,smtp
iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 139 -j ACCEPT  //允许192.168.0.0/24网段使用139端口 samba 445 
#
iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT //添加入口在eth1接口同意使用53端口  允许DNS连接
#
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT //同意tcp协议使用1723端口  允许内网的VPN连接
iptables -A INPUT -p gre -j ACCEPT  //同意gre协议   允许内网的VPN连接
#
iptables -A INPUT -s 192.168.0.0/24 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT //允许192.168.0.0/24网段tcp封包连接成功后发送
iptables -A INPUT -i ppp0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP tcp//,允许公网,最多15个初始连接,连接限制超过15就丢弃  ppp0拨号上网的 
#
iptables -A INPUT -s 192.168.0.0/24 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP//192.186.0.0/24 网段tcp连接数超过15就丢弃  限制内网的
#
iptables -A INPUT -p icmp -m limit --limit 3/s -j LOG --log-level INFO --log-prefix "ICMP packet IN: "//记录并禁止过多的Ping的请求,禁止ICMP通信
iptables -A INPUT -p icmp -j DROP
#
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE  //伪装192.168.0.0/24的ppp0送出的包
#
iptables -N syn-flood//新建syn-flood链
iptables -A INPUT -p tcp --syn -j syn-flood允许进入端新建syn-flood链
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN  //超过每秒三个,容器初始为六个的包,就返回父级链继续处理
#
#######################FORWARD链###########################
iptables -P FORWARD DROP//默认转发丢弃
iptables -A FORWARD -p tcp -s 192.168.0.0/24 -m multiport --dports 80,110,21,25,1723 -j ACCEPT//允许转发从192.168.0.0/24到目标使用80.110.21.25.1723端口的tcp包
iptables -A FORWARD -p udp -s 192.168.0.0/24 --dport 53 -j ACCEPT//允许192.168.0.0/24转发udp包从53端口
iptables -A FORWARD -p gre -s 192.168.0.0/24 -j ACCEPT//允许这个网段转发gre协议
iptables -A FORWARD -p icmp -s 192.168.0.0/24 -j ACCEPT// 允许这个网段转发icmp包
#
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT//允许转发链状态
iptables -I FORWARD -p udp --dport 53 -m string --string "tencent" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat  -j DROP//每周1-6的8:15到12:30禁用qq
#
iptables -I FORWARD -p udp --dport 53 -m string --string "TENCENT" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat  -j DROP//每周1-6的8:15到12:30禁用qq

#
iptables -I FORWARD -p udp --dport 53 -m string --string "tencent" -m time --timestart 13:30 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat  -j DROP//每周1-6的13:30到20:30禁用qq

iptables -I FORWARD -p udp --dport 53 -m string --string "TENCENT" -m time --timestart 13:30 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat  -j DROP//每周1-6的13:30到12:30禁用qq

#
iptables -I FORWARD -s 192.168.0.0/24 -m string --string "qq.com" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat  -j DROP //星期一到星期六的8:15-12:30禁止qq网页
#
iptables -I FORWARD -s 192.168.0.0/24 -m string --string "qq.com" -m time --timestart 13:00 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat  -j DROP//星期一到星期六的13:00-20:30禁止qq网页
#
iptables -I FORWARD -s 192.168.0.0/24 -m string --string "ay2000.net" -j DROP
iptables -I FORWARD -d 192.168.0.0/24 -m string --string "宽频影院" -j DROP
iptables -I FORWARD -s 192.168.0.0/24 -m string --string "色情" -j DROP
iptables -I FORWARD -p tcp --sport 80 -m string --string "广告" -j DROP//禁止ay2000.net,宽频影院,色情,广告网页
#(BT软件走的类型)(禁止BT下载)
iptables -A FORWARD -m ipp2p --edk --kazaa --bit -j DROP//禁用P2P协议
iptables -A FORWARD -p tcp -m ipp2p --ares -j DROP//禁用P2P协议
iptables -A FORWARD -p udp -m ipp2p --kazaa -j DROP //禁用P2P协议
#
iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 24 -j DROP//限制每个ip,掩码是24个的。在80端口同时最大转发数15的,超过的则丢弃   
#
#######################################################################
sysctl -w net.ipv4.ip_forward=1 &> /dev/null//打开转发
#
#######################################################################
sysctl -w net.ipv4.tcp_syncookies=1 &> /dev/null//打开cookie(预防轻量级的dos攻击,效果不是很好)
#
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=48000 &> /dev/null//设置tcp连接最长时间为48000秒(修改链接跟踪机制的established时间,链接跟踪表不容易满)
#
sysctl -w net.ipv4.ip_conntrack_max=300000 &>;/dev/null//设置链接跟踪表中最大连接数为300000(128M内存8192条)(每条消耗300个字节左右)
#
#######################################################################
iptables -I INPUT -s 192.168.0.50 -j ACCEPT//此IP全放行
iptables -I FORWARD -s 192.168.0.50 -j ACCEPT//此IP全转发
#(0.50可能是管理员机器)


#!/bin/sh
#
#
##########################################################################
# 
######################################定义环境,命令位置####################################
INNER_NET=192.168.0.0/24 # LAN 局域网 自由设定
FWALL_IP=192.168.0.1 # 防火墙的IP 你的机器的真实IP
INNER_PORT=eth1 # 局域网端IP
OUTER_PORT=ppp0 # Wan端IP
IPTABLES="/sbin/iptables" # iptables 命令
MODPROBE="/sbin/modprobe" # modprobe 命令
##########################################################################
# 
##########################################################################
$MODPROBE ip_tables
$MODPROBE iptable_filter
$MODPROBE ip_conntrack
$MODPROBE iptable_nat
$MODPROBE ip_nat_ftp
$MODPROBE ip_conntrack_ftp
$MODPROBE ipt_state
$MODPROBE ipt_MASQUERADE
$MODPROBE ipt_LOG
$MODPROBE ipt_REJECT
$MODPROBE ipt_limit
# 允许IP masquerade(变换)开转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 忽视ping的broadcast广播
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# 检查源IP
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done
# 记录不可能的(虚假)IP(比如内网出来个1段或其他段的,就是不可能的)
for f in /proc/sys/net/ipv4/conf/*/log_martians; do echo "1" > $f; done
# 忽视ICMP redirect message(icmp的重定向请求)(ping另一个网卡)
for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do echo 1 > $f; done
##########################################################################
# 
##########################################################################
$IPTABLES -P INPUT DROP # 
$IPTABLES -P OUTPUT DROP # 
$IPTABLES -P FORWARD DROP # 
$IPTABLES -F # 清空 flash chain
$IPTABLES -F -t nat
$IPTABLES -X # 删除用户定义的Chain
##########################################################################
# 
##########################################################################
#
#超过一定数量记录并丢弃 
#
$IPTABLES -N DROPPACKET # DROPPACKT chain的生成
$IPTABLES -A DROPPACKET -j LOG --log-prefix "INVALID_PACKET: " \
--log-level=3 -m limit --limit 1/s --limit-burst 10
$IPTABLES -A DROPPACKET -j DROP
#        
# 
#
$IPTABLES -N SYNFLOOD # SYNFLOOD chain的生成
# 
$IPTABLES -A SYNFLOOD -m limit --limit 10/s --limit-burst 20 -j RETURN 没有超过限定值的话返回
# 
$IPTABLES -A SYNFLOOD -m limit --limit 1/s --limit-burst 10 -j LOG \超过限定值,就视为SYNFLOOD攻击,记录并丢弃
--log-level=1 --log-prefix "SYNFLOOD: "
$IPTABLES -A SYNFLOOD -j DROP
       在最后添加一条规则 DROP
#
# 
#
$IPTABLES -N DROPFLAGS # DROPFLAGS chain的生成
$IPTABLES -A DROPFLAGS -j LOG --log-prefix "INVALID_FLAGS: " \
--log-level=3 -m limit --limit 1/s --limit-burst 10
$IPTABLES -A DROPFLAGS -j DROP记录非法的Flag TCP,并丢弃
#
# 
#(为了检查非法的TCP旗标组合,)(防扫描,扫描是入侵的第一步
$IPTABLES -N CHKFLAGS  新建链 CHKFLAGS
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags ACK,FIN FIN -j DROPFLAGS (检查ACK,FIN旗标,如果有FIN就丢弃)
             在最后添加一条规则 tcp协议   旗标 flags ACK,FIN    丢弃旗标   
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags ACK,PSH PSH -j DROPFLAGS
  在最后添加一条规则 tcp协议   旗标 flags ACK,PSH PSH   丢弃旗标
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags ACK,URG URG -j DROPFLAGS
 在最后添加一条规则 tcp协议     旗标 flags ACK,URG URG   丢弃旗标
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags FIN,RST FIN,RST -j DROPFLAGS
 在最后添加一条规则 tcp协议     旗标 flags FIN RST    丢弃旗标
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROPFLAGS
 在最后添加一条规则 tcp协议     旗标 flags SYN,FIN   丢弃旗标
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags SYN,RST SYN,RST -j DROPFLAGS
 在最后添加一条规则 tcp协议    旗标 flags SYN RST    丢弃旗标
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags ALL ALL -j DROPFLAGS
 在最后添加一条规则 tcp协议   旗标 flags 所有   丢弃旗标
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags ALL NONE -j DROPFLAGS
 在最后添加一条规则 tcp协议     旗标 flags 所有 或者都没有   丢弃旗标
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags ALL FIN,PSH,URG -j DROPFLAGS
 在最后添加一条规则 tcp协议    旗标 flags 所有  FIN PSH URG   丢弃旗标
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROPFLAGS
 在最后添加一条规则 tcp协议    旗标 flags  所有 SYN,FIN,PSH,URG   丢弃旗标
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROPFLAGS
# 在最后添加一条规则 tcp协议    旗标 flags 所有  SYN,RST,ACK,FIN,URG   丢弃旗标
# 
#(拒绝windows网络相关的端口,限制windows)
$IPTABLES -N CHKMSNET    添加新列表
$IPTABLES -A CHKMSNET -p tcp --dport 42 -j DROP #  tcp协议 目标为42端口的 DROP  (wins  的 dup )
$IPTABLES -A CHKMSNET -p tcp --dport 135 -j DROP #  tcp协议 目标135端口的DROP  (微软的 rpc 
$IPTABLES -A CHKMSNET -p udp --dport 135 -j DROP #  udp协议 目标135端口的DROP
$IPTABLES -A CHKMSNET -p udp --dport 137:138 -j DROP #  udp协议 目标端口 137,138端口的,DROP (可见。。windows,相当于网络探测的端口 ,类似于点开网上邻居后,里边出现其他电脑时,后台执行的命令)
$IPTABLES -A CHKMSNET -p udp --dport 137:138 -j DROP # udp协议 目标端口 137,,138端口的 DROP
$IPTABLES -A CHKMSNET -p tcp --dport 139 -j DROP #  tcp协议 目标端口为139的 DROP(一般不弄)
$IPTABLES -A CHKMSNET -p tcp --dport 445 -j DROP #  tcp协议 目标端口为445的 DROP (一般不弄)

##########################################################################
# INPUT Chain
##########################################################################
# 
$IPTABLES -A INPUT -i lo -j ACCEPT
#    在最后添加1条规则  lo端口  接受(本地lo 回环,许可)
$IPTABLES -A INPUT -m state --state INVALID -j DROPPACKET
#   在最后添加1条规则    INVALID状态的 DROPPACKET
$IPTABLES -A INPUT -p tcp --syn -j SYNFLOOD   (等同于检查旗标的 有syn标志的,就交给synflood处理)
#    在最后添加1条规则 
$IPTABLES -A INPUT -p tcp -j CHKFLAGS
#    在最后添加1条规则  tcp协议 应用CHKFLAGS链 
$IPTABLES -A INPUT -i $INNER_PORT -s $INNER_NET -j ACCEPT  (允许网内的连接)
#在最后添加1条规则   在$INNER_PORT  源为$INNER_PORT端口 接受
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  (允许已经建立的连接)
# 在最后添加1条规则  状态为ESTABLISHED,RELATED的,接受
$IPTABLES -A INPUT -i $OUTER_PORT -s $INNER_NET -j DROP  (-i  指定进来的接口,-s 内网的ip地址发来的数据包。。。外网来的内网的数据包,拒绝,
#在最后添加1条规则   在$OUTER_PORT,源为 $INNER_PORT   丢弃
# 
#
$IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT #
          在最后添加1条规则  tcp协议 目标端口为22 状态为NEW的 接受
$IPTABLES -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT # 
在最后添加1条规则   tcp协议 目标端口为80 状态为NEW的 接受
$IPTABLES -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT # 
在最后添加1条规则tcp协议 目标端口为443 状态为NEW的 接受
$IPTABLES -A INPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT # 
在最后添加1条规则tcp协议 目标端口为53 状态为NEW的 接受
$IPTABLES -A INPUT -p udp --dport 53 -m state --state NEW -j ACCEPT # 
在最后添加1条规则    udp协议 目标端口为53 状态为NEW的 接受
$IPTABLES -A  INPUT -m state --state NEW -m tcp -p tcp --dport 20000:30000 -j ACCEPT #
在最后添加1条规则     状态为NEW  协议为tcp  目标端口20000到30000的 接受
$IPTABLES -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT     # ftp的端口
在最后添加1条规则     tcp协议  目标端口为21  状态为NEW 的 接受
# 
$IPTABLES -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset(113跟认证有关的端口,拒绝认证)
# (其实icmp放行,限制一下数量就行了)                    
在最后添加1条规则     tcp协议  目标端口为133的 弹回 
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -s $INNER_NET -j ACCEPT
在最后添加1条规则            icmp协议 响应为要求的  源为 $INNER_NET的 接受
$IPTABLES -A INPUT -p icmp --icmp-type echo-reply -s $INNER_NET -j ACCEPT
在最后添加1条规则           icmp协议  响应为回答的 源为  $INNER_NET 的接受 
$IPTABLES -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
在最后添加1条规则          icmp协议   目标不可达的 接受
$IPTABLES -A INPUT -p icmp --icmp-type source-quench -j ACCEPT
在最后添加1条规则          icmp协议  源quench的 接受
$IPTABLES -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
在最后添加1条规则          icmp协议  超时的 接受
$IPTABLES -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
#                     
在最后添加1条规则     icmp协议   类型为 parameter问题的 接受
$IPTABLES -A INPUT -j LOG --log-prefix "UNDEFIND_INPUT: " \
--log-level=3 -m limit --limit 1/s --limit-burst 10
在最后添加1条规则  写入日志,添加字段为 UNDEFIND_INPUT
                                   封包1秒发送1个,容器容量为10
##########################################################################
# OUTPUT Chain
##########################################################################
# 
$IPTABLES -A OUTPUT -o lo -j ACCEPT
#在最后添加1条规则    lo端口 接受
$IPTABLES -A OUTPUT -p tcp -j CHKFLAGS
# 在最后添加1条规则    tcp协议 接受
$IPTABLES -A OUTPUT -o $INNER_PORT -s $FWALL_IP -j ACCEPT(允许防火墙到内网服务器的连接)
#在最后添加1条规则    $INNER_PORT 端口,源为$FWALL_IP的  接受
$IPTABLES -A OUTPUT -j CHKMSNET
# 在最后添加1条规则  到 CHKMSNET
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 在最后添加1条规则   状态为 ESTABLISHED,RELATED的 接受
$IPTABLES -A OUTPUT -m state --state NEW -j ACCEPT
# icmp(OUT)在最后添加1条规则  状态为 NEW的 接受
$IPTABLES -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
在最后添加1条规则   icmp协议  类型为 echo-request的 接受

$IPTABLES -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
在最后添加1条规则       icmp协议  类型为 echo-reply的 接受
$IPTABLES -A OUTPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
在最后添加1条规则         icmp协议  类型为 目标无法到达的 接受
$IPTABLES -A OUTPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT
在最后添加1条规则       icmp协议  类型为 fragmentation-needed 的 接受
$IPTABLES -A OUTPUT -p icmp --icmp-type source-quench -j ACCEPT
在最后添加1条规则        icmp协议  类型为 source-quench的 接受
$IPTABLES -A OUTPUT -p icmp --icmp-type parameter-problem -j ACCEPT
#                   
在最后添加1条规则  icmp协议  类型为 parameter-problem的 接受
$IPTABLES -A OUTPUT -j LOG --log-prefix "UNDEFIND_ICMP: " --log-level=3 \
-m limit --limit 1/s --limit-burst 10

在最后添加1条规则     写入日志标记为 UNDEFIND_ICMP
               封包 1秒发送1个  容器容量为10
##########################################################################
# IP变换
##########################################################################
# 
$IPTABLES -A FORWARD -j CHKMSNET
# 在最后添加1条规则  应用 CHKMSNET
$IPTABLES -t nat -A POSTROUTING -o $OUTER_PORT -s $INNER_NET -j MASQUERADE
#        nat表中  添加一条规则到最后   源为 $INNER_NET  地址伪装
$IPTABLES -A FORWARD -i $OUTER_PORT -o $INNER_PORT -d $INNER_NET -m state \
--state NEW,ESTABLISHED,RELATED -j ACCEPT
# 在最后添加1条规则    端口为$OUTER_PORT  目标为$INNER_NET  状态为ESTABLISHED,RELATED的,接受
$IPTABLES -A FORWARD -i $INNER_PORT -o $OUTER_PORT -s $INNER_NET -m state \
--state NEW,ESTABLISHED,RELATED -j ACCEPT
在最后添加1条规则  入端口为$INNER_PORT  出端口为$OUTER_PORT  源为$INNER_NET 状态为NEW,ESTABLISHED,RELATED的 接受 
exit 0退出



echo "firewall start! let us go!"    弹出  防火墙开启  冲啊
echo 1 > /proc/sys/net/ipv4/ip_forward  写入 /proc/sys/net/ipv4/ip_forward 值为1
echo 1 > /proc/sys/net/ipv4/ip_dynaddr  写入  /proc/sys/net/ipv4/ip_dynaddr 值为1 (按需拨号)
echo 0 > /proc/sys/net/ipv4/tcp_ecn    写入  /proc/sys/net/ipv4/tcp_ecn  值为0 (IPV4中  ipv4   解决路由器和防火墙上的数据拥塞作用,如果设置为1 ,可能导致路由器防火墙拥塞)
echo 1 > /proc/sys/net/ipv4/tcp_syncookies   写入 /proc/sys/net/ipv4/tcp_syncookies  值为1
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts  写入/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts  值为1

#加载相关模块
/sbin/modprobe ip_tables
/sbin/modprobe iptable_nat
/sbin/modprobe iptable_filter
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ipt_MASQUERADE
/sbin/modprobe ipt_state
/sbin/modprobe ipt_multiport

#清空规则
/sbin/iptables -F  删除规则
/sbin/iptables -t nat -F 删除 nat中的规则

#
/sbin/iptables -Z       清零   filter表
/sbin/iptables -t nat -Z  清零 nat表

#设置默认规则
#/sbin/iptables -P INPUT DROP   INPUT默认规则 改为DROP
#/sbin/iptables -P FORWARD DROP FORWARD 默认规则 改为 DROP
#/sbin/iptables -P OUTPUT DROP  OUTPUT 默认规则 改为DROP

#允许本地的连接
/sbin/iptables -A INPUT -i lo -j ACCEPT  在最后添加一条规则 INPUT链  通过lo端口的 接受
/sbin/iptables -A OUTPUT -o lo -j ACCEPT 在最后添加一条规则 OUTPUT链 通过lo端口的 接受

#允许外出的连接
/sbin/iptables -A OUTPUT -o eth1 -p tcp -m state --state ESTABLISHED,NEW,RELATED -j ACCEPT
           在最后添加一条规则  通过端口eth1 协议tcp的,状态为 ESTABLISHED,NEW,RELATED的 接受
#有可能是允许到虚拟专用网的连接(VPN相关)
/sbin/iptables -A OUTPUT -o eth0 -d $PRIV -j ACCEPT
  在最后添加一条规则   OUTPUT链 中  通过eth0口,目标为 $PRIV 的 接受
#
/sbin/iptables -A INUPUT -i eth0 -p tcp -s $PRIV -j ACCEPT
      在最后添加一条规则 INPUT链 中 通过eth0端口的 协议tcp的 源为 $PRIV 接受
#允许已经建立的连接
iptables -A INPUT -i eth1 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
   在最后添加一条规则  通过eth1口的 协议为tcp的 状态为 ESTABLISHED,RELATED的 接受
#允许Ping
/sbin/iptables -A INPUT -p icmp --icmp-tye echo-request -m limit --limit 1/s --limit-burst 10 -j ACCEPT
                 在最后添加一条规则  协议为icmp 类型为 echo-request    封包 1秒发送1个 容器容量为10  接受
/sbin/iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
  在最后添加一条规则    协议为icmp 类型为  echo-reply  接受
#允许DNS
/sbin/iptables -A OUTPUT --dport 53 -j ACCEPT
        在最后添加一条规则  目标端口为 DNS的接受
/sbin/iptables -A INPUT --sport 53 -j ACCEPT
在最后添加一条规则                  源端口为 DNS的 接受
#windows相关的   (multiport 多端口匹配)
/sbin/iptables -A FORWARD -p tcp -m multiport --dport 135,137,138,139,445 -j ACCEPT
在最后添加一条规则  协议tcp 目标端口为 135.137.138.139.445的 接受
/sbin/iptables -A FORWARD -i eth0 -j ACCEPT
在最后添加一条规则     通过eth0端口的 接受
/sbin/iptables -A FORWARD -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
在最后添加一条规则   通过eth1 端口的 状态为 ESTABLISHED,RELATED的 接受
/sbin/iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
在最后添加一条规则    状态为 ESTABLISHED,RELATED 的接受
/sbin/iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 120 -j LOG --log-level DEBUG
在最后添加一条规则 封包每秒 发送100个 容器容量为120 的 写入日志 并删除
#
#
/sbin/iptables -t nat -A PREROUTING -p tcp -i eth1 -d 221.226.x.x --dport 80-j DNAT --to-destination 192.168.5.16:80
            在最后添加一条规则   协议为tcp  通过端口eth1 目标地址为 221.226.X.X 目标端口80的 地址转换为 目标192.168.5.16:80
/sbin/iptables -t nat -A POSTROUTING -p tcp -o eth1 -s 192.168.5.16 --sport 80-j SNAT --to-source 221.226.x.x
在最后添加一条规则   协议为tcp  通过端口eth1 源地址为 192.168.5.16 源端口80的 地址转换为源 192.168.5.16:80
#
/sbin/iptables -t nat -A PREROUTING -p tcp -i eth1 -d 221.226.x.x --dport 21 -j DNAT --to-destination 192.168.5.16:21
 在最后添加一条规则       协议为tcp     通过eth1 进入的 目标地址为221.226.x.x 目标端口 21 地址转换 目标地址为 192.168.5.16:21
/sbin/iptables -t nat -A POSTROUTING -p tcp -o eth1 -s 192.168.5.16 --sport 21-j SNAT --to-source 221.226.x.x:21
 在最后添加一条规则       协议为tcp   通过eth0口输出的 源为192.168.5.16 源端口21 地址转换为 源 221.226.x,x:21
/sbin/iptables -t nat -A PREROUTING -p tcp -i eth1 -d 221.226.x.x --dport 20-j DNAT --to-destination 192.168.5.16:20
 在最后添加一条规则       协议为tcp   通过eth1 口 进入的 目标地址221.226.x.x 目标端口为20 地址转换为 目标 192.168.5.16:20
/sbin/iptables -t nat -A POSTROUTING -p tcp -o eth1 -s 192.168.5.16 --sport 20-j SNAT --to-source 221.226.x.x:20
 在最后添加一条规则       协议为tcp    通过eth1口输出的 源为 192.168.5.16 源端口 20 地址转换为 源 221.226.x.x:20
#
/sbin/iptables -t nat -A PREROUTING -p tcp -i eth1 -d 221.226.x.x --dport 443 -j DNAT --to-destination 192.168.5.16:443
 在最后添加一条规则       协议为tcp   通过eth1口进入的 目标地址221.226.x.x 目标端口 443 地址转换为 目标 192.168.5.16:443
/sbin/iptables -t nat -A POSTROUTING -p tcp -o eth1 -s 192.168.5.16 --dport 443 -j SNAT --to-source 221.226.x.x:443
 在最后添加一条规则       协议为tcp  通过eth 1 口 传出 源地址192.168.5.16 目标端口 443 地址转换为 源221.226.x.x:443
#邮件   143windows的邮件能用到
/sbin/iptables -t nat -A PREROUTING -p tcp -i eth1 -d 221.226.x.x --dport 25-j --to-destination 192.168.5.16:25
 在最后添加一条规则       协议为tcp    通过端口 eth1 目标地址 221.226.x.x 目标端口25 地址转换为 目标 192.168.5.16:25
/sbin/iptables -t nat -A POSTROUTING -p tcp -o eth1 -s 192.168.5.16 --sport 25-j --to-source 221.226.x.x:25
 在最后添加一条规则       协议为tcp      通过端口 eth1 传出 源为 192.168.5.16 源端口为25 转换为 源 221.226.x.x:25
/sbin/iptables -t nat -A PREROUTING -p tcp -i eth1 -d 221.226.x.x --dport 110 -j --to-destination 192.168.5.16:110
 在最后添加一条规则       协议为tcp     通过端口  eth1 传入的  目标地址 221.226.x.x 目标端口110 的转换为 目标地址 192.168.5.16:110
/sbin/iptables -t nat -A POSTROUTING -p tcp -o eth1 -s 192.168.5.16 --sport 110 -j --to-source 221.226.x.x:110
 在最后添加一条规则       协议为tcp    通过端口 eth1  源为192.168.5.16 源端口为110 转换为 源 221.226.x.x:110
/sbin/iptables -t nat -A PREROUTING -p tcp -i eth1 -d 221.226.x.x --dport 143 -j --to-destination 192.168.5.16:143
 在最后添加一条规则       协议为tcp     通过端口   eth1 传入  目标地址为221.226.x.x 目标端口143 转换为目标端口 192.168.5.16:143
/sbin/iptables -t nat -A POSTROUTING -p tcp -o eth1 -s 192.168.5.16 --sport 143 -j --to-source 221.226.x.x:143
 在最后添加一条规则       协议为tcp     通过端口   eth1 传出 源为192.168.5.16 源端口 为143 转换为 源 221.226.x.x:143
#telnet
/sbin/iptables -t nat -A PREROUTING -p tcp -i eth1 -d 221.226.x.x --dport 23-j --to-destination 192.168.5.16:23
 在最后添加一条规则       协议为tcp     通过端口  eth1 目标地址为221.226.x.x,目标端口23 转换为目标地址 192.168.5.16:23
/sbin/iptables -t nat -A POSTROUTING -p tcp -o eth1 -s 192.168.5.16 --sport 23-j --to-source 221.226.x.x:23
 在最后添加一条规则       协议为tcp     通过端口 eth1 源192.168.5.16 源端口23 转换为  源地址 221.226.x.x:23
#ssh
/sbin/iptables -t nat -A PREROUTING -p tcp -i eth1 -d 221.226.x.x --dport 22-j --to-destination 192.168.5.16:22
 在最后添加一条规则       协议为tcp      通过端口eth1 传入   目标地址221.226.x.x 目标端口22 转换为目标地址 192.168.5.16:22
/sbin/iptables -t nat -A POSTROUTING -p tcp -o eth1 -s 192.168.5.16 --sport 22-j --to-source 221.226.x.x:22
 在最后添加一条规则       协议为tcp     通过端口eth1 传出   源地址 192.168.5.16 源端口22 转换为 源 221.226.x.x:22
#snat伪装
/sbin/iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
     在最后添加一条规则    通过eth1端口输出的 地址伪装            
/sbin/iptables -A INPUT -i eth1 -j ext
   在最后添加一条规则   通过eth1端口的 ext

 

posted on 2017-12-27 23:56  Mahavairocana  阅读(425)  评论(0编辑  收藏  举报

导航