iptables命令学习(1):filter表
一. 简介
iptables可能是linux中最复杂的命令了吧,学习使用起来真是吃力。
但是使用起来后,发现只需要了解很少的iptables知识就可以先用起来,后面有什么实际需求,再结合需求继续学习吧。
而这很少的iptables知识,就是filter表的操作,这儿记录下。
二. 安装
当然需要先安装iptables,才能使用它。
install_iptables.sh
# 卸载firewalld,我之前装的是firewalld
systemctl stop firewalld
systemctl disable firewalld
yum -y remove firewalld
rm -rf /var/log/firewalld /run/firewalld /vps/save/install/common/conf/firewalld /usr/share/firewalld
rm -rf /usr/sbin/firewalld /usr/lib/firewalld /etc/sysconfig/firewalld /etc/firewalld
# 安装iptables
yum -y install iptables iptables-services
systemctl start iptables
systemctl enable iptables
三. 基础知识:四表五链
四表
- filter
- nat
- mangle
- raw
filter,过滤,顾名思义,可以用来过滤数据包,允许哪些包进入和流出,拒绝哪些数据包的进入和流出。
其他几个表暂时先不用去弄清楚做什么的,当然,我现在就不怎么清楚他们是做什么的。
五链
- INPUT
- OUTPUT
- FORWARD
- PREROUTING
- POSTROUTING
INPUT链,处理进来的数据包,可以维护规则到这个链中
OUTPUT,处理出去的数据包
想想家里的门,进入、出去,INPUT、OUTPUT。
谁允许进入出去、谁不允许进入出去,filter表来过滤。
四. 常用命令
查看已有规则
iptables -nL --line-number
iptables默认操作的是filter表,上面命令和下面命令等价
iptables -nL --line-number -t filter
清除规则
#清空所有默认规则
iptables -t filter -F
#清空所有自定义规则
iptables -t filter -X
#所有计数器归0
iptables -t filter -Z
允许来自于lo接口的数据包(本地访问)
允许访问回环网卡,环回访问(127.0.0.1)是比较重要的,建议大家都开放
经常需要nginx本地转发请求到127.0.0.1上,就是发送到本地lo接口
iptables -I INPUT -i lo -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT
-i lo:匹配从lo接口进入的数据包
-o lo:匹配从lo接口出去的数据包
上面命令设置在iptables -nL --line-number
命令中和下面命令显示一样
iptables -I INPUT -j ACCEPT
iptables -I OUTPUT -j ACCEPT
设置后,在kvm 4.19版本内核机器上是生效的。
ovz 3.10版本内核机器则没有生效,所有INPUT和OUTPUT都允许,不知道为啥。
开放端口
允许50022端口数据包进入
iptables -I INPUT -p tcp --dport 50022 -j ACCEPT
允许50022端口数据包出去
iptables -I OUTPUT -p tcp --sport 50022 -j ACCEPT
--dport是destination port,数据包目标端口是50022
--sport是source port,数据包来源端口是50022
删除规则
删除序号为1的规则
iptables -D INPUT 1
iptables -D OUTPUT 1
iptables -nL --line-number
第一列是序号
默认策略
设置链默认策略为丢弃数据包,即没找到匹配的规则处理,则丢弃
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
INPUT和FORWARD默认丢弃数据包,保证安全
OUTPUT是我们发送的数据包,默认接受。
我们的策略是严进宽出。
服务器上网
允许已经建立的连接INPUT进入
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
上面OUTPUT默认是ACCEPT放行,所以发送出去的请求是没问题的。
但是INPUT默认是DROP丢弃,如果没有规则匹配到就会丢弃掉,我们还是上不了网。
上面的规则允许所有状态为ESTABLISHED的数据包INPUT,而我们发送出去的数据包后,它的状态就是ESTABLISHED了,就可以上网啦。
保存规则
service iptables save
五. 我的完整脚本
install_iptables.sh
# 卸载firewalld
systemctl stop firewalld
systemctl disable firewalld
yum -y remove firewalld
rm -rf /var/log/firewalld /run/firewalld /vps/save/install/common/conf/firewalld /usr/share/firewalld
rm -rf /usr/sbin/firewalld /usr/lib/firewalld /etc/sysconfig/firewalld /etc/firewalld
# 安装iptables
yum -y install iptables iptables-services
systemctl start iptables
systemctl enable iptables
#清空所有默认规则
iptables -t filter -F
#清空所有自定义规则
iptables -t filter -X
#所有计数器归0
iptables -t filter -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
iptables -t mangle -F
iptables -t mangle -X
iptables -t mangle -Z
iptables -t raw -F
iptables -t raw -X
iptables -t raw -Z
#允许来自于lo接口的数据包(本地访问)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 允许已经建立的连接INPUT进入
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 服务端
# 允许ssh 50022端口
iptables -A INPUT -p tcp --dport 50022 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 50022 -j ACCEPT
# 允许http 80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
# 允许https 443端口
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 50443 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 50443 -j ACCEPT
# 允许mysql 3306端口
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 3306 -j ACCEPT
# dns
# grep domain /etc/services
iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# 默认
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 保存规则
service iptables save
访问网络需要查询dns,所以这儿开放53端口。
六. 结尾
这样设置完,可以实现基本的防火墙功能了,后面有有新的需求、活着发现问题再进行补充吧,就酱。
参考:
- http://www.zsythink.net/archives/tag/iptables/page/2/
- http://www.netingcn.com/iptables-localhost-not-access-internet.html