【笔记】openwrt - iptables 命令、例子、日志( 三 )


大部分选项都有长短两种格式 , 例如 -- 和 -s , 长格式写起来麻烦 , 但更易 阅读 。
# 匹配后的动作()
至此 , 我们已经可以指定匹配模式来过滤包了 , 接下来就是选择合适的动作 。对于 nat table , 有如下几种动作:SNAT, , DNAT,  , 都需要通过 -j 指定 。它们的格式如下(表示的意思将在下一节介绍):
# In the following the table selection, the command and the match pattern# will be abbreviated using [...]# 修改源 IP 为固定新 IP (静态)# Source-NAT: Change sender to 123.123.123.123$> iptables [...] -j SNAT --to-source 123.123.123.123# --------------------------# 因为 SNAT 只对离开路由器的包有意义 , 因此它只用在 POSTROUTING chain 中 。# 修改源 IP 为动态新 IP(动态获取网络接口 IP)# Mask: Change sender to outgoing network interface$> iptables [...] -j MASQUERADE# --------------------------# 和 SNAT 类似 , 但是对每个包都会动态获取指定输出接口(网卡)的 IP , 因此如果接口 的 IP 地址发送了变化 , MASQUERADE 规则不受影响 , 可以正常工作;而对于 SNAT 就必须重新调整规则 。# 和 SNAT 一样 , MASQUERADE 只对 POSTROUTING chain 有意义 。但和 SNAT 不同 ,  MASQUERADE 不支持更详细的配置项了 。# 修改目的 IP# Destination-NAT: Change receipient to 123.123.123.123, port 22$> iptables [...] -j DNAT --to-destination 123.123.123.123:22# --------------------------# 如果想修改包的目的 IP 地址 , 那需要使用 Destination NAT(DNAT) 。# DNAT 可以用于运行在防火墙后面的服务器 。# 显然 , 接收端修改必须在做路由决策之前 , 因此 DNAT 适用于 PREROUTING 和 OUTPUT (本地生成的包)chain 。# 将包重定向到本机另一个端口# Redirect to local port 8080$> iptables [...] -j REDIRECT --to-ports 8080# --------------------------# REDIRECT 是 DNAT 的一个特殊场景 。包被重定向到路由器的另一个本地端口 , 可以实现 ,  例如透明代理的功能 。和 DNAT 一样 , REDIRECT 适用于 PREROUTING 和 OUTPUT chain。
# nat机器的配置
要使用 NAT , 我们首先需要配置机器 。下面的例子中 , # 开头的是注释 , $> 开头的是命 令 。
# IMPORTANT: Activate IP-forwarding in the kernel!# 开启ip转发功能 , 默认关闭 。关闭时 , 遇到非本地ip会直接丢弃# Disabled by default!$> echo "1" > /proc/sys/net/ipv4/ip_forward# centos可以改成执行下面命令 , 然后重启以下echo "net.ipv4.ip_forward=1">>/usr/lib/sysctl.d/50-default.conf# 检察 , 看到net.ipv4.ip_forward = 1 就ok了sysctl -a | grep ip_forward # Load various modules. Usually they are already loaded # (especially for newer kernels), in that case # the following commands are not needed.# Load iptables module:$> modprobe ip_tables# activate connection tracking# (connection's status are taken into account)$> modprobe ip_conntrack# Special features for IRC:$> modprobe ip_conntrack_irc# Special features for FTP:$> modprobe ip_conntrack_ftp
以上配置应该足够了 。如果遇到错误 , 可能是因为你的内核在编译时没有指定路由相关的选 项 , 请参考这里。
# 例子:将私有网络通过 NAT 连接到互联网(路由nat原理)
从本地网络发出的、目的是互联网的包 , 将发送方地址修改为路由器 的地址 。
接下来假设路由器的本地网络走 eth0 端口 , 到因特网的网络走 eth1 端口 。那么如 下命令就能完成我们期望的功能: