netfilter: 工作内核中,让规则能够生效网络框架
iptables: 工作于用户空间,编写规则并且发送到netfilter
四表:
raw,mangle,nat,filter(默认表)
五链:
PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
表和链的对应关系:
filter:
INPUT, FORWARD, OUTPUT
nat:
PREROUTING, OUTPUT, POSTROUTING
mangle:
PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
检查条件:
IP:SIP, DIP
TCP:SPORT, DPORT, Flags
UDP:SPORT, DPORT
ICMP:ICMP-TYPE
扩展机制:
time,string, state(connection-tracking)
处理机制:
DROP
REJECT
ACCEPT
SNAT
DNAT
RETURN
REDIRECT
LOG
iptables [-t table] -N chain
创建一条自定义的规则链
iptables [-t table] -X [chain]
删除自定义的空链
iptables [-t table] -E old-chain-name new-chain-name
修改自义链名
iptables [-t table] -P chain target
为链指定默认策略,指定默认规则
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
-F: 清空链中的规则
规则有编号,在链中自上而下,从1开始;
-L: list,列出表中的所有规则;
-n: 数字格式显示IP和Port
-v: 以详细格式显示
pkts bytes target prot opt in out source destination
pkts: packets, 被本规则所匹配到的报文的个数;
bytes: 被本规则所匹配到的所有报文的大小之和,会执行单位换算;
target: 目标,即处理机制;
prot: 协议,一般为{TCP|UDP|ICMP};
opt: 可选项
in: 数据包的流入接口;
out: 数据包的流出接口;
source: 源地址;
destination: 目标地址;
-vv
-vvv
-x: exactly, 精确值,不执行单位换算;
--line-numbers: 显示各规则的行号;
-Z: zero, 把规则的计数器清零
iptables [-t table] {-A|-I|-D|-R} chain rule-specification
规则命令:
追加规则
iptables [-t table] -A chain [rulenum] rule-specification
删除规则
iptables [-t table] -D chain rulenum
插入规则
iptables [-t table] -I chain [rulenum] rule-specification
替换指定规则
iptables [-t table] -R chain rulenum rule-specification
只显示指定链上的规则添加命令:
iptables [-t table] -S [chain [rulenum]]
rule-specification
匹配条件 -j 处理机制
匹配条件:
通用匹配:
-s :匹配原地址,可以IP,也可以网络地址;可以使用!操作符取反, ! 172.16.0.0/16; -s 相当于 --src, 或 --source
-d : 匹配目标地址
-p : 匹配协议,通常只使用{TCP|UDP|ICMP}三者之一;
-i :数据报文流入的接口;通常只用于INPUT、FORWARD和PREROUTING
-o :流出的接口;通常只用于OUTPUT、FORWARD和POSTROUTING
扩展匹配
隐含扩展: 使用-p {tcp|udp|icmp}指定某特定协议后,自动能够对协议进行的扩展
-p icmp
--icmp-type
8: ping请求
0:ping响应
放行ping其它主机
iptables -A OUTPUT -s 192.168.130.61 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 192.168.130.61 -p icmp --icmp-type 0 -j ACCEPT
放行其它主机ping自己
iptables -A INPUT -d 192.168.130.61 -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -p icmp --icmp-type 0 -j ACCEPT
-p udp
--dport
--sport
放行本机dns服务,自己作为DNS客户端
iptables -A OUTPUT -s 192.168.130.61 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -d 192.168.130.61 -p udp --sport 53 -j ACCEPT
放行本机dns服务,自己作为DNS服务器
iptables -A INPUT -d 192.168.130.61 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -p udp --sport 53 -j ACCEPT
放行本机的tftp服务,自己作为tftp服务器(测试不成功,无法传输数据)
iptables -A INPUT -d 192.168.130.61 -p udp --dport 69 -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -p udp --sport 69 -j ACCEPT
-p tcp
--dport m[-n] :匹配的目标端口,可以是连续的多个端口;
--sport :匹配的源端口
--tcp-flags rst,syn,ack,fin syn
放行本机web服务,自己作为web客户端
iptables -A OUTPUT -s 192.168.130.61 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -d 192.168.130.61 -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -p tcp --dport 443-j ACCEPT
iptables -A INPUT -d 192.168.130.61 -p tcp --sport 443 -j ACCEPT
放行本机ss服务,自己作为ss服务器
iptables -t filter -A INPUT -d 192.168.130.61 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.130.61 -p tcp --sport 22 -j ACCEPT
显式扩展:必须要明确指定的扩展模块
-m 扩展模块名称 --专用选项1 --专用选项2
multiport: 多端口匹配,一次指定多个(15个以内)离散端口
--sports port[,port|,port:port]
--dports
--ports
[root@localhost ~]#
[root@localhost ~]# iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT DROP
-A INPUT -d 192.168.130.61/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -d 192.168.130.61/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -d 192.168.130.61/32 -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -d 192.168.130.61/32 -p tcp -m tcp --sport 80 -j ACCEPT
-A INPUT -d 192.168.130.61/32 -p tcp -m tcp --sport 443 -j ACCEPT
-A INPUT -d 192.168.130.61/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A OUTPUT -s 192.168.130.61/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A OUTPUT -s 192.168.130.61/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A OUTPUT -s 192.168.130.61/32 -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -s 192.168.130.61/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -s 192.168.130.61/32 -p tcp -m tcp --dport 443 -j ACCEPT
-A OUTPUT -s 192.168.130.61/32 -p tcp -m tcp --sport 22 -j ACCEPT
使用multiport将80,443这3条合并为1条
iptables -A INPUT -d 192.168.130.61 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -p tcp -m multiport --sports 80,443 -j ACCEPT
iprange: ip地址范围
[!] --src-range from[-to]
[!] --dst-range from[-to]
只允许192.168.130.1-192.168.130.60范围内的IP能ssh访问192.168.130.61
iptables -A INPUT -d 192.168.130.61 -p tcp --dport 22 -m iprange --src-range 192.168.130.1-192.168.130.60 -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -p tcp --sport 22 -m iprange --dst-range 192.168.130.1-192.168.130.60 -j ACCEPT
time: 指定时间范围
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --weekdays day[,day...]
只有每周的周一至周五的8点到18点可以访问192.168.130.61的web服务器
iptables -A INPUT -d 192.168.130.61 -p tcp --dport 80 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -p tcp --sport 80 -j ACCEPT
string: 字符串匹配
--algo {bm|kmp}:字符匹配查找时使用算法
--string "STRING": 要查找的字符串
--hex-string “HEX-STRING”: 要查找的字符,先编码成16进制格式
禁止访问192.168.130.61含有google字符的网站
iptables -I OUTPUT -s 192.168.130.61 -p tcp --sport 80 -m string --algo kmp --string "google" -j DROP
connlimit: 每IP对指定服务的最大并发连接数;
[!] --connlimit-above [n]
iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m connlimit --connlimit-above 3 -j DROP
ab -c 200 -n 2000 https://172.16.100.7/test.html
limit: 报文速率控制
--limit #[/second|/minute|/hour|/day]
--limit-burst #
iptables -A INPUT -d 192.168.130.61 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 5 -j ACCEPt
初始可以达到每秒ping 5次,平均每秒不能超过2个
state: 状态匹配
--state
NEW
ESTABLISHED
RELATED
INVALID
调整连接追踪功能所能容纳的追踪的最大连接数:
# cat /proc/sys/net/nf_conntrack_max
定义了连接追踪的最大值,因此,建议按需调大此值;
# cat /proc/net/nf_conntrack
记录了当前追踪的所有连接
# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
法则:
1、对于进入的状态为ESTABLISHED都应该放行;
2、对于出去的状态为ESTABLISHED都应该放行;
3、严格检查进入的状态为NEW的连接;
4、所有状态为INVALIED都应该拒绝;
如何放行工作于被动模式下的FTP服务?
1、确保iptables加载ftp协议支持的模块:ip_nat_ftp, ip_conntrack_ftp
编辑/etc/sysconfig/iptables-config文件,定义如下参数:
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp
2、放行请求报文的RELATED和ESTABLISHED状态,放行响应报文的ESTABLISHED状态;
iptables -A INPUT -d 192.168.130.61 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -d 192.168.130.61 -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -p tcp --sport 21 -j ACCEPT
-j target
RETURN: 返回调用链
练习:判断下述规则的意义:
# 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 192.168.130.61 -j RETURN
# iptables -A INPUT -d 192.168.130.61 -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 --dports 53,113,135,137,139,445 -j DROP
# iptables -A INPUT -i eth0 -m multiport -p udp --dports 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 --dports 1433,4899 -j DROP
# iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT
利用iptables的recent模块来抵御DOS***: 22,建立一个列表,保存有所有访问过指定的服务的客户端IP
ssh: 远程连接,
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;
2.利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制五分钟后即可恢复访问。
下面对最后两句做一个说明:
1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH
--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
--update 是指每次建立连接都更新列表;
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用
3.iptables的记录:/proc/net/xt_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"
路由:对于Linux主机来说,设定/proc/sys/net/ipv4/ip_forward的值为1,即为开启了路由功能;
NAT: 过载技术
Basic NAT: 静态NAT;
NAPT:动态NAT,网络地址端口转换;
源地址转换:SNAT,用于让内网主机访问互联网
目标地址转换:DNAT,让互联网上主机访问本地内网中的某服务器上的服务,(发布)
iptables基于SNAT和DNAT这两个目标实现地址转换技术;
-j SNAT --to-source SIP
规则添加:POSTROUTING链
-j MASQUERADE
-j DNAT --to-destination DIP[:PORT]
支持端口映射
例子:
# iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.20.11
# iptables -A FORWARD -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo kmp --string "hello" -j REJECT
# iptables -t nat -A PREROUTING -d 192.168.130.61 -p tcp --dport 22022 -j DNAT --to-destination 192.168.20.12:22
保存规则:
service iptables save
规则会被保存至/etc/sysconfig/iptables文件中;
默认,start时也会读取此文件中的内容以设置规则;
# iptables-save > /path/to/some_rulefile
# iptables-restore < /path/from/some_rulefile