iptables技术推荐参考这位仁兄的博客:http://www.zsythink.net/archives/category/%E8%BF%90%E7%BB%B4%E7%9B%B8%E5%85%B3/%E9%98%B2%E7%81%AB%E5%A2%99/page/2/
iptables指南参见:https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.htm
iptables匹配原则:从序列号为1的开始匹配,直到匹配到第一条合适的规则并执行,后续规则即使能够匹配也不再执行
iptables规则顺序:将经常会被匹配到的规则放在表前面
报文传输顺序严格遵循下图(图片系引用),需要注意到,与转发相关的PREROUTING的nat功能在路由选择之前,因此nat能够正常被路由处理
host-175-24-0-58:/home # iptables -t filter -nvL INPUT --line
Chain INPUT (policy ACCEPT 138 packets, 15020 bytes)
num pkts bytes target prot opt in out source destination
1 46 9364 DROP all -- * * !175.24.0.59 0.0.0.0/0
但如果规则如下明确表示拒绝175.24.0.59,则不会接收175.24.0.59的报文,注意新加的规则是在原规则之后而不是之前
host-175-24-0-58:/home # iptables -t filter -nvL INPUT --line
Chain INPUT (policy ACCEPT 138 packets, 15020 bytes)
num pkts bytes target prot opt in out source destination
1 46 9364 DROP all -- * * !175.24.0.59 0.0.0.0/0
2 0 0 REJECT all -- * * 175.24.0.59 0.0.0.0/0
//表示丢弃所有通过eth1传入的tcp报文
iptables -t filter -I INPUT -i eth1 -p tcp -j DROP
//表示丢弃所有通过eth2传出的icmp报文
iptables -t filter -I OUTPUT -o eth2 -p icmp -d drop
TYPE | CODE | Description | Query | Error |
---|---|---|---|---|
0 | 0 | Echo Reply——回显应答(Ping应答) | x | |
3 | 0 | Network Unreachable——网络不可达 | x | |
3 | 1 | Host Unreachable——主机不可达 | x | |
3 | 2 | Protocol Unreachable——协议不可达 | x | |
3 | 3 | Port Unreachable——端口不可达 | x | |
3 | 4 | Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特 | x | |
3 | 5 | Source routing failed——源站选路失败 | x | |
3 | 6 | Destination network unknown——目的网络未知 | x | |
3 | 7 | Destination host unknown——目的主机未知 | x | |
3 | 8 | Source host isolated (obsolete)——源主机被隔离(作废不用) | x | |
3 | 9 | Destination network administratively prohibited——目的网络被强制禁止 | x | |
3 | 10 | Destination host administratively prohibited——目的主机被强制禁止 | x | |
3 | 11 | Network unreachable for TOS——由于服务类型TOS,网络不可达 | x | |
3 | 12 | Host unreachable for TOS——由于服务类型TOS,主机不可达 | x | |
3 | 13 | Communication administratively prohibited by filtering——由于过滤,通信被强制禁止 | x | |
3 | 14 | Host precedence violation——主机越权 | x | |
3 | 15 | Precedence cutoff in effect——优先中止生效 | x | |
4 | 0 | Source quench——源端被关闭(基本流控制) | ||
5 | 0 | Redirect for network——对网络重定向 | ||
5 | 1 | Redirect for host——对主机重定向 | ||
5 | 2 | Redirect for TOS and network——对服务类型和网络重定向 | ||
5 | 3 | Redirect for TOS and host——对服务类型和主机重定向 | ||
8 | 0 | Echo request——回显请求(Ping请求) | x | |
9 | 0 | Router advertisement——路由器通告 | ||
10 | 0 | Route solicitation——路由器请求 | ||
11 | 0 | TTL equals 0 during transit——传输期间生存时间为0 | x | |
11 | 1 | TTL equals 0 during reassembly——在数据报组装期间生存时间为0 | x | |
12 | 0 | IP header bad (catchall error)——坏的IP首部(包括各种差错) | x | |
12 | 1 | Required options missing——缺少必需的选项 | x | |
13 | 0 | Timestamp request (obsolete)——时间戳请求(作废不用) | x | |
14 | Timestamp reply (obsolete)——时间戳应答(作废不用) | x | ||
15 | 0 | Information request (obsolete)——信息请求(作废不用) | x | |
16 | 0 | Information reply (obsolete)——信息应答(作废不用) | x | |
17 | 0 | Address mask request——地址掩码请求 | x | |
18 | 0 | Address mask reply——地址掩码应答 |
Chain NEW_CHAIN0 (1 references)
pkts bytes target prot opt in out source destination
1 60 RETURN all -- * * 1.1.1.1 0.0.0.0/0
0 0 ACCEPT all -- * * 192.168.128.1 0.0.0.0/0
使用如下命令可以防止外部主机访问本机,但不妨碍本机访问其他主机
iptables -t filter -A INPUT -j REJECT
iptables -t filter -I INPUT -m state --state ESTABLISHED -j ACCEPT
可以在/proc/net/nf_conntrack查看跟踪记录,可以在/proc/sys/net/ipv4/netfilter中设置跟踪参数,比如可以在nf_conntrack_icmp_timeout中设置icmp跟踪记录的生存时间
A(host)------------------>B(NAT)----------------->C(host) (1.1.1.1) (1.1.1.2)(2.2.2.2) (2.2.2.1)
SNAT只能配置在INPUT和POSTROUTING上,INPUT用于主机接收;POSTROUTING主要走转发流程,如上图A直接ping 2.2.2.1需要配置如下内容,同时在A机器上可以抓包或使用iptables LOG功能或/var/log/message查看源地址,为B机器的2.2.2.2的地址
#A机器上添加到达C的路由,否则报文会走默认网关
route add -host 2.2.2.1 gw 1.1.1.2
#B转发机器添加iptables规则
iptables -t nat -I POSTROUTING -d 1.1.1.2 -j SNAT --to 2.2.2.2
DNAT只能配置在OUTPUT和PREROUTING上,PREROUTING用于路由判断,走转发;OUTPUT仅用于主机发送,A通过B ping C的配置如下(B机器配置)
#首先目的地址转换
iptables -t nat -I PREROUTING -d 1.1.1.2 -j DNAT --to 2.2.2.1
#修改源地址,否则报文回来找不到目的地址
iptables -t nat -I POSTROUTING -d 2.2.2.1 -j SNAT --to 2.2.2.2
使用NAT只能用于转换IP地址,如果要nat带端口号的服务,如基于tcp的ssh,或基于UDP的服务等,就需要NAPT,以上图为例,如果A需要ssh连接C,配置如下:
#添加到2.2.2.1的DNAT
iptables -t nat -I PREROUTING -d 1.1.1.2 -p tcp -m tcp --dport 20220 -j DNAT --to 2.2.2.1:22
#修改B发出的源地址
iptables -t nat -I POSTROUTING -d 2.2.2.1 -p tcp -m tcp --dport 22 -j SNAT --to 2.2.2.2
A最后ssh连接C的方式为:ssh -p 20220 2.2.2.2,当访问B主机的20220端口时,会映射到C主机的22端口。因为端口映射的关系是保存在NAT服务器上的,因此必须通过DNATP的方式,单独使用如下方式是无法通的
iptables -t nat -I POSTROUTING -d 2.2.2.1 -p tcp -m tcp --dport 22 -j SNAT --to 2.2.2.2
NAT尽量不要使用多端口映射,参见https://blog.csdn.net/u013401853/article/details/70848433