Linux笔记24.iptables

24.iptables

filter table 过滤表

INPUT ,OUTPUT 和 FORWARD 链,用于处理输入、输出和转发包。

nat  用于地址转换

用于处理网络地址翻译.(包含与masquerading相关的功能)

包含 PREROUTING ( 路由前 ),POSTROUTING 路由后,OUTPUT输出 ( 很少用到 )共3个链

mangle 矫正表

用于处理特殊包的矫正,包含 5 个链

PREROUTING ( 路由前 ),POSTROUTING (路由后),INPUT,OUTPUT,FORWARD

以本地为目标的包

以本地为源的包

被转发的包

注意: 不要在 INPUT 链上做过滤。 INPUT是专门用来操作那些以我们的机子为目的地址的包的,它们不会被路由到其它地方的。

iptables -F  清除所有规则  

iptables -X  清除所有自定义规则

iptables -L  列出当前所有规则

自定义脚本,最好以 iptables F 和iptables -X 开头

filter表中可以采取的措施 -j

ACCEPT  接受,等于不进行过滤

DROP  丢弃,弃之不理。别人可以判断出您的系统使用了防火墙

REJECT  弹回,貌似跟本没有打开这端口。

LOG  进行日志, /var/log/message 

User Chain  ,用自定义规则进行处理,等同于用子函数进行处理

根据源地址进行匹配的–s 

[!]  addr[net mask]

根据目的地址进行匹配 d

[!]  addr[net mask]

根据协议进行匹配的–p  

[!]   icmp

[!]   tcp

[!]   udp

根据端口进行匹配,这时必须指定协议,必须是 tcp 或 udp 协议。

根据封包来源的端口进行匹配的  

--sport  [!] port  

--source-port = --sport

根据封包的目的端口进行匹配

--dport [!] port

--dport = --destination-port

port可以用/etc/service中的协议名来代替

Iptables -L  命令可以规则

iptables -D  可以删除规则

iptables -t filter -D INPUT -s 192.168.0.DROP

ptables -D OUTPUT 1 可删除第一条输出规则

iptables -t nat -L  列出所有nat表的规则

插入规则 iptables -I

iptables -t filter -I INPUT -s 192.168.0.5 -j REJECT

插入这条规则并做为第一条INPUT 规则,其余INPUT规则下移一行

iptables -t filter -I INPUT 3 -s 192.168.0.6 -j REJECT

将此条插入作为第三行 , 原来第三行及以后下移一行

取代规则iptables -R 

iptables -R INPUT 3  -d 192.168.0.7 -j DRO

取代第三条INPUT规则, 必需指定取带第几条规则

Iptables t nat F

Iptables t filter F OUTPUT

自定义规则 iptables N xxx

使用自定义规则iptables -A INPUT -j dalian

查询自定义规则iptables -L dalian

删除自定义规则iptables -X dalian ( 空链 )

iptables -F dalian 

重命名自定义规则iptables -E dalian shenyang

缺省策略

Iptables -P INPUT DROP

对比性匹配的扩展

通过–m参数来调用

基于状态的匹配   –m state

基于Mac 地址的匹配  –m mac

基于封包数量的匹配   –m limit

基于uid gid  的限制   –m owner

基于状态的防火墙

所有在内核中由 Netfilter 的特定框架做的连接跟踪conntrack

所有状态的改变和计算都是在 nat 表中的PREROUTING和 OUTPUT 链里完成的。

/proc/net/ip_conntrack 里的 conntrack 记录。这些记录表示的是当前被跟踪的连接如果安装了 ip_conntrack 模块, cat /proc/net/ip_conntrack

连接跟踪记录的信息依据 IP 所包含的协议不同,连接跟踪记录的信息依据 IP 所包含的协议不同,所有相应的值都是在头文件 /usr/src/kernels/2.6.18... /include

Vim /etc/protocals查看协议号

[ASSURESD]两个方向无流量

[UNREPLIED]无响应

NEW状态

第一种状态叫作NEW 。初始包或源自于您机器发送的包处于NEW状态

基于 NEW 包的应用

ptables -A INPUT -m state --state NEW -j DROP

ptables -A OUTPUT -m state --state NEW -j DROP

ESTABLISHED状态

一旦连接看到两个方向上都有通信流,与此附加相关的其它包都被看作处ESTABLISHED状态。

RELATED状态

第三种连接状态类别叫作RELATED( 关联 ) 。RELATED  包表示该信息包正在启动新连接,以及它与已建立的连接相关联。

INVALID状态

有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的 ICMP  错误信息。一般地,我们 DROP 这个状态的任何东西。

允许主动发出的包

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

ESTABLISHED 用来回应 NEW

禁止别人发起的主动连接

iptables -A INPUT -m state --state NEW,INVALID -j DROP

TCP打开过程

TCP关闭过程

TCP 完整的状态列表和超时值

UDP

ICMP

/proc/sys/net/ipv4/netfilter/ip_ct_generic_timeout 更 改,以便适应你的通信量,尤其是在耗时较多 、流量巨大的情况下,比如使用卫星等。

有些协议比其他协议更复杂,这里复杂的意思是指连接跟踪机制很难正确地跟踪它们,比如, ICQ 、 IRC  和 FTP ,它们都在数据包的数据域里携带某些信息,这些信息用于建立其他的连接。因此,需要一些特殊的  helper 来完成工作。

复杂协议和连接跟踪

注意连接跟踪并不处理 NAT ,因此要对连接做 NAT 就需要增加相应的模块。比如,你想 NAT 并跟踪 FTP 连接,除了 FTP 的相应模块,还要有 NAT 的模块。所有的 NAT helper 名字都是以 ip_nat_ 开头的,这是一个命名习惯: FTP NAT helper 叫做 ip_nat_ftp IRC 的相应模块就是 ip_nat_irc 。 conntrack  helper  的命名也遵循一样的习惯:针对 IRC的 conntrack helper 叫 ip_conntrack_irc , FTP的叫作 ip_conntrack_ftp 。

规则的保存与恢复

iptables-save 和 iptables-restore

iptables-save [-c] [-t table]

-c 的作用是保存包和字节计数器的值。

-t 指定要保存的表,默认是保存所有的表。

iptables-save -c > /etc/iptables-save

service iptables save

/etc/sysconfig/iptables

iptables-restore [-c] [-n]

-c 要求装入包和字节计数器

-n 告诉 iptables-restore 不要覆盖已有的表或 表内的规则。默认情况是清除所有已存的规则 。这个参数的长形式是 --noflush 。

-Z, --zero

iptables -Z INPUT

把指定链(如未指定,则认为是所有链)的所有计数器归零。

基于 MAC 地址的匹配

格式: -m mac --mac-source mac_addr 

iptables -A INPUT -p tcp --dport 23 -m mac --mac-source 00:0C:29:BC:BB:DB -j REJECT

仅仅对 PREROUTING  和 INPUT,FORWARD链起作用

限制别人 ping

允许每秒通过一个 icmp 包 , 默认触发条件是 5个 icmp 包 ( 最多通行证数是 5)

iptables -A INPUT -p icmp -m limit  – limit 1/s  limit-burst 5 -j ACCEPT

超过部分全部拒绝iptables -A INPUT -p icmp -j DROP

根据 uid或者gid进行限制

-m owner

-m owner uid-owner $AN_UID

Iptables – A OUTPUT  – p tcp  – dport 23  – m owner --uid-owner  `id -u test`  –j REJECT, 即可禁止 test 用户 telnet 其他主机

注意 ,- m owner仅仅对 OUTPUT链有效

NAT

我把 NAT 分为两种不同的类型:源NAT(SNAT) 和目标NAT(DNAT)。

Source NAT 是指修改第一个包的源地址:也就是说,改变连接的来源地。 SNAT 会在包送出之前的最后一刻做好动作 (postrouting) ,伪装是 SNAT 的一种特殊形式。  

Destination NAT  是指修改第一个包的目标地址: 也就是说,改变连接的目的地。 DNAT  总是在 包进入以后 ( 马上 ) 进行动作 (prerouting) 。端口转发、负载均衡和透明代理都属于 DNAT 。  

用途

1. 你只有一个公网 ip ,但想带动多台主机上网。这时您需要 Source-NAT 原地址转换

2. 你只有一个公网 ip ,但有多个内网服务器 .有时候您想让人连接到您真实 ip 后边的服务器。这时您需要的是 Destination-NAT 目的地址转换。不严格的说法叫映射 ( map)

