iptables笔记

iptables

语法概述:iptables [-t 要操作的表] 操作命令 [要操作的链] [规则号码] [匹配条件] [-j 匹配到以后的动作]

note: [-t 操作表] 不写默认为 -t filter

一、常用两张表

  • filter 表
  • nat 表

二、filter 表

查看filter表中配置规则:iptables -L <==> iptables -t filter -L

如果要查看对应规则序号可以在后面追加:--line-number

2.1 三个链(Chain)
  • INPUT(入站)
  • OUTPUT(出站)
  • FORWARD(转发)
2.2 执行顺序
  • 以插入的顺序进行执行(第一条优先级最高,序号越大优先级越低。如要匹配指定端口访问,拒绝所有的规则应放在最后)

  • 操作命令:

-A 追加
-I 插入(可在[INPUT]等参数后加入序号,表示插入到第几条,默认第一条)
-D [Chain] [number] 删除链[Chain]序号为[number]的规则
-R repalce
-P 设置默认规则(不常用)
	 ex: iptables -t filter -P INPUT DROP // 当数据包咩有被规则列表里的任何规则匹配到时,按此默认规则处理
	 反例: iptables -P INPUT ACCEPT // 默认允许所有,覆盖默认丢弃所有
-F 清空
	 ex: 
	 		[1] iptables -F INPUT		// 清空filter表INPTUT链中的所有规则
	 		[2]	iptables -t nat -F PREROUTING // 清空nat表PREROUTING链中的所有规则
	 		note:
	 			1、-F 仅仅 清空链中规则,并不影响 -P 的设置的默认规则
	 			2、-P 设置了 DROP 后,使用 -F 一定要小心!!!
	 			3、如果不写链名,默认清空某表里所有规则
-L 查看
	 前置参数(非必须):
	 v: 显示详细信息,包括每条规则的匹配包数量和匹配字节数
	 x: 在 v 的基础上,禁止自动单位换算(K、M)
	 n: 只显示 IP 地址和端口号码,不显示域名和服务器名称

ex:
[1] iptables -t filter -A INPUT -j DROP -p tcp --dport 80 // 将到本机的所有80请求包丢弃
[2] iptables -t filter -A OUTPUT -j DROP -p tcp -d 192.168.1.1 // 发往192.168.1.1的包丢掉
[3] iptables -I INPUT -j ACCEPT -s 172.32.88.228 // 172.32.88.228所有请求都放行

三、nat 表

查看nat表中配置规则:iptables -t nat -L

3.1 四个链(Chain)
  • PREROUTING(在路由之前):可用作修改目的地址,反向代理
  • INPUT(入站):特殊场景改源地址
  • OUTPUT(出站):特殊场景改目的地址
  • POSTROUTING(在路由之后):可用作修改源地址,反向代理的响应
# 正常路线
PREROUTING -> INPUT -> OUTPUT -> POSTROUTING

# 需要转发时(修改目的地)
PREROUTING -> FORWARD -> POSTROUTING
# or (修改来源)
POSTROUTING -> FORWARD -> PREROUTING

# 特殊场景(如直接从forward发包,左右都可设置代理转发)
PREROUTING <-> INPUT <-> FORWARD <-> OUTPUT <-> POSTROUTING
3.2 反向代理(类似nginx)
# 将本机的[port]端口请求转发到[ip]:[port]
iptables -t nat -A PREROUTING -p tcp --dport [port] -j DNAT --to [ip]:[port]
# 将[ip]:[port]的响应转发到本机响应
iptables -t nat -A POSTROUTING -p tcp -d [ip] --dport [port] -j SNAT --to [ip] 
//-j SNAT --to [ip] <==> -j MASQUERADE

# 配置后响应不成功查看是否开启ip_forward 0-disable,1-enable
cat /proc/sys/net/ipv4/ip_forward

四、匹配条件

-i 流入
-o 流出
-s 来源地址
-d 目的地址
-p 协议类型
--sport 来源端口
--dport 目的端口

五、解决配置INPUT规则后无法上网问题

iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT

为何在没有添加上述规则就不能通信?因为建立一个通信连接需要服务器端和客户端交互才能完成。举例来说,从本机使用ssh客户端去登陆外部的ssh服务器,假设使用端口为12345,那么本就使用tcp端口号12345向服务器22端口发送一个请求,这个属于OUTPUT,由于OUTPUT规则没有任何限制,所以可以顺利到达服务器,服务器收到请求后,服务器会回应本机的tcp 12345端口,此时回应属于INPUT,如果INPUT中配置放行此规则,那么连接就无法完成,也即是本机无法和外部通信。外部的网络那么多,总不能逐条去配置INPUT规则,所以为了能访问外部网络,必须要配置上述规则。

六、解决数据库或ssh链接过慢问题

# 对进来的包的状态进行检测,已经建立tcp连接的包以及该连接相关的包允许通过 
# or 这个想要进入的封包是否为刚刚我发出去的回应?如果是刚刚我发出去的回应,那麼就可以予以接受放行
# RELATED:该封包为本机发出的封包有关
# ESTABLISHED:已建立的链接状态
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 加上DNS的53端口,ssh和mysql默认要做反向解析
iptables -I INPUT -j ACCEPT -p tcp --dport 53
iptables -I INPUT -j ACCEPT -p udp --dport 53

七、常用命令

# 将现有规则存入 /etc/sysconfig/iptables 文件,重启后原有命令还会存在,否则原有命令被清空
service iptables save

你可能感兴趣的:(linux,linux,网络,安全)