如来神掌第一式第六招----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) 编辑 收藏 举报