最近使用了路由器,然后就不能远程登录宿舍的电脑了,今天学习了一下iptables怎么设置端口转发。
一些概念
iptables
中有多个表格,每个表格都定义自己的默认策略与规则,且每个表格的用途都不同。
- Filter:管理本机进出
- NAT:管理后端主机(防火墙内部的其他计算机)
- Mangle:管理特殊标志(较少使用)
每个表格中又有自己的链(Chain
)。
Filter
:
- INPUT:管理进入主机的数据包
- OUTPUT:管理本机送出的数据包
- FORWARD:将数据包转发到防火墙后端的主机
NAT
:
- PRROUTING:路由之前进行的规则,修改目的ip等
- POSTROUTING:路由之后进行的规则,修改源ip等
- OUTPUT:与发送出去的数据包有关
语法
参考:https://help.ubuntu.com/community/IptablesHowTo
这里指列出常用的几个选项,其他细节可以看文档。
iptables [-AI 链名] [-io 网络接口] [-p 协议] [-s 源ip/网络][-d 目的ip/网络]-j [ACCEPT|DROP|REJECT|LOG]
-t
:后面接table,例如nat或者filter,默认是filter
-L
:列出目前的iptables规则
-n
:不进行IP与HOSTNAME的反查,显示信息快很多
-v
:显示更多的信息
-A
:后面加链名(如INPUT、OUTPUT等)新增一条规则,添加到后面
-I
:后面加链名(如INPUT、OUTPUT等)插入一条规则,最前面
-io
:后面加网络接口,i、o表示进出,
-p
:后面加协议,tcp、udp、icmp、all等,如果指定的协议是tcp或者udp,还可以指定端口选项
-d
:目标ip
-s
:源ip
-j
:后面接操作,如ACCEPT
、DROP
、REJECT
、LOG
--sport
:源端口
--dport
:目的端口
-m
、-state
:根据连接的状态决定行为,参考鸟哥私房菜服务器篇第三版P275。INVALID
:无效数据包、ESTABLISHED
:已成功建立连接的状态、NEW
:想要建立新连接的状态、RELATED
:是够与主机发送出去的数据包相关
没有列出的选项代表完全接受。
一些例子:
# 查看目前的NAT表的规则
iptables -L -t nat -n
# 列出完整的防火墙规则
iptables-save
# 清除所有的已制定的规则(慎用,可能导致远程连接断开,无法登录)
iptables -F
# 清除用户自定义的tables
iptables -X
# 将所有chain的计数与流量统计归零
iptables -Z
# 定义默认策略,-P(P大写)
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -t nat -P PREROUTING DROP
# 想要进入本机21端口的都阻挡掉
iptables -A INPUT -i eth0 -p tcp --dport 21 -j dump
# 删除规则 https://stackoverflow.com/questions/10197405/how-can-i-remove-specific-rules-from-iptables
## 第一种是重新执行一遍要删除的rule,不过将-A换成-D
iptables -D INPUT -i eth0 -p tcp --dport 21 -j dump
## 按行号删除
iptables -L INPUT --line-numbers
iptables -D INPUT 2
sudo iptables -t nat -D PREROUTING 1
NAT
SNAT
来源NAT:修改数据包报头的来源项目
内网主机发送报文到公网时,通过路由之后修改源ip为公网地址。
DNAT
目标NAT:修改数据包报头的目标项目
公网发来的数据包在路由之前修改目的ip为内网地址,发送到对应主机。
端口映射
举例说明:
路由器两个网络接口eth1
是公网接口(ip是223.224.236.21
)、br-lan
是内网接口(ip是192.168.1.1
)
主机私有地址192.168.1.205
如果要开启ssh,则需要将主机的22端口映射到路由器上.
# 进入路由器eth1网络接口3003端口的数据包转发到主机22端口
iptables -t nat -A PREROUTING -i eth1 -d 223.224.236.21 -p tcp --dport 3003 -j DNAT --to 192.168.1.205:22
# 从eth1网络接口发出的来自192.168.1.205的22端口的数据包将源地址修改为223.224.236.21
# iptables -t nat -A POSTROUTING -o eth1 -d 192.168.1.205 -p tcp --dport 22 -j SNAT --to 223.224.236.21
参考: