Linux防火墙--iptables学习

iptables是Linux系统提供的一个强大的防火墙工具,可以实现包过滤、包重定向、NAT转换等功能。iptables是免费的,iptables是一个工具,实际的功能是通过netfilter模块来实现的,在内核2.4版本后默认集成到了Linux内核中。

一、 iptables的构成

1. 规则(rules)

规则是iptables对数据包进行操作的基本单元。即“当数据包符合规则定义的条件时,就按照规则中定义的动作去处理”。

规则中定义的条件一般包括源地址/端口、目的地址/端口、传输协议(TCP/UDP/ICMP)等。而规则定义的动作一般有放行(ACCEPT)、拒绝(REJECT)和丢弃(DROP)等。

配置iptables实际上就是增删修改这些规则。

2. 链(chains)

链是数据包传播的路径,每条链中都有若干个规则。当一个数据包到达一条链时,iptables会按照规则的顺序,从该链的第一条规则开始往下检查,如果有条件匹配的规则,则按照规则定义的动作执行;否则继续检查下一条规则。如果该数据包和链中所有的规则都不匹配,则iptables会根据该链预先定义的默认策略来处理数据包。

3. 表(tables)

iptables内置了4个表,即filter表、nat表、mangle表、raw表,分别用于实现包过滤、网络地址转换、包修改和数据跟踪处理等功能。每个表中含有若干条链,具体的规则就是根据实现目的的不同,添加到不同表的不同链中。

如下图所示,各个表相关的链:

raw表有2条链:PREROUTING、OUTPUT

mangle表有5条链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD

nat表有3条链:PREROUTING、POSTROUTING、OUTPUT

filter表有3条链:INPUT、FORWARD、OUTPUT

4个表的优先级为:raw > mangle > nat > filter

二、iptables的传输过程

当数据包到达网卡时,首先会进入PREROUTING链(注意,raw表处理完后就不会再进入nat表了),完成PREROUTING链中规则的匹配和执行后(比如DNAT),iptables根据数据包的目的IP是否为本机地址,判断是否需要将该数据包转发出去。

1.  如果数据包的目的IP为本机地址,它就会进入INPUT链。可以在filter表的INPUT链中添加包过滤规则,限制哪些数据包可以访问本机;经过INPUT链中的规则处理后,剩下的数据包在本机上任何进程都可以收到,并根据需要对它们进行处理;当进程处理完后,需要发送出去的数据包会经过OUTPUT链的处理,然后到达POSTROUTING链,经过处理(比如SNAT)后输出。

2. 如果数据包的目的IP不是本机地址(比如做了DNAT、或者只是作为默认网关时走过来的包),并且系统内核开启了转发功能(ip_forward参数为1),则数据包会进入FORWARD链;此时可以在filter表的FORWARD链中设置相应的规则进行处理;经过FORWARD链的数据包再走到POSTROUTING链中处理(比如执行SNAT),最后输出。

综上,数据包在iptables中的传输链路有两种情况:

第一种:PREROUTING -> FORWARD -> POSTROUTING

第二种:PREROUTING -> INPUT -> LOCALHOST -> OUTPUT -> PUSTROUTING

所以,要想对数据包进行控制,主要可以在上面几条链路中添加规则。

(可以发现LVS的NAT模式下,会经过PREROUTING链(nat表) -> FORWARD链 -> POSTROUTING链(nat表),请求的转发在PREROUTING链中进行DNAT,响应在POSTROUTING链中进行SNAT。无论时请求还是响应都不会走到INPUT链和OUTPUT链中)

三、 iptables的使用

iptables对链的操作方法有:-I(插入),-A(追加),-R(替换),-D(删除),-L(显示)

注意,-I是将规则插入到第一行,-A是将规则追加到链的最后一行。

iptables -F:清除所有的规则

iptables -F -t nat:清除nat表的规则

iptables -P INPUT DROP:配置INPUT链的默认规则为DROP

示例:

iptables -t filter -A INPUT -s 192.168.1.10 -j ACCEPT

这是一条简单的规则,表示在filter表的INPUT链中追加一条规则,规则的匹配条件是数据包的源IP为192.168.1.10,执行动作为允许(ACCEPT),即允许源IP为192.168.1.10地址的消息访问本机。

iptables中,默认表名就是filter,所以上面的规则也可以写成:

iptables -A INPUT -s 192.168.1.10 -j ACCEPT

iptables规则的匹配条件中常用的参数有:

-s匹配源地址

-d匹配目的地址

--sport匹配源端口

--dport匹配目的端口

-p匹配协议

-i匹配输入的网卡

-o匹配输出的网卡

!取反

-j规则的执行动作

示例:配置NAT转发实现内网节点访问公网

环境假设:

路由节点:

Lan口:192.168.1.10/24 eth0

Wan口:50.75.153.98/24 eth1

内网节点:192.168.1.92

1. 在内网节点上配置默认网关为路由节点的Lan口,确保内网节点的包都能走到路由节点。

route add default gw 192.168.1.10

2. 在路由节点上打开linux的路由转发功能。

sysctl -w net.ipv4.ip_forward=1

3. 将FORWARD链的默认策略设置为DROP

iptables -P FORWARD DROP

这样确保对内网的控制,只把允许访问公网的IP添加到规则中。

4. 允许任意地址之间的确认包和关联包通过。

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

这条规则很关键,否则即使后面添加了允许IP访问的规则也没用。

5. 允许指定IP地址访问公网

iptables -A FORWARD -s 192.168.1.92/24 -j ACCEPT

6. 配置一条SNAT规则,将内网节点的源IP转换为公网IP后,再将消息发出。

iptables -t nat -A POSTROUTING -s 192.168.1.92 -j SNAT --to 50.75.153.98

示例:配置NAT转发实现公网用户访问内网节点

环境假设:

路由节点:

Lan口:192.168.1.10/24 eth0

Wan口:50.75.153.98/24 eth1

内网节点:192.168.1.92

1.  在路由节点上打开linux的路由转发功能。

sysctl -w net.ipv4.ip_forward=1

2. 将FORWARD链的默认策略设置为DROP

iptables -P FORWARD DROP

这样确保对内网的控制,只把允许访问的IP添加到规则中。

3. 允许任意地址之间的确认包和关联包通过。

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

这条规则很关键,否则即使后面添加了允许IP访问的规则也没用。

4. 允许访问指定的IP地址

iptables -A FORWARD -d 192.168.1.92 -j ACCEPT

5. 配置一条DNAT规则,将访问路由节点的公网地址转换为访问内网节点的私网地址。

iptables -t nat -A PREROUTING -d 50.75.153.98 -j DNAT --to 192.168.1.92

PS:用iptables的raw表解决ip_conntrack:table full, dropping packet的问题

raw表中包含PREROUTING链和OUTPUT链,优先级最高,可以对数据包在进入NAT表的PREROUTING链之前对消息进行处理。当用户启用了RAW表,消息在经过RAW表的PREROUTING链处理后,将跳过NAT表和ip_conntrack处理,不再做地址转换和数据包的链接跟踪处理。

所以raw表可以用在那些不需要做nat和链接跟踪的情况,提升系统性能。因为启用链接跟踪时,系统会建立一个链接跟踪表,每个消息进来时,都会去查询链接跟踪表,当系统业务量过大时,可能会引发系统CPU消耗过高。

可以通过在RAW表的PREROUTING链中配置NOTRACK标记,使数据包不再进入nat表,达到不做链接跟踪的目的,如:

iptables -t raw -A PREROUTING -p tcp -d 192.168.1.10 --dport 80 -j NOTRACK

iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT

表示对访问192.168.1.10:80服务的消息在raw表的PREROUTING链中添加NORTRACK标记,以后访问这个服务的消息都不会再进行链接跟踪。

另外,再附上鸟哥的iptables流程图,可以看到各个链也是根据不同的表区分优先级的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容