<code>iptables -nl</code>
查看本机关于iptables的设置情况,默认查看的是<code>-t filter</code>,可以指定<code>-t nat</code>
<code>iptables-save > iptables.rule</code>
会保存当前的防火墙规则设置,命令行下通过iptables配置的规则在下次重启后会失效,当然这也是为了防止错误的配置防火墙。默认读取和保存的配置文件地址为<code>/etc/sysconfig/iptables</code>。
设置chain默认策略
将 input 链默认处理策略设置为drop,前提是已经存在一条可以访问22端口的规则。这里要说明的是,在添加这类拒绝访问的规则之前,一定要想好执行完,会不会把自己关在防火墙外面,不然就傻眼了。像下面这句。
<code>iptables -i input 1 -m state --state related,established -j accept</code>
把这条语句插在input链的最前面(第一条),对状态为established,related的连接放行。
这条规则在某种情况下甚至比下面开放ssh服务都重要:① 如果input连默认为drop,② input链默认为input,但存在这条规则<code>-a input -j reject --reject-with icmp-host-prohibited</code>,上面两种情况下都必须添加<code>--state related,established</code>为第一条,否则22端口无法通行,把自己锁在防火墙外面了。
有了这条规则,可保证只要当前ssh没有关闭,哪怕防火墙忘记开启22端口,也可以继续连接。
<code>iptables -a input -m state --state new -m tcp -p tcp --dport 22 -j accept</code>
允许所有,不安全,默认。
<code>iptables -a input -s 172.29.73.0/24 -p tcp -m state --state new -m tcp --dport 22 -j accept</code>
限制指定ip范围能ssh,可取
<code>iptables -a input -s 10.30.0.0/16 -p tcp -m tcp -m multiport --dports 80,443 -j accept</code>
允许一个ip段访问多个端口
<code>iptables -a input -s 10.30.26.0/24 -p tcp -m tcp --dport 80 -j drop</code>
禁止某ip段访问80端口,将<code>-j drop</code>改成 <code>-j reject --reject-with icmp-host-prohibited</code>作用相同。
<code>iptables -a input -s 172.29.73.23 -j accept</code>
完全信任某一主机,尽量不使用
<code>iptables -i input 2 -i lo -j accept</code>
允许loopback。回环接口是一个主机内部发送和接收数据的虚拟设备接口,应该放行所有数据包。指定插入位置为 2 则之前该编号为 2 规则依次后移。
<code>-a input -p icmp -j accept</code>
接受icmp数据包,可以ping。也可以设置只允许某个特定的ip,见后文。
<code>iptables -a input -j reject --reject-with icmp-host-prohibited</code>
这条规则用在input链默没有drop的情况,作用与<code>-p drop</code>相同,当前面所有的规则都没匹配时,自然落到这个 reject 上。
类似的forward链也可以这么用:<code>iptables -a forward -j reject --reject-with icmp-host-prohibited</code>。
当然,更强的规则是将<code>ouput</code>链也设置成drop,这样一来情况就会复杂很多,如就是发送名解析请求,也要添加规则<code>iptables -a output -p udp --dport 53 -j accept</code>。
正是因为这样的太过麻烦,所以一般output策略默认为accept。(安全性比较高的系统除外)
<code>iptables -nl --line-number</code>
显示每条规则链的编号
<code>iptables -d forward 2</code>
删除forward链的第2条规则,编号由上一条得知。如果删除的是nat表中的链,记得带上<code>-t nat</code>
<code>iptables -d input -j reject --reject-with icmp-host-prohibited</code>
删除规则的第二种方法,所有选项要与要删除的规则都相同才能删除,否则提示<code>iptables: no chain/target/match by that name.</code>
丢弃非法连接
iptables -a input -m state --state invalid -j drop
iptables -a output -m state --state invalid -j drop
iptables-a forward -m state --state invalid -j drop
首先要开启端口转发器必须先修改内核运行参数ip_forward,打开转发:
本机端口转发
此时外部访问http的80端口便可自动转到8080(浏览器地址栏不会变),而且又具有很高的性能,但如果你通过服务器本地主机的curl或firfox浏览器访问<code>http://localhost:80</code>或<code>http://doman.com:80</code>都是不行(假如你有这样的奇葩需求),这是因为本地数据包产生的目标地址不对,你需要额外添加这条 output 规则:
下面的规则可以达到同样的效果:
异机端口转发
要实现的是所有访问 192.168.10.100:8000 的请求,转发到 172.29.88.56:80 上,在 192.168.10.100 是哪个添加规则:
需要注意的是,如果你的forward链默认为drop,上面所有端口转发都必须建立在forward链允许通行的情况下:
为22端口的input包增加日志功能,插在input的第1个规则前面,为避免日志信息塞满<code>/var/log/message</code>,用<code>--limit</code>限制:
<code>vi /etc/rsyslog.conf</code> 编辑日志配置文件,添加<code>kern.=notice /var/log/iptables.log</code>,可以将日志记录到自定义的文件中。
<code>service rsyslog restart</code> #重启日志服务
syn洪水是攻击者发送海量的syn请求到目标服务器上的一种dos攻击方法,下面的脚本用于预防轻量级的dos攻击:
<code>ipt-tcp.sh</code>:
全选复制放进笔记
<code>iptables -n syn-flood (如果您的防火墙默认配置有“ :syn-flood - [0:0] ”则不许要该项,因为重复了) iptables -a input -p tcp --syn -j syn-flood iptables -i syn-flood -p tcp -m limit --limit 2/s --limit-burst 5 -j return iptables -a syn-flood -j reject # 防止dos太多连接进来,可以允许外网网卡每个ip最多15个初始连接,超过的丢弃 # 需要iptables v1.4.19以上版本:iptables -v iptables -a input -p tcp --syn -i eth0 --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j drop #用iptables抵御ddos (参数与上相同) iptables -a input -p tcp --syn -m limit --limit 5/s --limit-burst 10 -j accept iptables -a forward -p tcp --syn -m limit --limit 1/s -j accept iptables -a forward -p icmp -m limit --limit 2/s --limit-burst 10 -j accept iptables -a input -p icmp --icmp-type 0 -s ! 172.29.73.0/24 -j drop</code>