标签:访问 raw 加载 移动 state 数据报 ott 操作 接口
1.一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转发出去。
2.如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经 过OUTPUT链,然后到达POSTROUTING链输出。
3.如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过 FORWARD链,然后到达POSTROUTING链输出。
iptables的原理主要是对数据包的控制,看下图:
规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
表(tables)提供特定的功能,iptables内置了4个表,即raw表、filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。
只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在 某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.
主要用于过滤数据包,该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对于防火墙而言,主要利用在filter表中指定的规则来实现对数据包的过滤。Filter表是默认的表,如果没有指定哪个表,iptables 就默认使用filter表来执行所有命令,filter表包含了INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)在filter表中只能允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改。
主要用于网络地址转换NAT,该表可以实现一对一,一对多,多对多等NAT 工作,iptables就是使用该表实现共享上网的,NAT表包含了PREROUTING链(修改即将到来的数据包),POSTROUTING链(修改即将出去的数据包),OUTPUT链(修改路由之前本地生成的数据包)
主要用于对指定数据包进行更改,在内核版本2.4.18 后的linux版本中该表包含的链为:INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包)
iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
链管理
规则管理
查看
举例
新增一条链:
# iptables -N newchain
# iptables -L newchain
Chain newchain (0 references)
target prot opt source destination
将链重命名:
# iptables -E newchain NewChain
删除:
# iptables -X NewChain
更改默认规则:
# iptables -t filter -P FORWARD DROP
# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
基本匹配条件
无需加载任何模块,由iptables/netfilter自行提供
[!] -s, --source address[/mask][,...]
:用来比对数据包的来源IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,例如:-s 192.168.0.0/24,比对 IP 时可以使用!运算子进行反向比对,例如:-s ! 192.168.0.0/24。[!] -d, --destination address[/mask][,...]
:用来比对封包的目的地 IP,设定方式同上。隐式扩展
不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;
设置22端口白名单:
# cat 22
*filter
:INPUT DROP
:FORWARD DROP
:OUTPUT DROP
-A INPUT -s 192.168.100.0/24 -p tcp --dport 22 -j ACCEPT
-A OUTPUT -d 192.168.100.0/24 -p tcp --sport 22 -j ACCEPT
COMMIT
# iptables-restore < 22
# iptables -nvL
Chain INPUT (policy DROP 4 packets, 312 bytes)
pkts bytes target prot opt in out source destination
22 1556 ACCEPT tcp -- * * 192.168.100.0/24 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
14 1320 ACCEPT tcp -- * * 0.0.0.0/0 192.168.100.0/24 tcp spt:22
开放主机的ping请求:
# iptables -A INPUT -d 192.168.100.51 -p icmp -j ACCEPT
# iptables -A OUTPUT -s 192.168.100.51 -p icmp -j ACCEPT
或者通过下面的方式实现:
# iptables -A INPUT -d 192.168.100.51 -p icmp --icmp-type 8 -j ACCEPT
# iptables -A INPUT -d 192.168.100.51 -p icmp --icmp-type 0 -j ACCEPT
# iptables -A OUTPUT -s 192.168.100.51 -p icmp --icmp-type 0 -j ACCEPT
# iptables -A OUTPUT -s 192.168.100.51 -p icmp --icmp-type 8 -j ACCEPT
显式扩展-->multiport扩展
以离散方式定义多端口匹配;最多指定15个端口;
开发主机的22,80端口:
# iptables -A INPUT -d 192.168.100.51 -p tcp -m multiport --dports 22,80 -j ACCEPT
# iptables -A OUTPUT -s 192.168.100.51 -p tcp -m multiport --sports 22,80 -j ACCEPT
# iptables -nvL
Chain INPUT (policy DROP 6 packets, 468 bytes)
pkts bytes target prot opt in out source destination
62 4911 ACCEPT tcp -- * * 0.0.0.0/0 192.168.100.51 multiport dports 22,80
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
25 6878 ACCEPT tcp -- * * 192.168.100.51 0.0.0.0/0 multiport sports 22,80
显式扩展-->iprange扩展
指明连续的(但一般不脑整个网络)ip地址范围;
将telnet端口开放到指定的IP地址访问:
# iptables -A INPUT -d 192.168.100.51 -p tcp --dport 23 -m iprange --src-range 192.168.100.1-192.168.100.100 -j ACCEPT
# iptables -A OUTPUT -s 192.168.100.51 -p tcp --sport 23 -m iprange --dst-range 192.168.100.1-192.168.100.100 -j ACCEPT
显式扩展-->string扩展
对报文中的应用层数据做字符串模式匹配检测;
# iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo bm --string "gay" -j REJECT
显式扩展-->time扩展
根据将报文到达的时间与指定的时间范围进行匹配;
# iptables -A INPUT -d 192.168.100.51 -p tcp --dport 80 -m time --timestart 09:30 --timestop 18:30 --weekdays 1,2,3,4,5 -j ACCEPT
# iptables -A OUTPUT -s 192.168.100.51 -p tcp --sport 80 -m time --timestart 09:30 --timestop 18:30 --weekdays 1,2,3,4,5 -j ACCEPT
显式扩展-->connlimit扩展
根据每客户端IP做并发连接数数量匹配;
限制本机的ssh端口连接的个数:
# iptables -A INPUT -d 192.168.100.51 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
显式扩展-->limit扩展
基于收发报文的速率做匹配;
# iptables -A INPUT -d 192.168.100.51 -p icmp -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
# iptables -A -OUTPUT -s 192.168.100.51 -p icmp -j ACCEPT
[root@study-2 ~]# ping 192.168.100.51
PING 192.168.100.51 (192.168.100.51) 56(84) bytes of data.
64 bytes from 192.168.100.51: icmp_seq=1 ttl=64 time=0.450 ms
64 bytes from 192.168.100.51: icmp_seq=2 ttl=64 time=0.160 ms
64 bytes from 192.168.100.51: icmp_seq=3 ttl=64 time=0.225 ms
64 bytes from 192.168.100.51: icmp_seq=4 ttl=64 time=0.280 ms
64 bytes from 192.168.100.51: icmp_seq=5 ttl=64 time=0.152 ms
64 bytes from 192.168.100.51: icmp_seq=21 ttl=64 time=0.211 ms
64 bytes from 192.168.100.51: icmp_seq=41 ttl=64 time=0.443 ms
64 bytes from 192.168.100.51: icmp_seq=61 ttl=64 time=0.211 ms
显式扩展-->state扩展
根据”连接追踪机制“去检查连接的状态;
conntrack机制:追踪本机上的请求和响应之间的关系;状态有如下几种:
调整连接追踪功能所能够容纳的最大连接数量:
/proc/sys/net/nf_contrack_max
已经追踪到到的并记录下来的连接:
/proc/net/nf_conntrack
不同的协议的连接追踪时长:
/proc/sys/net/netfilter/
iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除;当模板满载时,后续的连接可能会超时解決方法一般有两个:
(1) 加大nf_conntrack_max 值
vi /etc/sysctl.conf
net.ipv4.nf_conntrack_max = 393216
net.ipv4.netfilter.nf_conntrack_max = 393216
(2) 降低 nf_conntrack timeout时间
vi /etc/sysctl.conf
net.ipv4.netfilter.nf_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
# iptables -A INPUT -d 192.168.100.51 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -s 192.168.100.51 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
开放被动模式的ftp服务:
(1) 装载ftp连接追踪的专用模块:
~]# modproble nf_conntrack_ftp
(2) 放行命令连接(假设Server地址为172.16.100.67):
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
(3) 放行数据连接(假设Server地址为172.16.100.67):
~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
~]# iptables -I OUTPUT -s 172.16.100.67 -m state --state ESTABLISHED -j ACCEPT
开放本机的网络连接:
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT
在上面的规则配置好后如果在放行端口可以使用下面的命令:
# iptables -A INPUT -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT
如果开放ftp传输可以使用下面的命令:
# modprobe nf_conntrack_ftp
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
环境说明
主机 | IP |
---|---|
study-1 | 192.168.100.51 10.0.0.1 |
study-2 | 192.168.100.52 |
study-3 | 10.0.0.53 |
实验能够通过转发的功能将10.0.0.53主机能够访问到192.168.100.52上的资源。
study-1主机配置
iptables规则:
# Generated by iptables-save v1.4.21 on Wed May 10 22:20:44 2017
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [4:541]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
-A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -p tcp --dport 80 -m state --state NEW -j ACCEPT
-A FORWARD -p tcp --dport 21 -m state --state NEW -j ACCEPT
-A FORWARD -p tcp --dport 22 -m state --state NEW -j ACCEPT
COMMIT
# Completed on Wed May 10 22:20:44 2017
开启内核的ip转发功能:
# echo 1 > /proc/sys/net/ipv4/ip_forward
加载nf_conntrack_ftp模块:
# modprobe nf_conntrack_ftp
study-2主机配置
# route add -net 10.0.0.0/24 gw 192.168.100.51
# modprobe nf_conntrack_ftp
# systemctl start vsftpd.service
# ngninx
study-3主机测试
测试ping:
# ping 192.168.100.52
PING 192.168.100.52 (192.168.100.52) 56(84) bytes of data.
64 bytes from 192.168.100.52: icmp_seq=1 ttl=63 time=0.560 ms
64 bytes from 192.168.100.52: icmp_seq=2 ttl=63 time=0.703 ms
64 bytes from 192.168.100.52: icmp_seq=3 ttl=63 time=0.778 ms
测试http访问:
# curl -I 192.168.100.52
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Thu, 11 May 2017 11:32:58 GMT
Content-Type: text/html
Content-Length: 14
Last-Modified: Wed, 03 May 2017 09:04:07 GMT
Connection: keep-alive
ETag: "59099d07-e"
Accept-Ranges: bytes
测试ftp访问:
# lftp 192.168.100.52
lftp 192.168.100.52:~> ls
drwxr-xr-x 2 0 0 6 Nov 05 2016 pub
# iptables -t nat -A PREROUTING -d 192.168.100.51 -p tcp --dport 80 -j REDIRECT --to-ports 8080
# ss -tnlp |grep 80
LISTEN 0 128 *:8080 *:* users:(("nginx",pid=2385,fd=6),("nginx",pid=2384,fd=6))
LISTEN 0 128 :::8080 :::* users:(("nginx",pid=2385,fd=7),("nginx",pid=2384,fd=7))
# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
41 2160 REDIRECT tcp -- * * 0.0.0.0/0 192.168.100.51 tcp dpt:80 redir ports 8080
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
测试
[root@study-2 ~]# curl http://192.168.100.51/
study-1
# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 192.168.100.51
源地址转换:当源地址为动态获取的地址时,MASQUERADE可自行判断要转换为的地址;
# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77
# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:8080
# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 22012 -j DNAT --to-destination 192.168.12.78:22
标签:访问 raw 加载 移动 state 数据报 ott 操作 接口
原文地址:http://www.cnblogs.com/cuchadanfan/p/6842863.html