wangbin
  • wangbin
  • 2019-08-10
  • IT

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

三. 基础知识:四表五链

四表

  1. filter
  2. nat
  3. mangle
  4. raw

filter,过滤,顾名思义,可以用来过滤数据包,允许哪些包进入和流出,拒绝哪些数据包的进入和流出。

其他几个表暂时先不用去弄清楚做什么的,当然,我现在就不怎么清楚他们是做什么的。

五链

  1. INPUT
  2. OUTPUT
  3. FORWARD
  4. PREROUTING
  5. 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端口。

六. 结尾

这样设置完,可以实现基本的防火墙功能了,后面有有新的需求、活着发现问题再进行补充吧,就酱。

参考:

  1. http://www.zsythink.net/archives/tag/iptables/page/2/
  2. http://www.netingcn.com/iptables-localhost-not-access-internet.html