iptables
ESTABLISHED已经建立的连接
INVALID信息报与任何已知的流或连接都不相关联,可能包含了错误的数据或头。
NEW表示该信息包已经或即将启动新的连接,或者他与尚未用于发送和接收信息包的连接相关联
RELATED表示该信息包正在启动新连接,以及他与已建立的连接相关联的连接。
数据报的流向:
PREROUTING --> FORWARD --> POSTROUTING
PREROUTING --> INPUT --> 本机 --> OUTPUT --> POSTROUTING
filter默认表,内建的链:INPUT,OUTPUT,FORWARD
nat包含源、目的地址及端口转换使用的规则,内建的规则链包括PREROUTING,OUTPUT,POSTROUTING
mangle表包含用于设置特殊的数据包路由标志的规则。随后filter表中的规则会检查这些标志。内建的规则链包括:PREROUTING,INPUT,FORWARD,POSTROUTING,OUTPUT
INPUT链:当一个数据包由内核中的路由计算确定为本地的linux系统后,他会通过INPUT链的检查。
OUTPUT链:保留给系统自身生成的数据包
FORWARD链:经过linx系统路由的数据包,连接两个网络,数据包必须流经该防火墙。
PREROUTING链:用于修改目的地址(DNAT)
POSTROUTING链:用于修改源地址(SNAT)
动作:
ACCEPT
DROP
REDIRECT:将数据包重新转向到本机或另一台主机的某一个端口,通常实现透明代理或对外开放内网的某些服务
REJECT
SNAT:源地址转换,即改变数据包的源地址。在POSTROUTING链上进行该动作。
DNAT:目标地址转换,在PREROUTING链上进行该动作。
MASQUERADE:ip伪装,即常说的nat技术。如果主机的ip地址是静态固定的,就要使用SNAT
LOG:日志功能,将符合规则的数据包的相关信息记录在日志中,以便管理员的分析和排错。
iptables的状态state:
例子:
iptables -A INPUT -m state --state NEW -j DROP (不能在服务器使用,这样别人过来的请求连接,都会被drop)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables-save 会保存在/etc/sysconfig/iptables
iptables-restore会读取上面的配置
例子:
iptables -A INPUT -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
例子:
iptables -A INPUT -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 10 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 20/sec --limit-burst 200 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 80,443,25 -j ACCEPT
raw
prerouting,output
mangle
prerouting,input,forward,output,postrouting
nat
prerouting,output,postrouting
filter
input,forward,output
拒绝所有来自于x.x.x.x的本机内部web功能
input,filter
filter
匹配条件
netfilter,检查模块
扩展模块
处理动作
accept,drop,reject
iptables -t table command chain cretiria -j action
-t:raw mangle nat filter
command:对链或者对链中的规则进行管理操作
链中规则:
-A append
-I n , insert到第几条
-R n , replace替换第几条,或者 -R creteria
-D n ,删除第几条, 或者 -D creteria
对链管理:
-N 新建一个自定义链
-X 删除一个自定义空链
-E 重命名一条自定义链
-F 清空指定链,如果不指定链,则清空整个表中的所有链
-P 设定链的默认策略 iptables -t filter -P INPUT DROP
-Z 置零,每条规则都有两个计数器,一个是被本规则匹配到的所有数据包的个数;另一个是被本规则匹配到的所有数据包的大小之和
查看:
-L: 查看
-v -vv -vvv
--line-numbers
-x 显示精确值,不用M K
-n 不对端口或者地址做解析
service iptables save 保存规则
/etc/sysconfig/iptables 主配置文件,保存规则位置
匹配条件:
通用匹配:
-s 源地址
-d 目标地址
-p 协议icmp,tcp,udp
-i in_interface
-o out_interface
扩展匹配:有两种隐式扩展和显式扩展
隐式扩展
-p
--sport PORT1-PORT2
--dport PORT1-PORT2
--tcp-flags tcp的标识位,SYN、ACK、FIN、RST 、URG、PSH、ALL、NONE, 要跟两个参数,例如:iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,RST SYN,代表先检查哪些位,只有最后的SYN为1,其他必须为0
--syn
-p udp , udp是没有上面的标志位flag的
--sport
--dport
-p icmp
--icmp-type 0表示echo-reply 8表示echo-request
例如:不允许别人ping我们,iptables -t filter -A INPUT -s 172.16.0.0/16 -p icmp --icmp-type 8 -j DROP
例如:ssh服务放行,iptables -t filter -A INPUT -s 0.0.0.0/0 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT
显式扩展:
netfilter扩展模块引入的扩展,用于扩展匹配条件
-m 指定应用模块,
-m state 用于实现连接的状态检测
--state
NEW 发出请求一方就叫NEW
ESTABLISHED 建立连接后的状态
RELATED,一个服务用到多种连接。例如ftp
INVALID,非法的,无法识别的,无效的
例子:基于22端口的状态,默认策略为drop,放行
iptables -t filter -A INPUT -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -t filter -A OUTPUT -s 172.16.100.1 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
其实output只用一条,iptables -A OUTPUT -s 172.16.100.1 -m state --state ESTABLISHED -j ACCEPT
-m multiport 多端口
--source-ports
--destination-ports
--ports
例子:iptables -I INPUT 1 -D 172.16.100.1 -p tcp -m multiport --destination-ports 22,80 -m state NEW,ESTABLISHED -j ACCEPT
自定义链
iptables -N come_in
iptables -L -n 显示没有默认恶略,并且0 references
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.1 -j RETURN 如果上面的都没匹配上 就又返回到input里去匹配
iptables -A INPUT -d 172.16.100.1 -j clean_in
iptables -X come_in
lo允许
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -i lo -j ACCEPT
动作:
-j TARGET
ACCEPT
DROP
REJECT
REDIRECT
DNAT
SNAT
MASQUERADE 地址伪装
LOG
TCP:
被动打开:LISTEN, SYT_RECV, ESTABLISHED
主动打开:SYN_SENT, ESTABLISHED
主动关闭:FIN_WAIT1,FIN_WAIT2, CLOSING, TIME_WAIT, CLOSED
被动关闭:CLOSE_WAIT, LAST_ACK, CLOSED, LISTEN
显示扩展(续):
-m limit
例子:对ssh服务的新请求包 每分钟不能超过2个,多余的drop
iptables -I INPUT 1 -i eth0 -d x.x.x.x -p tcp --dport 22 -m limit --limit 2/minute --limit-burst 2 -m state --state NEW -j ACCEPT
iptables -I INPUT 2 -i eth0 -d x.x.x.x -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT 3 -i eth0 -d x.x.x.x -p tcp --dport 22 -j DROP
-m connlimit 每个客户端同时能连接的上限
[!] --connlimit-above n 多于n个表示满足条件,表示应该不允许
-m iprange 指定地址范围
--src-range ip-ip
--dst-range ip-ip
-m iprange --src-range 192.168.1.1-192.168.1.100
-m string 匹配字符
iptables -I OUTPUT 1 -o eth0 -s x.x.x.x -p tcp --sport 80 -m string --algo kmp --string "sex" -j DROP
在服务器里建2个html试试,服务器返回sex,所以放output
-m recent 允许我们动态创建一个ip地址列表,列表里的都是坏蛋,限制他们对服务器的任何请求,过一段时间再把他们放出来
利用iptables地recent模块来抵御dos攻击
ssh:远程连接
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP超过3个连接就drop
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m resent --set --name SSH把new状态地加到ssh列表里
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP如果5分钟内访问达到三次,加入ssh列表,并拒绝访问任何服务
1.利用connlimit模块将单ip地并发设置为3,会误杀使用nat上网地用户,可以根据世纪情况增大该值
2.利用recent和state模块限制单ip再300s内只能与本机建立3个新连接,被限制五分钟后即可恢复访问。
下面对最后两居做一个说明:
1,第一句是记录访问22端口的新连接,记录名称为ssh,--set记录数据包的来源ip,如果ip已经存在将更新已经存在的条目
2.第三局是指ssh记录中的ip,300s内发起超过3词连接则拒绝此ip的连接,update是之每次建立连接更新列表,seconds必须与rcheck或者update同时使用,hitcount必须与rcheck或者update同时使用
3.iptables的记录/proc/net/ipt_recent/SSH
也可使用下面这句记录日志
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH ATTACK"
DANT和SNAT
SNAT用于内网机器可以访问internet服务
源地址转换,离开本地的一刹那做转换,所以postrouting
内网后部机器执行:route add default gw 192.168.10.1 (这个ip是linux网关机器)
网关机器执行:iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth1 -j SNAT --to-source 172.16.100.1 (网关机器的ipd)
所以httpd的log里,访问地址是172.16.100.1,是网关的ip
ssh连接,也是172.16.100.1,是网关的地址
使用linux网关上网:
内网后部机器执行:route add default gw 192.168.10.1 (这个ip是linux网关机器)
网关机器执行:iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth1 -j SNAT --to-source 172.16.100.1
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -p tcp -m multiport --destination-ports 80,443,53 -j SNAT --to-source 123.1.21.3
如果拨号产生的 动态的 就用MASQUERADE,自动选择外网地址,作为转换后的源地址。
把所有非法sex的数据包drop
iptables -A FORWARD -m string --algo kmp --string "sex" -j DROP
80,snat,new,established 放行
sex拒绝
iptables -A FORWARD -s 192.168.0.0/24 -p tcp --sport 80 -m state --state ESTABLISHED -m string --algo kmp ~ --string "sex" -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT
DNAT 作用:把局域网的内部机器可以对外提供服务
PREROUTING
-j DNAT
--to-destination
需求:使内网的192.168.0.51-192.168.0.150能上网
并且192.168.0.2和0.3能够对外提供服务
网关服务器地址192.168.0.254
iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.1
FORWARD的-s 和 -d 进出都要开
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m iprange --dst-range 192.168.10.1-192.168.10.2 -p tcp -m multiport --destination-ports 22,80 -m state --state NEW -j ACCEPT
1
保存规则
service iptables save 保存在 /etc/sysconfig/iptables
or
iptables-save > /etc/sysconfig/iptables.3
or
iptables-restore < /etc/sysconfig/iptables.3