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


iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE# iptables -t nat -A POSTROUTING -o eth0 -s 192.168.2.0/24 -j MASQUERADE# https://www.bilibili.com/video/BV15541157wS?p=12
解释:
如果路由器配置的是静态 IP 地址 , 那 SNAT 是最合适的选择 , 因为它比更 快 , 后者对每个包都需要检查指定的输出端口上配置的 IP 地址 。
# Options for SNAT (abstract of manual page)iptables -t nat -A POSTROUTING -o eth0 -j DNAT --to-source [-][:port-port]
# 例子:通过 NAT 从外网访问内网服务(端口映射)
运行在 NAT 路由器后面的内网服务器 , 默认是不能被外部网络直接访问的 。例如 , 假设我 们有一个 HTTP 服务运行在内网机器 192.168.1.2 , NAT 路由器的地址是 192.168.1.1  , 并通过另一张有公网 IP 123.123.123.123 的网卡连接到了外部网络 。
要使得外网机器可以访问 192.168.1.2 的服务 , 需要执行:
# redirect http traffic to 192.168.1.2:$> iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 -j DNAT --to 192.168.1.2
然后 , 就可以通过公网 IP 123.123.123.123 的 80 端口访问 192.168.1.2 的 HTTP 服务了 。
更换映射的服务端口 , 可以防止别人盯着一个端口一直ping
# 把10机子的ssh服务端口更换到3333iptables -t nat -A PREROUTING -i ens34 -d 192.168.200.10 -p tcp --dport 3333 -j DNAT --to-destination 192.168.100.10:22
# 例子:透明代理
假设我们有一个本地网络 , 通过 NAT 连接到因特网 。我们需要在路由器的 8080 端口运行 一个 HTTP 代理 , 处理本地网络 HTTP 流量 。
首先想到的解决方案是:让每个用户设置他们的浏览器使用代理服务器 , 然后禁止所有 80 端口的出流量 。对于很小的网络 , 这种方式可能让人满意 , 但无法扩展到很大的网络 , 因为 这种方式需要对每个客户端进行配置 。(也失去了“透明代理”的意义) 。
使用 NAT , 我们有另一种可能:所有从 80 端口进来的流量 , 重定向到 8080 端口 。相应 的命令:
# Transparent proxying:# (local net at eth0, proxy server at port 8080)$> iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \-j REDIRECT --to-ports 8080
当然 , 8080 端口要有 HTTP 代理运行 。另外 , 你的服务器可能做一些特殊配置(甚至特殊 编译)才能支持透明代理 。
透明代理的缺点是 CPU load 会升高(尤其是大型网络) , 对太新或太旧的浏览器可能有兼 容性问题 。
# 例子:通过跳板机绕过某端口
假设110端口坏了 , 我们使用 NAT 可以绕过它 。
找一个110端口好的跳板机 , 在它上寻找一个可用端口 , 例如:111.111.111.111:5001 , 做透明代理 。
首先 , 在你自己的(内网)机器上执行:
# redirect http-Traffic going to Port 110 to 111.111.111.111:5001:$> iptables -t nat -A OUTPUT -p tcp --dport 110 \-j DNAT --to-destination 111.111.111.111:5001
然后 , 在跳板机上执行
# redirect port 5001 to port 110 (POP3) at 123.123.123.123:$> iptables -t nat -A PREROUTING -p tcp --dport 5001 \-j DNAT --to-destination 123.123.123.123:110# Change sender to redirecting machine:$> iptables -t nat -A POSTROUTING -p tcp --dport 110 \-j MASQUERADE