天天看点

iptables的备份及脚本构成

    在Linux中,iptables为我们提供了批量备份与恢复规则的命令,防火墙脚本实际上是一个shell脚本程序,便于使用shell变量、程序控制逻辑,在需要重用、移植使用时会非常方便,只需修改下变量值就可使用

iptables的备份及还原

    防火墙规则的批量备份、还原用到两个命令,即iptables-save和iptables-restore,分别用来保存和恢复

1. iptables-save命令

    用来批量导出防火墙规则,直接执行命令时,将显示当前启用的所有规则

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<code>[root@localhost ~]</code><code># iptables-save</code>

<code># Generated by iptables-save v1.4.7 on Sun Jan  7 06:07:58 2018      //注释</code>

<code>*filter                                                              </code><code>//</code><code>所在的表</code>

<code>:INPUT ACCEPT [0:0]                                                  </code><code>//</code><code>链名,默认策略</code>

<code>:FORWARD ACCEPT [0:0]</code>

<code>:OUTPUT ACCEPT [41:5449]</code>

<code>-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT              </code><code>//</code><code>规则,省略了iptables</code>

<code>-A INPUT -p icmp -j ACCEPT </code>

<code>-A INPUT -i lo -j ACCEPT </code>

<code>-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT </code>

<code>-A INPUT -j REJECT --reject-with icmp-host-prohibited </code>

<code>-A FORWARD -j REJECT --reject-with icmp-host-prohibited </code>

<code>COMMIT                                                               </code><code>//</code><code>提交前面的规则设置</code>

<code># Completed on Sun Jan  7 06:07:58 2018</code>

<code>[root@localhost ~]</code><code># iptables-save &gt; /opt/iptables.txt                //备份所有表的规则</code>

<code>[root@localhost ~]</code><code># iptables-save &gt; /etc/sysconfig/iptables          //每次开机后,根据保存的规则内容进行重建</code>

2. iptables-restore命令

    用来批量导入Linux防火墙规则,如果已经使用iptables-save命令导出的备份文件,则恢复的过程一瞬间就能完成

<code>[root@localhost ~]</code><code># iptables-restore /opt/iptables.txt               //从备份文件中恢复规则</code>

使用防火墙脚本

1. 定义基本变量

    可以在防火墙规则较多时,定义以下变量,一旦网络环境发生变化,只需改下变量值就可使用

<code>[root@localhost ~]</code><code># vim /opt/iptables.sh      //创建脚本文件</code>

<code>#!/bin/bash </code>

<code>INET_IF= </code><code>"eth0"</code>                               <code>//</code><code>外网接口</code>

<code>INET_IP=</code><code>"218.29.30.31"</code>                        <code>//</code><code>外网接口地址</code>

<code>LAN_IF=</code><code>"eth1"</code>                                 <code>//</code><code>内网接口</code>

<code>LAN_IP= </code><code>"192.168.1.1"</code>                         <code>//</code><code>内网接口地址</code>

<code>LAN_NET=</code><code>"192.168.1.0/24"</code>                      <code>//</code><code>内网网段</code>

<code>LAN_WWW_IP=</code><code>"192.168.1.6"</code>                      <code>//</code><code>网站服务器的内部地址</code>

<code>IPT=</code><code>"/sbin/iptables"</code>                          <code>//iptables</code><code>命令路径</code>

<code>MOD=</code><code>"/sbin/modprobe"</code>                          <code>//modprobe</code><code>命令路径</code>

<code>CTL=</code><code>"/sbin/sysctl"</code>                            <code>//sysctl</code><code>命令路径</code>

2. 加载内核模块

    如果需要启用的规则数量较多,为了提高规则设置的效率,保持防火墙的稳定性,建议将用到的各种模块提前加载到内核中

<code>$MOD ip_tables                 </code><code>//iptables</code><code>基本模块</code>

<code>$MOD ip_conntrack              </code><code>//</code><code>连接跟踪模块</code>

<code>$MOD ipt_REJECT                </code><code>//</code><code>拒绝操作模块</code>

<code>$MOD ipt_LOG                   </code><code>//</code><code>日志记录模块</code>

<code>$MOD ipt_iprange               </code><code>//</code><code>支持IP范围匹配</code>

<code>$MOD xt_tcpudp                 </code><code>//</code><code>支持TCP、UDP协议</code>

<code>$MOD xt_state                  </code><code>//</code><code>支持状态匹配</code>

<code>$MOD xt_multiport              </code><code>//</code><code>支持多端口匹配</code>

<code>$MOD xt_mac                    </code><code>//</code><code>支持MAC地址匹配</code>

<code>$MOD ip_nat_ftp                </code><code>//</code><code>支持FTP匹配</code>

<code>$MOD ip_conntrack_ftp          </code><code>//</code><code>支持FTP连接跟踪</code>

3. 调整/proc参数

    在文件夹/proc/sys下存放着与系统相关的一些可控参数,可以直接用来改变内核的行为,通常作为Linux内核调优的实时入口,下面列出几个常用的/proc参数

<code>$CTL -w net.ipv4.ip_forward=1                 </code><code>//</code><code>打开路由转发功能</code>

<code>$CTL -w net.ipv4.ip_default_ttl=128           </code><code>//</code><code>修改ICMP响应超时</code>

<code>$CTL -w net.ipv4.icmp_echo_ignore_all=1       </code><code>//</code><code>拒绝响应ICMP请求</code>

<code>$CTL -w net.ipv4.icmp_echo_ignore_broadcasts          </code><code>//</code><code>拒绝响应ICMP广播</code>

<code>$CTL -w net.ipv4.tcp_syncookies=1             </code><code>//</code><code>启用SYN Cookie机制</code>

<code>$CTL -w net.ipv4.tcp_syn_retries=3            </code><code>//</code><code>最大SYN请求重试次数</code>

<code>$CTL -w net.ipv4.tcp_synack_retries=3         </code><code>//</code><code>最大ACK确认重试次数</code>

<code>$CTL -w net.ipv4.tcp_fin_timeout=60           </code><code>//TCP</code><code>连接等待超时</code>

<code>$CTL -w net.ipv4.tcp_max_syn_backlog=3200     </code><code>//SYN</code><code>请求的队列长度</code>

4. 设置具体的iptables规则

   iptables的nat表主要用在Linux网关服务器,一般的主机型防火墙很少用到nat表

    iptables的filter表主要用来过滤各种数据包,无论是Linux网关还是一般的Linux服务器都可能用的。主机型的防火墙主要使用INPUT、OUTPUT链,而对于网络型防火墙主要使用FORWARD链

<code>$IPT -t filter -X          </code><code>//</code><code>删除各表中自定义的链</code>

<code>$IPT -t nat -X             </code>

<code>$IPT -t filter -F          </code><code>//</code><code>清空各表中已有的规则</code>

<code>$IPT -t nat -F</code>

<code>$IPT -P INPUT DROP         </code><code>//</code><code>设置规则链的默认策略</code>

<code>$IPT -P FORWARD DROP</code>

<code>$IPT -P OUTPUT ACCEPT</code>

<code>$IPT -t nat -A POSTROUTING -s $LAN_NET -o $INET_IF -j SNAT --to-</code><code>source</code> <code>$INET_IP    </code><code>//SNAT</code><code>策略,局域网共享上网</code>

<code>$IPT -t nat -A PREROUTING -i $INET_IF -d $INET_IP -p tcp --dport 80 -j DNAT --to-destination $LAN_WWW_IP   </code><code>//DNAT</code><code>策略,发布内部Web服务器</code>

<code>$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p tcp --dport 80 -j ACCEPT       </code><code>//</code><code>允许内网与Internet中DNS、FTP、Web服务通信</code>

<code>$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p tcp --dport 20:21 -j ACCEPT</code>

<code>$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p udp --dport 53 -j ACCEPT</code>

5. 执行脚本

    在实际应用中,不要生硬的照搬他人脚本内容,应根据情况进行针对型的设计,并做好整天规划,避免产生通信故障

<code>[root@localhost ~]</code><code># chmod +x /opt/iptables.sh     //添加执行权限</code>

<code>[root@localhost ~]</code><code># /opt/iptables.sh              //执行脚本文件</code>

<code>[root@localhost ~]</code><code># vim /etc/rc.local             //设置为开机自动执行</code>

<code>/opt/iptables</code><code>.sh</code>

    对于大多数应用服务器,防火墙只针对本机进行防护,因此filter表中的INPUT、OUTPUT链用到的最多,特别是前者

案例:某公司的Web服务器采用RHEL6操作系统,为了加强网络访问的安全性,要求管理员熟悉iptables防火墙规则的编写,以便制定有效、可行的主机防护策略

需求描述:

(1)调整TCP相关参数,提高抵抗DoS攻击的能力

(2)只允许访问本机的Web服务,禁止其他任何形式的入站访问数据

(3)允许响应本机访问请求的数据包

实验步骤:

18

19

20

21

22

23

24

25

26

27

<code>[root@localhost ~]</code><code># vim /opt/iptables_web.sh</code>

<code>#!/bin/bash</code>

<code># 1. 定义基本变量</code>

<code>IPT=</code><code>"/sbin/iptables"</code>                                                    

<code>CTL=</code><code>"/sbin/sysctl"</code>

<code># 2. 调整/proc参数</code>

<code>$CTL -w net.ipv4.tcp_syncookies=1             </code>

<code>$CTL -w net.ipv4.tcp_syn_retries=3         </code>

<code>$CTL -w net.ipv4.tcp_synack_retries=3        </code>

<code>$CTL -w net.ipv4.tcp_fin_timeout=60           </code>

<code>$CTL -w net.ipv4.tcp_max_syn_backlog=3200     </code>

<code># 3. 删除自定义的链、清空已有规则</code>

<code>$IPT -t filter -X          </code>

<code>$IPT -t mangle -X</code>

<code>$IPT -t raw -X</code>

<code>$IPT -t filter -F         </code>

<code>$IPT -t mangle -F</code>

<code>$IPT -t raw -F</code>

<code># 4. 定义默认策略</code>

<code>$IPT -P INPUT DROP         </code>

<code># 5. 设置filter表中的规则</code>

<code>$IPT -A INPUT -s $LAN_NET -o $INET_IF -p tcp --dport 80 -j ACCEPT</code>

<code>$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT</code>

<code></code>

本文转自 杨书凡 51CTO博客,原文链接:http://blog.51cto.com/yangshufan/2058232,如需转载请自行联系原作者

继续阅读