1. netfilter中五个钩子函数和报文流向
- 1.1 各链路生效的时间
- 1.2 三种报文流向
- 1.3流入报文规则图
- 1.4 流出报文规则图
- 2 iptables
- 2.1 五个表格
- 2.2 五个内置链
- 2.3 链路与表的关系
- 3 iptables 格式及子命令
- 3.1 子命令
- 3.1.0 -L子命令规则
- 4.1 隐式扩展匹配
- 4.1.1 tcp子选项
- 4.1.2 udp子选项
- 4.1.4 显式扩展及相关模块
- 4.1.5 connlimit扩展
- 4.1.6 limit扩展
- 4.1.7 state扩展
- 5 DNAT
- 5.1 公网服务器
- 5.2 网关
- 5.3客户端:
Netfilter在内核中定义了五个钩子,用户可以通过iptables写入规则 。
只要是流入的报文,都会在接触网卡瞬间让PREROUTING检查;流出的报文流出前也会在接触网卡瞬间让POSTROUTING检查。
iptables由五各表和五个链路以及一些规则组成
Tips: 放行规则哪个匹配的范围越小,越放在前,因为只要条件符合不会继续进行规则匹配
拒绝规则由大到小,一般不使用默认拒绝,因为清空规则表会拒绝所有链接,会导致SSH无法登陆
常用也就只有filter表和net表,本文仅针对这两种规则表进行描述。
-t table:指定将要操纵的表
iptables [-t table] -L [chain [rulenum]] [options…]
-L:list, 列出指定鏈上的所有规则,本选项须置后
-n #以数字格式显示IP和端口
-v,-vv,-vvv #显示详细信息
-x #每个规则的两计数器(分别用于记录匹配到报文的总数和总大小),数过大时会使用其他单位(比如MB)从而四舍五入。此选项表示显示精确数值,不换算、四舍五入
–line-number #显示链上的规则的编号,方便引用。比如-D进行删除指定规则时,可指定规则内容也可指定编号
常用组合:-vnL与-vvnxL --line-numbers
Tips: 所有选项要加在L左侧,否则会报错
!表示取反
-s 匹配源地址是指定IP(也可以是IP段)的报文。0/0或省略此选项均表示匹配所有源IP
-d 匹配目标地址是指定IP的报文
-i 参数是网卡名(如eth0),用于匹配从指定网卡流入的报文。注意因为是流入报文,所以只能定义在PREROUTING、INPUT、FORWARD链
-o 匹配从指定网卡流出的报文。因为是流出报文,所以只能定义在FORWARD、OUTPUT、POSTROUTING链
-p 指定协议,可以使用数字如0(all)
扩展匹配指的是需要使用额外模块才能使用的匹配条件。
隐式扩展是指不用-m显式引用的模块,不过也可以用-m来引用。
隐式扩展最常用的就是-p用于匹配使用指定的协议的报文。
最常用的协议就是tcp、udp、icmp,它们有各自的子选项,用于匹配使用指定协议
!表示取反
[!] --icmp-type {type[/code]|typename}
type/code
0/0 echo-reply icmp应答
8/0 echo-request icmp请求
显示扩展即必须使用-m选项指明要调用的扩展模块名称,需要手动加载扩展模块
[-m matchname [per-match-options]]
扩展模块的使用帮助:
根据每客户端IP做并发连接数数量匹配
可防止Dos(Denial of Service,拒绝服务)攻击
--connlimit-upto # :连接的数量小于等于#时匹配
--connlimit-above # :连接的数量大于#时匹配
范例
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimitabove
2 -j REJECT
基于收发报文的速率做匹配
令牌桶过滤器
--limit #[/second|/minute|/hour|/day]
--limit-burst number
范例:
iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit
10/minute --limit-burst 5 -j ACCEPT
iptables -I INPUT 2 -p icmp -j REJECT
state扩展模块,可以根据”连接追踪机制“去检查连接的状态,较耗资源
conntrack机制:追踪本机上的请求和响应之间的关系
状态类型:
* NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
* ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
* RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
* INVALID:无效的连接,如flag标记不正确
* UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
yum -y install httpd
echo hello > /var/www/html/index.html
systemctl enable --now httpd
tcpdump -i eth0 -vv -nn port 80
或者
tail -f /var/log/httpd/access_log#可以看到源IP为网关的访问
配置公网IP:172.20.20.1/24
配置公网IP:172.20.20.2/24
链接客户端局域网网段:192.168.30.2/24
开启ip_forward转发
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.30.0/24 -j SNAT --to-source 172.20.2.2#SNAT转发
iptables -t nat -A PREROUTING -d 172.20.2.2 -j DNAT --to-destination 192.168.30.3#DNAT转发
配置属于网关同网段私网:192.168.30.3/24
配置路由指向网关:172.20.20.3/24
curl 172.20.20.1 #回应报文为 hello
tips:
服务器测试客户端可以在客户端安装httpd,此时服务器访问不到内网的客户端,目标IP是网关即:curl 172.20.20.2
这是一个测试1脚注
这是一条角注释 ↩︎