linux防火墙
1.netfilter中五个钩子函数和报文流向
三种报文流向
流入本机:PREROUTING-->INPUT-->用户空间进程
流出本机:用户空间进程-->OUTPUT-->POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTING
五个内置链chain:
INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
五个表table:filter、nat、mangle、raw、security
filter:过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表
nat:network address translation 地址转换规则表
优先级由高到低的顺序为:
security -->raw-->mangle-->nat-->filter
2.iptables
iptables 规则组成
规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理, 规则在链接上的次序即为其检查时的生效次序
匹配条件:默认为与条件,同时满足
基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
处理动作:称为target,跳转目标
·内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNAT,
·自定义处理动作:自定义chain,利用分类管理复杂情形
规则要添加在链上,才生效;
添加在自定义链上不会自动生效
白名单:只有指定的特定主机可以访问,其它全拒绝
iptables -P INPUT DROP 注意要事先加上规则否则xshell连接不上
黑名单:只有指定的特定主机拒绝访问,其它全允许,默认方式
iptables规则添加时考量点
要实现哪种功能:判断添加在哪张表上
报文流经的路径:判断添加在哪个链上
报文的流向:判断源和目的
匹配规则:业务需要
环境准备
Centos7,8
systemctl stop firewalld.service
systemctl disable firewalld. service
#或者
systemctl disable --now firewalld. service
3.iptables 用法说明
iptables -vnL --line-numbers :n是数字化显示,v显示的更详细,L列出规则,--line-numbers编号
案例
iptables -t filter -A INPUT -s 192.168.0.1 -j DROP -t选择表 filter为默认表 -A追加,后面选择链 -s源地址 -j动作 DROP直接抛弃
iptables -A INPUT -s 10.0.0.4 -j DROP
双方都访问不了了
iptables -F 清空规则
添加回环网卡
iptables -A INPUT -i lo -j ACCEPT
-I:insert, 插入,要指明插入至的规则编号,默认为第一条
iptables -I INPUT 2 -s 10.0.0.1 -j ACCEPT
-D:delete,删除 (1) 指明规则序号 (2) 指明规则本身
iptables -D INPUT 2
-R:replace,替换指定链上的指定规则编号
iptables -R INPUT 2 -s 10.0.0.100 -j ACCEPT
[!] -p, --protocol protocol:指定协议,可使用数字如0(all) protocol: tcp, udp, icmp, icmpv6
iptables -I INPUT 2 !-s 10.0.0.6 -p icmp -j ACCEPT
!取反,除了10.0.0.6协议是icmp的都接受
4.iptables扩展匹配条件
隐式扩展
iptables 在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加 载扩展模块
显式扩展及相关模块
显示扩展即必须使用-m选项指明要调用的扩展模块名称,需要手动加载扩展模块
tcp协议的扩展选项
iptables -I INPUT 2 -s 10.0.0.100 -p tcp --dport 80 -j REJECT
拒绝100访问tcp模块
[!] --syn:用于匹配第一次握手, 相当于:--tcp-flags SYN,ACK,FIN,RST SYN
udp 协议的扩展选项
[!] --source-port, --sport port[:port]:匹配报文的源端口或端口范围
[!] --destination-port,--dport port[:port]:匹配报文的目标端口或端口范围
icmp 协议的扩展选项
iptables -I INPUT 5 -s 10.0.0.100 -p icmp --icmp-type 8 -j REJECT
拒绝100的请求报文8,我可以访问100,100不能访问我
[!] --icmp-type {type[/code]|typename}
type/code
0/0 echo-reply icmp应答
8/0 echo-request icmp请求
multiport扩展
以离散方式定义多端口匹配,最多指定15个端口
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT 可以指定多端口
string扩展
对报文中的应用层数据做字符串模式匹配检测
iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "google" -j REJECT
如果相应报文里带谷歌就不能访问
state扩展
state 扩展模块,可以根据”连接追踪机制“去检查连接的状态,较耗资源
状态类型
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次 发出的请求ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信 状态RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪
[16:35:14 root@aiyoubucuo ~]$sysctl -a |grep nf_conntrack_max net.netfilter.nf_conntrack_max = 65536 net.nf_conntrack_max = 65536
vim /etc/sysctl.conf
net.netfilter.nf_conntrack_max = 655360
net.nf_conntrack_max = 655360
防止连接数超大
范例
不允许10.0.0.7访问本机,但本机可以访问10.0.0.7
iptables -I INPUT 3 -m state --state ESTABLISHED,RELATED -j ACCEPT
5.iptables规则保存
使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限
centos7,8
iptables-save > /root/iptables
iptables-restore < /root/iptables
开机自动写入
在 vim /etc/rc.local
写入 iptables-restore < /root/iptables
chmod +x /etc/rc.local
6 网络防火墙
SNAT
基于nat表的target,适用于固定的公网
[19:52:10 root@firewall ~]$vim /etc/sysctl.conf [19:58:15 root@firewall ~]$sysctl -p net.ipv4.ip_forward = 1
[22:08:28 root@firewall ~]$iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
10.0.0.0/24网段都可以利用公网地址访问外网,MASQUERADE动态地址静态地址可以使用
[23:39:29 root@server1 ~]$ping 192.168.0.6
PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.
64 bytes from 192.168.0.6: icmp_seq=1 ttl=63 time=1.78 ms
内网可以ping通外网
[23:38:28 root@initer ~]$ping 10.0.0.4
connect: Network is unreachable
外网ping不通内网
[23:40:45 root@server1 ~]$ssh 192.168.0.6
The authenticity of host '192.168.0.6 (192.168.0.6)' can't be established.
ECDSA key fingerprint is SHA256:iRsmzlIhWlf23RrhyPvDkg9SRnj5/azjYFENU+0ZkFg.
ECDSA key fingerprint is MD5:57:50:82:8c:f1:b7:85:5a:f7:2c:04:87:b4:42:98:15.
Are you sure you want to continue connecting (yes/no)?
10.0.0.5ssh外网
[23:46:16 root@initer ~]$ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.0.6:22 192.168.0.8:50576
ESTAB 0 36 192.168.0.6:22 192.168.0.1:53511
看到的请求是192.168.0.8
DNAT
DNAT:nat表的target,适用于端口映射,即可重定向到本机,也可以支持重定向至不同主机的不同端 口,但不支持多目标,即不支持负载均衡功能
[root@firewall ~]#iptables -t nat -A PREROUTING -d 192.168.0.8 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.5:80
[23:54:35 root@initer ~]$curl 192.168.0.8
server1 in lan
访问公网地址,自动跳转到10.0.0.5:80端口
7.REDIRECT 转发
REDIRECT,是NAT表的 target,通过改变目标IP和端口,将接受的包转发至同一个主机的不同端口, 可用于PREROUTING OUTPUT链
iptables -t nat -A PREROUTING -d 10.0.0.5 -p tcp --dport 80 -j REDIRECT -- to-ports 8080
在本机的防火墙修改,将80的访问自动转到本机的8080