Linux防火墙基础
Linux中,防火墙是链型的。一个表就是一套链。数据包在Linux网络子系统的各部分移动时,内核就会对包应用某套规则。
例如,从物理层接收到一个新的包之后,内核就会根据输入的数据激活对应的规则。这些数据由内核来维护,整系统叫做iptables。
还有一个叫nfttables的新系统,用于取代iptables
规则表有很多,表里的规则也有很多。
filter表,控制基本的包流动,该表里有三个基本的链:包输入INPUT
、包输出OUTPUT
、包转发FORWARD
iptables
iptables是一款基于命令行的防火墙策略管理工具。
iptables命令可以根据流量的源地址、目的地址、传输地址、服务类型等信息进行匹配,一旦匹配成功,iptables就会根据策略规则所预设的动作来处理这些流量。
参数 | 作用 |
---|---|
-P | 设置默认策略 |
-F | 清空规则链 |
-L | 查看规则链 |
-A | 在规则链的末尾加入新规则 |
-I num | 在规则链的头部加入新规则 |
-D num | 删除某一条规则 |
-s | 匹配来源地址IP/MASK,加叹号"!",表示除这个IP外 |
-d | 匹配目标地址 |
-i 网卡名称 | 匹配从这块网卡流入的数据 |
-o 网卡名称 | 匹配从这块网卡流出的数据 |
-p | 匹配协议,如TCP、UDP、ICMP |
–dport num | 匹配目标端口号 |
–sport num | 匹配来源端口号 |
查看当前的设置:iptables -L
设置链的策略:iptables -P FORWARD DROP
防火墙策略
防火墙的基本应用场景有两种:
一种是保护单台机器(在每台机器的INPUT链插入规则),另一种是保护整个网络里的机器(在路由器的FORWARD链插入规则)。
例如,如果有一个SSH服务在TCP端口22,那就不应该让别人连到22以外的端口。要做到这样,首先将INPUT链策略设置为DROP:
iptables -P INPUT DROP
但可以通过以下命令,允许ICMP通信(给ping或其他工具使用)
iptables -A INPUT -p icmp -j ACCEPT
确保你能收到自己发给自己的包,包括自己的IP地址和localhost127.0.0.1。
iptables -A INPUT -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -s my_addr -j ACCEPT
如果控制着整个子网(并信任其中所有东西),可以将my_addr替换为你的子网地址和掩码,比如10.23.2.0/24。
虽然想阻止所有TCP连接请求,但是还要确保自己能对外界发出TCP连接请求。而因为所有由外而内的TCP请求都只有SYN位是被置位的,所以用以下命令可以做到只屏蔽接收的请求:
iptables -A INPUT -p tcp '!' --syn -j ACCEPT
如果用的是基于UDP的DNS,必须允许接收域名服务器发来的包,这样机器才能借助DNS查找域名。例如,允许接收/etc/resolv.conf中所有DNS服务器的数据包的话,用以下命令:
iptables -A INPUT -p udp --source-port 53 -s 域名服务器地址 -j ACCEPT
允许所有SSH连接:
iptables -A INPUT -p tcp --destination-port 22 -j ACCPT