NAT设置

使用Iptables设置NAT

  • 查看NAT映射关系列表
sudo iptables -t nat -L -n --line-number

--line-number: 显示规则的<规则的行号>

  • 查看NAT命令列表
sudo iptables -t nat -S
  • 开NAT:

    • 在第n条前插入新规则:使新规则成为第n条规则,而原来编号>=n的规则则编号加1
    sudo iptables -t nat -I PREROUTING <n> -d <公网ip>/32 -i <公网访问的网卡> -p tcp -m tcp --dport <公网端口> -j DNAT --to-destination <内网ip>:<内网端口>
    • 替换第n条规则:
    sudo iptables -t nat -R PREROUTING <n> -d <公网ip>/32 -i <公网访问的网卡> -p tcp -m tcp --dport <公网端口> -j DNAT --to-destination <内网ip>:<内网端口>
    • 在PREROUTING的结尾添加规则
    sudo iptables -t nat -A PREROUTING -d <公网ip>/32 -i <公网访问的网卡> -p tcp -m tcp --dport <公网端口> -j DNAT --to-destination <内网ip>:<内网端口>

    上面命令中的/32 -m tcp 可省,此即缺省值

  • 删除一条NAT规则

sudo iptables -t nat -D PREROUTING <规则的行号>
  • 去除重复的iptables规则,详见

    sudo iptables-save | awk '{if($1=="COMMIT"){delete x}}$1=="-A"?!x[$0]++:1' | sudo iptables-restore

    请勿使用以下方法:

    • 没有排序(sort)就用uniq,会有漏网之鱼

      sudo iptables-save | uniq | 【请勿使用本方法】 sudo iptables-restore
    • sort会打乱iptables规则的排序,使得规则的执行顺序发生变化(编号从小到大执行),详见iptables详解 处理顺序

      sudo iptables-save | sort | uniq | 【请勿使用本方法】 sudo iptables-restore
    • 会误删“COMMIT”这种正常的重复语句。

      sudo iptables-save | awk '!x[$0]++' | 【请勿使用本方法】sudo iptables-store