Linux_28 iptables
由于这五个规则是内核中的功能,用户不能直接操作内核中的功能,内核中所有的功能都是通过接口向外提供调用的,所以用户想要和内核交互,只能通过系统调用完成,所以需要开发一个用户空间工具,利用这个工具编写一些内容,送到内核的这些个位置上,来帮我们生成规则,这个工具就叫做iptables,内核中的叫netfilter
有个图形界面工具配置iptables规则:
yum install firewall-config -y
firewall-config 自动弹出图形化界面
iptables
iptables:包过滤型的防火墙
Firewall:防火墙,隔离工具;工作于主机或网络边缘,对于进出本主机或本网络的报文根据事先定义的检查规则匹配检测,对于能够被规则匹配到的报文做出相应处理的组件;
主机防火墙
网络防火墙
软件防火墙(软件逻辑)
硬件防火墙(硬件和软件逻辑)
ipfw(firewall framework) linux 2.0之前
ipchains(firewall framework) Linux2.0~2.4之间
iptables(netfilter) Linux2.4之后
netfilter:kernel
iptables:rules until
nftables Linux4.0之后
hook function:
input
output
forward
prerouting
postrouting
链(内置):
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
功能:
filter:过滤,防火墙;
nat:network address translation;用于修改源IP或目标IP,也可以改端口;
mangle:拆解报文,做出修改,并重新封装起来;
raw:关闭nat表上启用的连接追踪机制;
security:
功能<--链:
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT
报文流向:
流入本机:PREROUTING-->INPUT
由本机流出:OUTPUT-->POSTROUTING
转发:PREROUTING-->FORWARD-->POSTROUTING
路由功能发生的时刻:
报文进入本机后:
判断目标主机是?
报文离开本机之前:
判断经由哪个接口送往下一站?
iptables/netfilter
规则:
组成部分:根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理、
匹配条件:
基本匹配条件
-s -d -p -i -o
扩展匹配条件
-m matchname per-match-options
处理动作:
基本处理动作
ACCEPT
DROP
扩展处理动作
REJECT RETURN LOG REDIRECT,..
自定义处理机制
iptables的链:内置链和自定义链
内置链:对应于hook function
自定义链接:鱼鱼内置链的扩展和补充,可实现更灵活的规则管理机制;
添加规则时的考量点:
(1)要实现哪种功能:判断添加到哪个表上;
(2)报文流经的路径:判断添加到哪个链上;
链:链上的规则次序,即为检查的次序;因此,隐含一定的应用法则:
(1)同类规则(访问同一应用),匹配范围小的放上面;
(2)不同类的规则(访问不同应用),匹配到报文频率较大的放在上面;
(3)将那些可由一条规则描述的多个规则合并起来;
(4)设置默认策略;
iptables命令:
高度模块化,由诸多扩展模块实现其检查条件或处理动作的定义;
rpm -ql iptables
yum info iptables
/usr/lib64/xtables/
IPV6:libip6t_
IPV4:libipt_,libxt
iptalbes [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
matches:匹配条件
target:处理动作
match = -m matchname [per-match-options]
-m:指明匹配模块的名称
per-match-options:模块所定义的选项和值
target = -j targetname [per-target-options]
-j:指定一个处理动作的扩展;
per-target-options:每一个处理动作都有可能带有的选项
规则格式: iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
-t table: # 不指定表,默认是filter
raw mangle,nat,[filter]
COMMAND:
链管理:
-N:new,自定义一条新的规则链;
-X:delete,删除自定义的规则链;
注意:仅能删除用户 自定义的 引用计数为0的 空的链;
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃
REJECT:拒绝
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
规则管理:
-A:append,追加;
-I:insert,插入,要指明位置,省略时表示第一条;
-D:delete,删除;
(1)指明规则序号;
(2)指明规则本身;
-R:replace,替换指定链上的指定规则;
-F:flush,清空指定的规则链;
-Z:zero,置零;
iptables的每条规则都有两个计数器;
(1)匹配到的报文的个数;
(2)匹配到的所有报文的累计字节数;
查看:
-L:list,列出指定链上的所有规则;
-n:numberic,以数字格式显示地址和端口号;
iptables -L -n
-v:verbose,详细信息;
-vv,-vvv
iptables -L -n --line-numbers -v
iptables -L -n --line-numbers -vv
iptables -L -n --line-numbers -vvv
或者合并子选项:
iptables -nvxL --line-numbers
只显示某个链上的规则:
iptables -nvxL INPUT
-x:exactly,显示计数器结果的精确值;
--line-numbers:显示规则的序号;
iptables -L -n --line-numbers
chain:
PEROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
匹配条件:
基本匹配条件:PARAMETERS,无须加载任何模块,由iptables/netfilter自行提供;
扩展匹配条件:
隐式扩展:再使用-p选项指明了特定的协议时,无需再同时使用-m选项指明扩展模块的扩展机制;
显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制;
扩展匹配条件:需要加载扩展模块,方可生效;# rpm -ql iptables 中小写结尾的是扩展模块,大写的是处理动作模块
[!] -s,--source address[/mask][...]:检查报文中的源IP地址是否符合此处指定的地址或范围;
[!] -d, --destination address[/mask][...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
匹配所有地址:0.0.0.0/0
[!]-p,--protocol | protocol
protocol:tcp,udp,udplite,icmp,icmpv6,esp,ah,sctp,mh or "all"
{tcp|udp|icmp}
[!] -i,--in-interface name:数据报文流入接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;
[!]-o,--out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链;
iptables命令使用
# 如图1:
iptables -vnL 查看链(INPUT OUTPUT FORWARD)
iptables -N in_web_rules # 新增一个链
iptables -X in_web_rules # 删除一个链 注意:一个链有规则或其引用计数不为零,则无法直接删除。自定义的、空的、引用计数为零的链才可以被删除。
iptables -X INPUT | OUTPUT | FORWARD # 无法删除
# 图2:
iptables -P FORWARD DROP # 所有报文都将无法转发
iptables -vnL
iptables -P FORWARD ACCEPT
# 图3:
iptables -N in_web
iptables -E in_web_rules # 重命名自定义链
iptables -vnL
# 图4:
systemclt start firewalld
iptables -vnL
iptables -Z INPUT_ZONES # 将INPUT_ZONES链上的引用计数置零
iptables -Z # 不指定链,表示所有链全部置零
iptables -Z INPUT_ZONES 1 # 表示将哪条链的哪条规则的引用计数置零,这里是第一条规则置零
# 图5:
iptables -F IN_public # 将某条链上的规则全部清除
iptables -F FWDO_public 1 # 将FWDO_public链上的第一条规则清除
iptables -F # 将所有链的所有规则全部清除
# 图6:
iptables -vnL FORWARD --line-numbers
iptables -D FORWARD 7 # 删除FORWARD链中的第七条规则
图1:
图2:
图4:
清空前:
清空后:
图5:
清空前:
清空后:
清空所有链上的规则:
重启firewalld后恢复规则:
图6:
# 添加这两条规则之后 并设定filter链中的策略为DROP,ping包将无法进入,也就无从谈起 出去 如下图1
iptables -t filter -A INPUT -s 192.168.1.0/24 -d 192.168.1.8 -p tcp -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.1.8 -d 192.168.1.0/24 -p tcp -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# 可以再添加一条icmp协议的入栈和出栈的规则 如下图2
iptables -A INPUT -d 192.168.1.8 -p icmp -j ACCEPT # 添加这条入栈规则之后,ping包可以入栈(无法收到响应),但无法出栈,可以使用tcpdump抓包测试
tcpdump -i ens33 -nn icmp
iptables -A OUTPUT -s 192.168.1.8 -p icmp -j ACCEPT # 添加出栈规则,ping包有响应了。
图1:
图2:
隐式扩展
隐式扩展:不需要手动加载扩展模块;因为他们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;
tcp:
[!]--source-port,--sport port[:port]:匹配报文的源端口;可以是端口范围;
[!]--destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
[!]--tcp-flags mask comp
mask is the flags which we should examine,written as a comma-separated list,例如 SYN,ACK,FIN,RST
comp is a comma-separated list of flags which must be set,例如SYN
例如:“--tcp-flags SYN ACK FIN RST SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0.
[!] --syn :用于匹配第一次握手,相当于“--tcp-flags SYN,ACK,FIN,RST,SYN”;
udp:
[!] --source-port,--sport port[:port:]匹配报文的源端口;可以是端口范围;
[!]--destination-port,--dport port[:port:]:匹配报文的目标端口;可以是端口范围;
icmp:
[!] --icmp-type {type[/code]|typename}
echo-reqeust:8
echo-reply:0
显示扩展:必须要手动加载扩展模块,[-m,matchname[per-match-options]]
隐式扩展:
-p tcp:可直接使用tcp扩展模块的专用选项
[!] --source-port,--sport port[:port] 匹配报文源端口;可以给出多个端口,但只能式连续的端口范围;
[!] --destination-port,--dport port[:port] 匹配报文目标端口;可以给出多个端口,但只能是连续的端口范围;
[!] --tcp-flags mask comp 匹配报文中的tcp协议的标志位;Flags are:SYN ACK FIN RST URG PSH ALL NONE;
mask:要检查的FLAGS list,以逗号分隔;
comp:在mask给定的诸多的FLAGS中,其值必须为1的FLAGS列表,余下的其值必须为0;
--tcp-flags SYN,ACK,FIN,RST SYN
--tcp-flags ALL ALL
--tcp-flags ALL NONE
[!] --syn: --tcp-flags SYN,ACK,FIN,RST,SYN
-p udp:可直接使用udp协议扩展模块的专用选项
[!] --source-prot,--sport port[:port]
[!] --destination-port,--dport port[:port]
icmp:
[!] --icmp-type {type[/code]|typename}
0/0:echo reply
8/0:echo request
# icmp:
iptables -I OUTPUT 2 -s 192.168.1.8 -p icmp --icmp-type 8 -j ACCEPT
ping 192.168.1.9 # 添加上面的规则,ping的报文能出去,但进不来
在192.168.1.9主机上,抓取icmp包:
tcpdump -i ens33 -nn icmp
iptables -I INPUT 2 -d 192.168.1.8 -p icmp --icmp-type 0/0 -j ACCEPT
添加这条规则之后ping的报文能被收到
# udp(samba端口 udp 137 138 tcp 139 445): 目前iptables不支持离散端口的设定,必须一个个设定
iptables -I INPUT -d 192.168.1.8 -p udp --dport 137:138 -j ACCEPT # 入站
iptables -I OUTPUT -s 192.168.1.8 -p udp --dport 137:138 -j ACCEPT
显示扩展
显示扩展:必须使用-m选项指明要调用的扩展模块的扩展机制;
1.multiport:
以离散或连续的方式定义多端口匹配条件,最多15个;
[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;离散端口用逗号分隔,连续端口用冒号分隔。
[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
# iptables -I INPUT -d 192.168.1.8 -p tcp -m multiport -dports 22,80,139,445,3306 -j ACCEPT
2.iprange
以连续地址块的方式来指明多IP地址匹配条件;
[!] --src-range from [-to]
[!] --dst-range from [-to]
# iptables -I INPUT -d 192.168.1.8 -p tcp -m multiport 22,80,139,445,3306 -m iprange --src-range 192.168.1.5-192.168.1.20 -j REJECT
3.time
This matches if the packet arrival time/date is within a given range.
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!]--weekdays day[,day...]
[!]--monthdays day[,day...]
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--kerneltz:使用内核配置的时区而非默认的UTC;CentOS6不需加此参数,默认就是选择内核时区。
systemctl start httpd.service nmb.service smb.service
1.multiport:
iptables -R INPUT 2 -d 192.168.1.8 -p tcp -m multiport --dports 22,80,139,445 -j ACCEPT # 入站
iptables -R OUTPUT 2 -s 192.168.1.8 -p tcp -m multiport --sports 22,80,139,445 -j ACCEPT # 出站
smbclinet -L 192.168.1.8
2.iprange:
iptables -I INPUT 3 -d 192.168.1.8 -p tcp --dport 23 -m iprange --src-range 192.168.1.5-192.168.1.20 -j ACCEPT # 限制入站请求23号端口的源地址范围为5~20
iptables -I OUTPUT 3 -s 192.168.1.8 -p tcp --sport 23 -m iprange --dst-range 192.168.1.5-192.168.1.20 -j ACCEPT # 限制入站请求23号端口的进程响应时,响应的地址范围为5~20
3.time
iptables -R OUTPUT 4 -s 192.168.1.8 -p udp -m multiport --dports 123,323 -j ACCEPT #开启时间服务端口123和323
iptables -R INPUT 4 -d 192.168.1.8 -p udp -m multiport --sports 123,323 -j ACCEPT
iptables -R INPUT 3 -d 192.168.1.8 -p tcp --dport 23 -m iprange --src-range 192.168.1.5-192.168.1.20 -m time --timestart 10:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 --kerneltz -j ACCEPT # --kerneltz 指的是同步的是内核时钟
iptables -R OUTPUT 3 -s 192.168.1.8 -p tcp --sport 23 -m iprange --dst-range 192.168.1.5-192.168.1.20 -m time --timestart 10:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 --kerneltz -j ACCEPT
4.string # 只能对明文编码的协议生效,https/ssh等检测不到
This modules matches a given string by using some pattern matching strategy.
--algo {bm|kmp}
[!] --string pattern
[!] --hex-string pattern
--from offset
--to offset
# iptables -I OUTPUT -s -m string --algo bm --string "gay" -j REJECT
iptables -I OUTPUT -s 192.168.1.8 -m string --algo bm --string "gay" -j REJECT
vim /var/www/html
添加 文本“gay”词句,浏览器访问192.168.1.8 ,页面将被拒绝响应
5.connlimit (限制单个用户的最大连接数:并发连接数) # 如下图1
Allows you to restrict the number of parallel connetctions to a server per client Ip address (or client address block).
--connlimit-upto n
--connlimit-above n
# iptables -I INPUT -d 192.168.1.8 -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT
# 在192.168.1.8主机上:
mysql
create user 'test'@'192.168.1.%' IDENTIFIED by 'test123'
iptables -R OUTPUT 2 -d 192.168.1.0/24 -s 192.168.1.8 -p tcp --sport 3306 -j ACCEPT
iptables -R INPUT 2 -d 192.168.1.8 -s 192.168.1.0/24 -p tcp --dport 3306 -j ACCEPT
iptables -R INPUT 2 -d 192.168.1.8 -s 192.168.1.0/24 -p tcp --dport 3306 -m connlimit --connlimit-upto 2 -j ACCEPT
# 在192.168.1.9主机上:
mysql -utest -h 192.168.1.8 -ptest123 # 能
6.limit
This modile matches at a limited rate using a token bucket filter.
--limit rate[/second|/minute|hour|/day] # 设置发送(接收)包的速率
--limit-brust number # 设置令牌桶手记收集令牌的数量
# iptables -I OUTPUT -s 192.168.1.8 -p icmp --icmp-type 0 -j ACCEPT
yum install -y hping3 # 按自定义时间间隔发送hping3包
iptables -I INPUT 5 -d 192.168.1.8 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 20/minute -j ACCEPT # 入站
iptables -I OUTPUT 5 -s 192.168.1.8 -p icmp --icmp-type 0 -j ACCEPT # 出站
限制本机某tcp服务接收新请求的速率:--syn,-m limit
7.state
The "state" extension is a subset of the "conntrack" module "state" allows access to the connection tracking state for this packet.
[!] --state state
INVALID,ESTABLISHED,NEW,RELATED or UNTRACKED.
NEW:新连接请求; # 第一次连接请求都是NEW
ESTABLISHED:已建立的连接;
INVALID:无法识别的连接;
RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接;
UNTRACKED:未追踪的连接;
state扩展:
内核模块装载:
nf_conntrack
nf_conntrack_ipv4
手动装载:
nf_conntrack_ftp
追踪到的连接:
/proc/net/nf_conntrack
调整可记录的连接数量最大值:
/proc/sys/net/nf_conntrack_max
超时时长:
/proc/sys/net/netfilter/*timeout*
# 在192.168.0.10机器上创建以下规则并创建一个mysql用户:
iptables -A INPUT -d 192.168.0.10 -p tcp -m multiport --dports 22:23,80,139,445,3306 -m state --state NEW -j ACCEPT
iptables -A INPUT -d 192.168.0.10 -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.0.10 -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -d 192.168.0.10 -j REJECT
iptables -A OUTPUT -s 192.168.0.10 -j REJECT
iptables -vnL
create user 'test'@'192.168.0.%' IDENTIFIED by 'test123';
# 在192.168.0.11 主机上登录192.168.0.10机器上的mysql服务:
mysql -utest -h192.168.0.10 -ptest123 # 正常连接,以上创建的规则生效;
smbclient -L 192.168.0.10 # 正常连接
iptables -I INPUT 2 -d 192.168.0.10 -p udp --dport 137:138 -m state --state NEW -j ACCEPT
iptables -I OUTPUT 2 -s 192.168.0.10 -p udp -m multiport --dports 123,323 -j ACCEPT
图1:
处理动作(跳转目标):
-j targetname [per-target-options]
简单target:
ACCEPT,DROP
扩展target:
REJECT
This is used to send back an error packet in packet in respose to the matched packet:otherwise it is equlvalent to DROP so it is a terminating TARGET,ending rule traversal.
--reject-with type
The type can be icmp-net-unreachable,icmp-host-unreachable,icmp-proto-unreach-able,icmp-net-prohibited,icmp-host-prohibited,or icmp-admin-prohibited(*),which return the appropriate ICMP error message(icmp-port-unreachable is the default).
LOG
Turn on hernel logging of matching packets.
--log-level
--log-prefix
默认日志保存于/var/log/messages
iptables -I INPUT 3 -d 192.168.0.10 -p tcp --dport 23 -m state --state NEW -j LOG # 下图1
在192.168.0.11机器上使用telnet登录,查看192.168.0.10机器上/var/log/messages的日志信息:
telnet 192.168.0.10
登录的日志被记录 # 如下图2:
iptables -R INPUT 3 -d 192.168.0.10 -p tcp --dport 23 -m state --state NEW -j LOG --log-prefix "access telnet service"
RETURN :
返回调用者;
自定义链作为target:# 如下图3和4:
iptables -N in_ping_rules # 自定义一个链
iptables -A in_ping_rules -d 192.168.0.10 -p icmp --icmp-type 8 -j ACCEPT # 允许ping请求来ping这台主机
iptables -I in_ping_rules -d 192.168.0.10 -s 192.168.0.120 -p icmp -j REJECT # 不允许这台主机ping
iptables -vnL
添加完以上规则后,这个自定义链(in_ping_rules)还没生效,必须要在INPUT OUTPUT FORWORD上调用才能使用
iptables -I INPUT 5 -d 192.168.0.10 -p icmp -j in_ping_rules # 自定义链被INPUT链引用,如图4
测试:
在192.168.0.120主机上ping 192.168.0.10 没有响应,如他主机ping能正常响应 # 如图5
自定义链一旦被引用了,是无法删除链的,必须先清除被引用链中对应的那一条规则,然后清空自定义链规则,然后才能删除自定义链 # 图6
iptables -X in_ping_rules # 无法直接删除已被引用的链,应该先删除在被引用链中的对应的那一条规则
iptables -D INPUT 5 # 将在被引用链中的对应的那一条规则删除
iptables -X in_ping_rules # 还是不能删除,还要删除自定义链中定义的规则
iptables -F in_ping_rules # 清空自定义链(in_ping_rules)中的规则
iptables -vnL
iptables -X in_ping_rules
图1:
图2:
图3:
图4:
图5:
图6:
以上定义的规则都是保存在内存中的,被送往内核立即生效,如果机器重启,所有规则将被清空,如果想保存规则,就要将规则保存在文件当中。。。。。
保存和载入规则:
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
iptables-save > /etc/sysconfig/iptables-v1 # 这时再次清空规则,并不影响已经定义的规则的使用,可以执行下面的重载命令
iptables -F
重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE
-n,--noflush:不清楚原有规则
-t,--test:仅分析生成规则集,但不提交
iptables-restore < /etc/sysconfig/iptables-v1
CentOS 6:
保存规则:
service iptables save
保存规则于/etc/sysconfig/iptables文件,覆盖保存;
重载规则:
service iptables restart
默认重载/etc/sysconfig/iptables文件中的规则
配置文件:/etc/sysconfig/iptables-config
CentOS 7:
(1)自定义Unit File,进行iptables-restore;
(2)firewalld服务;
(3)自定义脚本;
规则优化的思路:
使用自定义链管理特定应用的相关规则,模块化管理规则;
(1)优先放行双方向状态为ESTABLISHED的报文;
(2)服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;
(3)服务于同一类别的功能的规则,匹配条件较严格的放在前面;
(4)设置默认策略:白名单机制
(a)iptables -P,不建议;
(b)建议在规则的最后定义规则作为默认策略;
iptables/netfilter网络防火墙
(1)网关;# 打开核心转发功能(/etc/sys/net/ipv4/ip_forward) sysctl -w net.ipv4.ip_forward=1
(2)filter表得FORWARD链;
需要注意得问题:
(1)请求-响应报文均会经由FORWARD链,要注意规则得方向性;
(2)如果要启用conntrack机制,建议将双方向得状态为ESTABLISHED得报文直接放行;
NAT:Network Address Translation
请求报文:由管理员定义;
响应报文:由NAT得conntrack机制自动实现;
请求报文:
改源地址:SNAT(Source Network Address Translation:源地址转换),MASQUERADE
改目标地址:DNAT(Destination Network Address Translation:目标地址转换)
iptables/netfilter:
NAT定义在nat表:
PREROUTING,INPUT,OUTPUT,POSTROUTING
SNAT:源地址转换定义在POSTROUTING链上
DNAT:目标地址转换定义在PREROUTING链上
PAT(Port Address Translation:端口地址转换):
target:
man iptables-extensions
SNAT:
This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.
--to-source [ipaddr[-ipaddr]]
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.0.6
iptables -t nat -vnL
DNAT:
This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.
--to-destination [ipaddr[-ipaddr]][:port[-port]]
iptables -t nat -F
iptables -t nat -vnL
iptables -t nat -A PREROUTING -d 172.16.0.6 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.2
MASQUERADE
This target is only valid in the nat table, in the POSTROUTING chain. It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.
SNAT场景中应用于POSTROUTING链上的规则实现源地址转换,但外网地址不固定时,使用此target ;
REDIRECT # 端口映射,在目标主机上添加规则后,其它主机访问该主机的某个端口,通过规则,将其映射到另外一个已监听的端口上。
This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.
--to-ports port[-port]
iptables -A PREROUTING -t nat -d 192.168.10.2 -p tcp --dport 80 -j REJECT --t0-ports 8080