IPtables学习笔记四
一、自定义链
定义一条新链: # iptables -N clean_in 添加规则: # iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP # iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP # iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP # iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP # iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP 如果上面的规则一条也没匹配到,则返回到主链: # iptables -A clean_in -d 172.16.100.7 -j RETURN 被主链调用: # iptables -I INPUT -j clean_in 删除自定义链 #iptables -X clean_in (但是,必须要求clean_in为空链)
二、利用iptables的recent模块来抵御DOS攻击
如果有客户端不断的试图暴力**服务器的密码,则需要用到recent模块
前面已经对iptables的-m选项有所了解了,接下来介绍-m选项中的recent模块
recent模块 常用参数 --name #设定列表名称,默认DEFAULT。 --rsource #源地址,此为默认。 --rdest #目的地址 --seconds #指定时间内 --hitcount#命中次数 --set #将地址添加进列表,并更新信息,包含地址加入的时间戳。 --rcheck #检查地址是否在列表,以第一个匹配开始计算时间。 --update #和rcheck类似,以最后一个匹配计算时间。 --remove #在列表里***相应地址,后跟列表名称及地址
要防止客户端对服务器的暴力**方法1:
#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
但是这种方法不好,因为利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;
我们可以利用recent和state模块限制单IP在300s内只能与本机建立3个新连接。被限制五分钟后即可恢复访问:
#iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH 记录访问tcp 22端口的新连接,记录名称为SSH 。--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目 #iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。 --update 是指每次建立连接都更新列表; --seconds必须与--rcheck或者--update同时使用 --hitcount必须与--rcheck或者--update同时使用
以上记录会被保存在:/proc/net/ipt_recent/SSH
当然也可以自己用日志形式进行记录。
三、网络防火墙(NAT Network Address Translation)
之前的iptables规则都是在默认表(filter)的INPUT和OUTPUT链上,相当于是主机防火墙
接下来,对设置网络防火墙,主要有:
SNAT:源地址转换
DNAT:目标地址转换
都是在网关(相当于一台电脑有两个网口,一个接内网,一个接外网)上进行设置的。
将/proc/sys/net/ipv4/ip_forward置为1,则该主机便打开了网络间转发功能,转发所有报文。(可以作为路由器)
3.1、源地址转换
-j SNAT --to-source 明确指定修改源地址为什么 -j MASQUERADE:地址伪装(会自动选择一个能上互联网的地址,转换过去)若用ADSL拨号上网,则得到的地址会一直变,因此用MASQUERADE只有外网地址是动态获取的时候才用MASQUERADE,因为效率很低)
例1:
公网地址:ADSL:172.16.100.7 要让内网地址能访问互联网上的任何一个网络 启用地址转换 #iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 172.16.100.7 转换为多个网关 #iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 172.16.100.7-172.16.100.9 接例1、不允许ping外网但是可以与外网通信 #iptables -A FORWARD -s 192.168.10.0/24 -p icmp -j REJECT (拒绝ping) #iptables -L -n 查看是否匹配到
例2、给网关设置规则来过滤报文
所有经过网关转发的报文都需要经过网关的forward链
#iptables -P FORWARD DROP 默认规则丢弃 只要是已建立的连接就放行 #iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT (如果为已建立的连接,就放行) 只允许内网用户访问外网 #iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT (放行) 放行内网用户ping出去 #iptables -A FORWARD -s 192.168.10.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT 放行内网用户ftp服务(确保已经装载了与ftp相关的内核模块): #iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT (放行了ftp的命令连接) #iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT (放行ftp的数据连接)
3.2、DNAT:目标地址转换 (服务器打开了ip_forward网卡间转发)
-j DANT --to-destination IP[:port]一定要指明端口号
两台服务器一台http一台ftp,但只有一个网关(公网地址),希望两台服务器都能被外网访问,这时就需要目标地址访问
做目标地址转换,一定是数据报文刚进入网卡时就转换,在路由选路发生之前就转换
外网地址:172.16.100.11 网关:172.16.100.7
内网地址:192.168.10.22 网关:192.168.10.6
当外网有人访问的http服务时,转换到内网的地址【回应数据报文时,会自动做源地址转换】
#iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.22 也可以用不同的端口响应原始的访问PNAT #iptables -t nat -R PREROUTING 1 -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.22:8080 外网用户访问内网服务时,如果包含mazi字符串,则拒绝 #iptables -A FORWARD -m sting --algo kmp --string "mazi" -j DROP #iptables -L -n -v 查看是否匹配到规则