背景介绍
在前几天,于工发现我们内部的150服务器7554端口被外网访问了。该应用提供着内部的摄像头资源。为了避免被入侵,于是我添加了一些iptables规则,防止外网的访问。
解决方式
解决方式有两种:
- 关闭公司公网路由器对150服务器进行端口映射
- 在150服务器上进行iptables的规则设置,只允许内部网段进行访问。
对于第一种方式,只要将路由器上对应的端口映射关闭即可,不需要做其他操作。
第二种方式,需要在150上进行设置:
iptables -I INPUT -p tcp --dport 7554 -j DROP
iptables -I INPUT -s 192.168.18.0/24 -p tcp --dport 7554 -j ACCEPT
iptables -I INPUT -s 180.168.172.70 -p tcp --dport 7554 -j ACCEPT
service iptables save
第一条命令:在INPUT链中,将所有TCP协议,目的端口是7554的数据包,全部丢掉
第二条命令:在INPUT链中,将源IP为192.168.18.0/24网段,传输协议为TCP,目标端口是7554的数据包接收
第三条命令:和第二条类似,只不过接受的是某一个具体源IP。
第四条命令:保存设置,否则重启之后就不再生效。
iptables可通过 -t 来选择表,内建的规则表有三个,分别是:nat、mangle 和 filter。若没有指定,则默认为filter表。
至此,问题就解决了。但是在过程中,发现自己对netfilter表不熟悉了,iptables命令使用的也不熟练。顺便回顾一遍。
netfilter的四表五链
linux的防火墙其实就是netfilter。它主要包含以下四表五链:
filter表:过滤数据包
Nat表: 用于网络地址转换
Mangle表: 修改数据包的服务类型,TTL,并且可以配置路由器实现QOS
RAW表: 决定数据包是否被状态跟踪器机制处理
四张表的由优先级:raw>mangle>nat>filter
INPUT链:进来的数据包应用此规则链中的策略
OUTPUT链:外出的数据包应用此规则链中的策略
FORWARD链: 转发数据包时应用此规则链中的策略
PREROUTING链:对数据包做路由选择前应用此链中的规则
POSTROUTING链: 对数据包作路由器选择后应用此链中的规则
netfilter图可参考以下:
由图可知:
RAW(conntrack)表在PREROUTING和OUTPUT链中
mangle表在五链中都有
nat表存在PREROUTING和OUTPUT和POSTROUTING链中
filter表存在FORWARD和INPUT,OUTPUT链中。
iptables介绍
iptables只是一个应用工具。通过对netfilter的介绍,我们知道linux的防火墙框架就是netfilter。但是它是处于内核空间的,我们无法直接去控制。而iptables就是应用层的工具。
由于iptables内容较多,我这里主要通过几个例子来介绍。能够达到看懂命令,根据需求去搜索资料即可。
iptables的命令格式如下:
iptables command chain rule-specification [options]
//chain 指哪一条链
command
-APPEND (-A):表示附加,它会将规则添加到已有防火墙链中的末尾。规则在防火墙链中的位置很重要,因为在一般情况下,防火墙链中的最后一条是丢弃所有包。很可能导致新建规则无效
-DELETE (-D):表示删除规则。一般使用iptables -D chain rulenum
,删除chain中编号是rulenum的规则
-INSERT (-I):表示插入规则。一般使用iptables -I chain [rulenum] firewall-rule
,在chain中的添加规则为第rulenum条。后面的规则全都加1.若没有指定rulenum,默认是第一条
-LIST (-L):列出规则,一般使用iptables -L --line-numbers
-FLUSH (-F):清空规则。一般使用iptables -F [chain]
,清空chain中的规则。若没有指定chain,则全部清空。
options
-P 代表协议。若不指定定协议,则默认为all。/etc/protocols文件包含了所支持的协议和值。
-S 代表源地址。可以是ip,网路地址或主机名。若不指明源地址,则匹配所有源地址
-D 代表目的地址。和-S相似。
-J 表示跳转。指当某个数据包满足该规则时就跳转到写一个处理规则。不再继续顺序处理后面的规则判断。处理规则一般有:ACCEPT,DORP,QUEUE,RETURN。分别表示接受,丢弃,进入队列,返回。
-I 表示进入的网络接口。比如:-I eth0,表示该规则主要针对eth0接口进入的数据包。
-O 代表出站网络接口,和-I相似。
-SPORT 表示源端口。可以指定端口号或端口名称。在/etc/service文件中包含了所有允许的端口和对应的端口号(内容很多)。
-DPOT 表示目的端口。和-SPORT相似。
练习
基本的iptables的语法已经介绍完了,通过几个例子,更快的上手。
- 删除现有规则。
iptables -F
- 阻止一个特定的IP地址。
iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP
- 允许所有传入SSH。
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
4.将来自422端口的流量全部转到22端口。
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22