Linux:网络防火墙
netfilter:Frame
iptables:数据报文过滤,NAT,mangle等生成工具;
网络:IP报文首部,TCP报文首部
防火墙:硬件,软件:规则(匹配标准,处理办法)
Framework:
默认规则:
开放:堵
关闭:通
规则:匹配标准
IP:SIP,DIP
TCP:SPORT,DPORT, SYN=1, FIN=0,RST=0,ACK=0; SYN=1,ACK=1,FIN=0,RST=0; ACK=1,SYN=0RST=0,FIN=0(ESTABLISHED)
UDP:SPORT,DPORT
ICMP:icmp-type
数据报文过滤:
Linux2.0
ipfw/firewall
Linux2.2
ipchain/firewall
Linux2.4
iptables/netfilter
hook function:钩子函数
prerouting
input
output
forward
postrouting
规则链:
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
filter(过滤) 表
INPUT
OUTPUT
FORWARD
nat(地址转换) 表
PREROUTING
OUTPUT
POSTROUTING
mangle(拆开、修改、封装):表
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
raw():
PREROUTING
OUTPUT
iptables:
500条规则
能否使用自定义链?
可以使用自定链,但只在被调用时才能发挥作用,而且如果没有自定义链中的任何规则匹配,还应该有返回机制;
用可以删除自定义的空链
默认链无法删除
每个规则都有两个内置的计数器:
被匹配的报文个数
被匹配的报文大小之和
规则:匹配标准,处理动作
iptables [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j 处理办法
匹配标准:
通用匹配
-s,--src:指定源地址
-d,--dst:指定目标地址
-p,{tcp|udp|icmp}:指定协议
-i,INITERFACE:指定数据报文流入的接口
可用于标准定义的链:OUTPUT,POSTROUTING,FORWARD
-o,INTERFACE:指定数据报文流出的接口
可用于标准定义的链:OUTPUT,POSTROUTING,FORWARD
扩展匹配
隐含扩展:不用特别指明有那个模块进行的扩展,因为此时使用-p {tcp|udp|icmp}
-p tcp
--dport目标端口,支持连续
--sport源端口,支持连续
--tcp-flags mask comp:只检查mask指定的标志位,是逗号分隔的标志位列表;
comp:此列表中出现的标记位必须为1,comp中没出现,而mask中出现的,必须为0;
--tcp-falgs SYN,FIN,ACK,RST SYN=--syn
--syn专门用来匹配tcp三次握手中的第一
-p icmp
--icmp-type
0:echo-reply
8:echo-request
-p udp
--sport
--dport
显示扩展:必须指明有哪个模块进行的扩展,在iptables中使用-m 选项可完成此功能
-m EXTESTION --spe-opt
state:状态扩展
结合ip_conntrack追踪会话的状态
NEW:新连接请求
ESTABLISHED:已建立的连接
INVALID:非法连接
RELATED:相关联的
- m state --state NEW,ESTABLISHED -j ACCEPT
首先要装载ip_conntrack_ftp和ip_nat_ftp模块,编辑/etc/sysconfig/iptables-config
例:iptables -A INPUT -d 192.168.100.100 -p tcp -m state --state ESTABLISHED.RELATED -j ACCEPT
multiport:离散的多端口匹配扩展
--source-ports
--destination-ports
--ports
例:-m multiport --destion-ports 21,22,80 -j ACCEPT
-m iprange
--src-range
--dst-range
-s,-d
-s IP,NET
192.168.0.0/16,192.168.100.3-192.168.100.100
例:iptables -A INPUT -p tcp -m iprange --src-range 192.168.100.3-192.168.100.100 --dport 22 -m state --state NEW ,ESTABLISHED -j ACCEPT
-m connlimit:连接数限制
! --connlimit-above 数字
例:iptables -A INPUT -d 192.168.100.7 -p tcp --dport 80 -m connlimit --connlimit-above 2 -j ACCEPT
-m limit
--limit [RATE]数字/时间
--limit-burst 一批放行多少
例:iptables -A INPUT -d 192.168.100.150 -p icmp --icmp-type 8 -m limit --limit 5/minute -j ACCEPT
iptables -A INPUT -d 192.168.100.150 -p icmp --icmp-type 8 -m limit --limit 5/minute --limit-burst 6 -j ACCEPT
-m string 字符串
--algo {bm|kmp}这是两种算法指定哪一种都行
--string "STRING"
例:iptables -I INPUT -d 192.168.100.150 -m string --algo kmp --string "法轮功" -j REJECT
iptables -I OUTPUT -s 192.168.100.150 -m string --algo kmp --string "法轮功" -j REJECT
-j TARGET
LOG
--log-prefix "STRING"
例:iptables -A INPUT -d 192.168.100.150 -p icmp --icmp-type 8 -j LOG --log-prefix "STRING"
保存规则:
# service iptables save
/etc/sysconfig/iptables
# iptables-save > /etc/sysconfig/iptables.2018052901
# iptables-restore < /etc/sysconfig/iptables.2018052901
命令:
管理规则:
-A:附加一条规则,添加在链的尾部
-I:CHAIN [num]:插入一条规则,插入为对应的CHAIN上的第num条;
-D:CHAIN [num]:删除指定链中的第num条规则;
-R:CHAIN [num]:替换指定规则;
管理链:
-F [CHAIN]:flush,清空指定规则链,如果省略CHAIN,则可以实现删除对应表中的所所有链
-P CHAIN:设定指定链的默认策略;
-N 自定义一个新的空链
-X 删除一个自定义的空链
-Z 置零指定链中所有规则的计数器;
-E 重命名自定义的链
查看类:
-L:显示指定表中的规则;
-n:以数字格式显示的主机地址和端口号;
-v:显示链及规则的详细信息
-vv:
-x“显示计数器的精确值
--line-numbers:显示规则号码
动作(target):
ACCEPT:放行
DROP:丢弃
REJECT:拒绝
DNAT:目标地址转换
SNAT:源地址转换
REDIRECT:端口重定向
MASQUERADE:地址伪装
LOG:日志
MARK:打标记
iptables不是服务,但有服务脚本;服务脚本的主要作用在于管理保存的规则
装载及移除iptables/netfilter相关的内核模块;
iptables_nat,iptables_filter,iptables_mangle,iptables_raw,ip_nat,ip_conntrack
练习:规则的意义
#iptables -N clean_in #引用自定义链:#iptables -A INPUT -j calean_in
创建条新的链(名字)
#iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
#iptables -A clean_in -d 192.168.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 192.168.100.7 -j RETURN
#iptables -A INPUT -d 192.168.100.7 -j clean_in
#iptables -A INPUT -i lo -j ACCEPT
#iptables -A OUTPUT -o lo -j ACCEPT
#iptables -A INPUT -i eth0 -m multiport -p tcp --dport 53,113,135,137,139,445 -j DROP
#iptables -A INPUT -i eth0 -m multiport -p udp --dport 53,113,135,137,139,445 -j DROP
#iptables -A INPUT -i eth0 -p udp --dport 1026 -j DROP
#iptables -A INPUT -i eth0 -m multiport -p tcp --dport 1433,4899 -j DROP
#iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT
利用iptables的recent模块来抵御DOS攻击
ssh:远程连接
iptables -I INPUT -p tcp -dport 22 -m connlimit --connlimit-above 3 -j DROP
利用connlimit模块将单IP 的并发设置为3 :会误杀使用NAT上网的用户,可以根据实际情况增大该值
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
记录访问tcp 22端口的新链接,记录名为SSH
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
利用recent和state模块限制单IP在300s内只能与本机建立3个新连接。被限制5分钟后即可恢复访问。
--update 是指每次建立连接都更新列表
--seconds 必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--uodate同时使用
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"
NAT:Network Address Translation
DNAT:目标地址转换,(PREROUTING)
SNAT:源地址转换(POSTROUTING,OUTPUT)
-j SNAT
--to-source
ADSL:123.2.3.2 公网地址
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j SNAT --to-source 123.2.3.2
-j DNAT 需要指定对什么服务进行转发
--to-destination IP[:port] 端口映射
例:iptables -t nat -A PREROUTING -d 192.168.100.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.150
监在8080端口的话改为
iptables -t nat -A PREROUTING -d 192.168.100.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.150:8080
PNAT:port NAT 端口转换