Fork me on GitHub
瞬间的惊奇真是种确幸,每种确幸都是支玄妙的俳句。吊桥抬起,退回到内心幽静的花园,邂逅的还是那种熟悉的冷冷清清又轰轰烈烈的美妙质感。这真令人欢喜。

iptables(1)


iptables配置文件:/etc/sysconfig/iptables

确认开启路由转发功能
方法1:/sbin/sysctl -w net.ipv4.ip_forward=1
方法2:echo 1 > /proc/sys/net/ipv4/ip_forward
方法3:修改/etc/sysctl.conf,设置 net.ipv4.ip_forward = 1

设置路由转发
[root@localhost ~]# vim /etc/sysctl.conf 修改:
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p 注意:此设置为永久生效 或者:
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
又或者:
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
注意:此设置为临时生

[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 8 -j LOG
[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j DROP
[root@localhost ~]# iptables -t filter -N MyLAN1
[root@localhost ~]# iptables -A FORWARD -s 192.168.1.0/24 -j MyLAN1
[root@localhost ~]# iptables -A FORWARD -d 192.168.1.0/24 -j MyLAN1
[root@localhost ~]# iptables-A MyLAN1 -p icmp -j DROP
[root@localhost ~]# iptables-A MyLAN1 ……
[root@localhost ~]# iptables -X MyLAN1

[root@localhost ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
[root@localhost ~]# iptables-I INPUT -p udp -j ACCEPT
[root@localhost ~]# iptables-I INPUT 2 -p icmp -j ACCEPT
[root@localhost ~]# iptables-P INPUT DROP
[root@localhost ~]# iptables-L INPUT --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT udp -- anywhere anywhere
2 ACCEPT icmp -- anywhere anywhere
3 ACCEPT tcp -- anywhere anywhere

[root@localhost ~]# iptables-D INPUT 2
[root@localhost ~]# iptables-F
[root@localhost ~]# iptables -t nat-F
[root@localhost ~]# iptables -t raw -NTCP_PACKETS
[root@localhost ~]# iptables -t raw -L
Chain PREROUTING (policy ACCEPT)
……
Chain OUTPUT (policy ACCEPT)
……
Chain TCP_PACKETS (0 references)
target prot opt source destination
自定义链,最终要应用于默认链上,才能起作用。
自定义链,只允许固定ip访问目标ip的ssh
#iptables -N testssh --自定义链名称
#iptables -A testssh -s 192.168.10.10/32 -j ACCEPT
#iptables -A INPUT -p tcp --dport 22 -j testssh --把自定义链应用于INPUT链
nat表上,自定义链的使用
#iptables -N test -t nat
#iptables -A test -t nat -d 192.168.10.0/24 -j SNAT --to 192.168.100.10
#iptables -A POSTROUTING -t nat -s 192.168.21.0/24 -j test

[root@localhost ~]# iptables -A FORWARD -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -p tcp --sport 20:80 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j REJECT
[root@localhost ~]# iptables -A INPUT -i eth0 -p icmp --icmp-type Echo-Request -j DROP
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT

[root@localhost ~]# iptables -A FORWARD -m mac --mac-source 00:0C:29:27:55:3F -j DROP
[root@localhost ~]# iptables -A INPUT -p tcp-m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -p tcp-m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
NEW(与任何连接无关的数据包,一般表示新发起的数据连接请求)
ESTABLISHED(响应请求或者已建立连接的数据包,一般表示服务器的正常响应数据)
RELATED(与已有连接有相关性的数据包,例如使用FTP上传/下载文件时需要建立新的数据连接,这个连接与之前的FTP控制连接存在
相关性)
INVALID (表示来历不明的包,除以上状态以外的其他状态,视为有危险的包,全部被丢弃。)
•当有人冒用其他主机的IP地址发送数据时,受害主机接收到的服务器响应数据包的状态也是“NEW”(因为本机并未发送过请求),这种类
型的数据包一般也要丢弃掉
--syn的用法为兼容旧版本iptables的形式
[root@localhost ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
[root@localhost ~]# iptables -A INPUT -p tcp-m state --state NEW -j DROP
[root@localhost ~]# iptables -A INPUT -p tcp-m state --state ESTABLISHED,RELATED -j ACCEPT
•导出规则
–iptables-save
–结合重定向输出“>”符号保存规则信息
•导入规则
–iptables-restore
–结合重定向输入“<”符号恢复规则信息
[root@localhost ~]# iptables-save > /etc/sysconfig/iptables
[root@localhost ~]# service iptables restart
[root@localhost ~]# chkconfig --level 35 iptables on
[root@localhost ~]# iptables-restore < /etc/sysconfig/iptables
--------------------------理解ESTABLISHED
vm1
# iptables -P INPUT DROP
ping 192.168.56.201
ssh 192.168.56.201
全部失败
# iptables -A INPUT -p all -m state --state ESTABLISHED -j ACCEPT
ping 192.168.56.201
ssh 192.168.56.201
全部成功
vm2关闭防火墙
成功穿越反向防火墙。
tracerout 192.168.56.201 失败 ,原因看下面
--------------------------理解RELATE
vm1
# iptables -P INPUT DROP
# iptables -F
# iptables -A INPUT -p all -m state --state RELATED -j ACCEPT
tracerout 192.168.56.201 成功。由第一个包产生的其他回包都属于RELATE状态。
--------------------------理解NEW
vm1
OUTPUT默认策略为DROP。其他策略为ACCEPT
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT DROP
# iptables -F
ping 192.168.56.201
ssh 192.168.56.201
全部失败
# iptables -A OUTPUT -p all -m state --state ESTABLISHED,NEW -j ACCEPT
--------------------------理解INVALID
他需要特殊的第一条黑客工具产生,所以这里面紧急下面的用法。
通常应用在INPUT表的第一条。
# iptables -A INPUT -p all -m state --state INVALID -j DROP
mangle表
策略路由
现要求对内网进行策略路由,所有通过TCP协议访问80端口的数据包都从ChinaNet线路出去,而所有访问UDP协议53号端口的数据包都
从Cernet线路出去
打标记:
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth0 -p udp --dprot 53 -j MARK --set-mark 2
注:创建完路由规则若需立即生效须执行#ip route flush cache;刷新路由缓冲
建表
ip rule add from all fwmark 1 table 10
ip rule add from all fwmark 2 table 20
(fwmark 1 是标记,table 1 是路由表1 。 意思就是凡事标记了 1 的数据使用table10 路由表)
ip rule show 显示路由规则
路由规则的添加
ip rule add from 192.168.1.10/32 table 1 pref 100
如果pref值(优先级)不指定,则将在已有规则最小序号前插入
注:创建完路由规则若需立即生效须执行#ip route flush cache;刷新路由缓冲
策略路由:
ip route add default via 10.10.1.1 dev eth1 table 10
ip route add default via 10.10.2.1 dev eth2 table 20
RAW表
4个表的优先级由高到低的顺序为:raw-->mangle-->nat-->filter
举例来说:如果PRROUTING链上,即有mangle表,也有nat表,那么先由mangle处理,然后由nat表处理
RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用
了RAW表,在 某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.
RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪
处理,以提高用户的访问速度。
执行如何指令即可
iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK
iptables -t raw -A PREROUTING -p tcp --sport 80 -j NOTRACK
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
--------------------------------------------
环境:
直播web服务器通过nginx+memcache方式提供显示数据的读取,采用的都是短链接模式,每次请求拿到数据后会断开连接。
故障:
cache服务器,不能创建新连接,message日志报错ip_conntrack: table full, dropping packet.
导致直播web出现故障,同样错误ip_conntrack: table full, dropping packet.
故障原因:链接跟踪表满了,导致不能创建新的连接。
以前出现过类似故障,解决办法是
vi /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 65000 加大链接跟踪表大小(加大最大跟踪连接条目)
但是过一段时间又出现上面的问题,这说明一是访问量确实再加大,导致跟踪表full,另外也说明单纯加大这个参数只能解决眼前的问题,
必须找出一个彻底解决此问题的办法。
这次故障临时调整
vi /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 855360
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1000 (连接跟踪表超时时间,通过测试这个参数的意义不大,和跟踪表自动清除
的时间没有太大关系,但还是先减小,默认值是7天)
vi /etc/modprobe.conf
options ip_conntrack hashsize=855360
设置桶的数量。提高性能,可以减少内核遍历时间。
简单解释:
上面的参数都是iptables涉及的参数,iptables为了处理封包,会对封包做跟踪。
如果关闭iptables,上面的故障不会出现,但是不太可能。
-允许的最大跟踪连接条目,CONNTRACK_MAX
-存储跟踪连接条目列表的哈西表的数量, HASHSIZE,桶的数量
内核要访问一个特定包的跟踪连接条目,内核必须:
针对一个包中的已经定义的一些字符计算哈西值。这是一个不间断的计算。
这个哈西值就会被当作哈西表的索引来使用,而跟踪连接条目的列表就存储在这里。
反复的查看链接列表中的跟踪连接条目以找到匹配的那一个。
这是一个耗资源的操作,依赖于列表的大小(也依赖于列表中被操作的跟踪连接条目的位置)。
这个列表就是一个桶,HASHSIZE就是这些桶的数量,每个桶内的条目数就是 CONNTRACK_MAX/HASHSIZE
如果 CONNTRACK_MAX=HASHSIZE那么列表大小是一,可以减少遍历的数目,提高性能,前提是内存足够大
iptables这个桶的概念和LVS 内核桶的概念类似。
彻底解决:关闭跟踪。
直播web服务器
vi /etc/sysconfig/iptables
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK
-A PREROUTING -p tcp -m tcp --dport 10240:65000 -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 10240:65000 -j NOTRACK
COMMIT
注意 filter 里要加这句
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED,UNTRACKED -j ACCEPT
后端cache服务器
vi /etc/sysconfig/iptables
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK
-A PREROUTING -p tcp -m tcp --dport 11211 -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 11211 -j NOTRACK
COMMIT
把80端口和11211端口去掉跟踪。
用apache ab测试 观察 /proc/net/ip_conntrack 效果很明显
如果web端配置
-A PREROUTING -p tcp -m tcp --dport 11211 -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 11211 -j NOTRACK
是没有意义的,链接跟踪表还是会记录连接后端cache的条目,如果要加上-s之类的源IP地址,那么连接后端11211的出包都会被封,(测
试结果)所以规则肯定不是这样定,具体的规则还要研究。
对于cache服务器来说,以上配置是非常完善的。
通过观察研究链接跟踪表(/proc/net/ip_conntrack)的内容,发现内有大量直播web连接后端cache 11211端口的连接条目,源端口是一万
以上的端口。而且web服务器也有大量80端口的连接,这些链接不
需要处理,所以不跟需踪这些链接。
由于raw的output优先级高于filter input,所以如果设置成1024:65000 -j NOTRACK,那么这些端口都会被允许访问,所以设置成
10240:65000 ,filter的input还是不可以封住的,但是以后启动的应用
服务的端口要注意,必须选择10240以下的端口自行定义。虽然10240:65000这些端口可以在公网上扫到,但是由于没有服务对应,所以
不会有问题。
还要研究针对于访问后端的端口如何准确的去掉跟踪。
上面思路比较乱,关键的点想反了,以下是纠正
通过观察研究
cat /proc/net/ip_conntrack
tcp 6 431946 ESTABLISHED src=192.168.0.18 dst=192.168.0.17 sport=52292 dport=3306 packets=1 bytes=52 src=192.168.0.17
dst=192.168.0.18 sport=3306 dport=52292 packets=1
bytes=52 use=1
tcp 6 431999 ESTABLISHED src=192.168.0.18 dst=192.168.0.165 sport=22 dport=2676 packets=27 bytes=2128 src=192.168.0.165
dst=192.168.0.18 sport=2676 dport=22 packets=26
bytes=1664 [ASSURED] use=1
经过测试研究,并且看了几遍iptables-tutorial后,搞好了准确的去掉跟踪 结果
web服务器
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK
-A PREROUTING -p tcp -m tcp --sport 11211 -j NOTRACK 从17的11211端口返回给18的规则
-A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK
-A OUTPUT -p tcp -m tcp --dport 11211 -j NOTRACK 从18出到17的11211端口规则
COMMIT
测试结果表明:如果OUTPUT设置了相关端口,那么PREROUTING 必须针对OUTPUT设置的端口制定规则,否则封包不能出去。 (其实是
回不来)
原因如下
连接跟踪的状态主要在两个地方被触发,一个是PREROUTING,另外一个数OUTPUT,他们分别对应外来报文和本级产生报文。例如我
们从本级 发送一个报文,那么在OUTPUT链里面,它的状态会变成NEW,当我们接收到回应报文的时候,连接状态就PREROUTING处更
改为 ESTABLISHED,以此类推。加入第一个报文不是我们尝试的,那么在PREROUTING出就设置为NEW,然后我们发送回复的时候,
在 OUTPUT设置为ESTABLISHED。

posted @ 2018-10-01 10:54  干嘛那么贪睡  阅读(379)  评论(0编辑  收藏  举报