3. 透明代理

使用 nat  表之前 , 必须调整内核参数echo 1 > /proc/sys/net/ipv4/ip_forward

应该写将此值写入   /etc/sysctl.conf  以使之在重新启动后仍然生效

用sysctl  -p  命令使该文件立即生效

SNAT

改变源地址为 1.2.3.4

#iptables  – t nat  – A POSTROUTING  – o eth0  – j SNAT --to 1.2.3.4

改变源地址为 1.2.3.4 、1.2.3.5 、1.2.3.6

#iptables  – t nat  – A POSTROUTING  – o eth0  – j SNAT --to 1.2.3.4-1.2.3.6

改变源地址为 1.2.3.4 端口为 1-1023

#iptables  – t nat  – A POSTROUTING  – p tcp  – o eth0  – j  SNAT --to 1.2.3.4:1-1023

伪装

#iptables  – t nat  – A POSTROUTING  – o ppp0  – j  MASQUERADE

普通的地址伪装 SNAT 的一个特例被称作伪装。它只能被用于动态分配

IP 地址的情况。

你无需为 IP 伪装明确指定源地址。它会使用包送出的那个接口(地址)作为源地址。

SNAT源地址转换( 伪装所有由 ppp0 送出的东西  )

iptables -t nat -A POSTROUTING -o ppp0 -j  MASQUERADE(公有 IP 不固定时使用)

或者

iptables -t nat -A POSTROUTING  -o ppp0  -j SNAT --to ONE_OF_YOUR_EXT_IP(与外网相连的网卡的固定IP使用)

DNAT

改变目标地址为 5.6.7.8

#iptables  – t nat  – A PREROUTING  – i eth0  – j DNAT --to 5.6.7.8

改变目标地址为 5.6.7.8 、 5.6.7.9 、 5.6.7.10

#iptables  – t nat  – A PREROUTING  – i eth0  – j DNAT --to 5.6.7.8-5.6.7.10

改变 web 传送的目标地址为 5.6.7.8, 端口 8080

#iptables  – t nat  – A PREROUTING  – p tcp --dport 80  – i eth0  – j DNAT --to 5.6.7.8:8080

透明代理

iptables -t nat -A PREROUTING -s 192.168.10.0/24  -p tcp  -m multiport  --dport 80,443 -j REDIRECT --to-port 3128

(squid服务需要特别的配置 )

穿透防火墙 . 提供服务

iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport 80 -j DNAT  – to  192.168.10.156:80

-i  参数指定网卡 , 适用于   INPUT  和PREROUGING

-o  参数指定网卡 , 适用于   OUTPUT  和POSTROUGING

PREROUTING --->INPUT--> OUTPUT-->POSTROUTING

iprange

#iptables -A FORWARD -m iprange --src-range 192.168.1.5-192.168.1.124 -j ACCEPT

#iptables -L –nvx

Length

Iptables A OUTPUT length length 1400 j REJECT

Ping 192.168.1.111 s 1372(包头28字节)

指定 ip 碎片。

#iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100  – dport 80 -j ACCEPT

并且这时的 FORWARD 的 policy 为 DROP 时,系统只会让第一个 ip 碎片通过,而余下的碎片因为包头信息不完整而无法通过。可以通 -- fragment/-f  选项来指定第二个及以后的 ip 碎片解决上述问题。

#iptables -A FORWARD -f -s 192.168.1.0/24 -d  192.168.2.100 -j ACCEPT

Limit

Iptables –A INPUT p icmp m limit limit 1/m limit-burst 5 j ACCEPT

Mark

只在mangel表中

Iptables t mangle A INPUT s 192.168.1.106 j MARK set-mark 2

Iptables A INPUT m mark mark 2 j REJECT

Flag

代表检查旗标 syn,fin,ack,rst  如果其中 syn与 ack 同时被设置,而且其他位置没有被设置,则匹配

Iptables A OUTPUT p tcp tcp-flags SYN,ACK,RST,FIN SYN,ACK j REJECT

Iptables A OUTPUT p tcp tcp-flags SYN,ACK,RST,FIN SYN,ACK j LOG

你可能感兴趣的:(linux,职场,iptables,休闲)