Iptables-linux服务器做路由转发
<p><strong>https://blog.csdn.net/liang_operations/article/details/80747510</strong></p><p><img src="https://img2018.cnblogs.com/blog/1078825/201905/1078825-20190526004227869-1618303687.png" alt=""></p>
<p> </p>
<p>实现内部服务器C可以经过服务器B进行上网。</p>
<p><img src="https://img2018.cnblogs.com/blog/1078825/201905/1078825-20190526004320521-1965671941.png" alt=""></p>
<p> </p>
<p><strong>3.1服务器双网卡,一块配置外网IP,一块配置内网IP(内网的不要设置网关)</strong></p>
<p># ip a</p>
<p>1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN</p>
<p> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00</p>
<p> inet 127.0.0.1/8 scope host lo</p>
<p> valid_lft forever preferred_lft forever</p>
<p> inet6 ::1/128 scope host</p>
<p> valid_lft forever preferred_lft forever</p>
<p>2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000</p>
<p> link/ether 00:0c:29:03:1e:48 brd ff:ff:ff:ff:ff:ff</p>
<p> inet 192.168.1.19/24 brd 192.168.1.255 scope global eno16777736</p>
<p> valid_lft forever preferred_lft forever</p>
<p>3: eno33554976: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000</p>
<p> link/ether 00:0c:29:03:1e:52 brd ff:ff:ff:ff:ff:ff</p>
<p> inet 10.0.0.141/24 brd 10.0.0.255 scope global dynamic eno33554976</p>
<p> valid_lft 1555sec preferred_lft 1555sec</p>
<p> inet6 fe80::20c:29ff:fe03:1e52/64 scope link</p>
<p> valid_lft forever preferred_lft forever</p>
<p><strong>3.2确保服务器可以上网 </strong></p>
<p># ping -c 2 baidu.com</p>
<p>PING baidu.com (123.125.115.110) 56(84) bytes of data.</p>
<p>64 bytes from 123.125.115.110: icmp_seq=1 ttl=128 time=45.9 ms</p>
<p>64 bytes from 123.125.115.110: icmp_seq=2 ttl=128 time=45.8 ms</p>
<p> </p>
<p><strong>3.3在内核文件/etc/sysctl.conf里开启转发功能,然后执行sysctl -p生效</strong></p>
<p># tail -1 /etc/sysctl.conf </p>
<p>net.ipv4.ip_forward = 1</p>
<p> </p>
<p># sysctl -p</p>
<p>net.ipv4.ip_forward = 1</p>
<p> </p>
<p><strong>3.4配置iptables</strong></p>
<p># iptables -F</p>
<p># iptables -P INPUT ACCEPT</p>
<p># iptables -P FORWARD ACCEPT</p>
<p># iptables -P OUTPUT ACCEPT</p>
<p><strong>3.5路由转发</strong></p>
<p># iptables -t nat -A POSTROUTING -s 192.168.1.0/24 \</p>
<p>-o eno33554976 -j SNAT --to-source 10.0.0.141</p>
<p> </p>
<p>-s 192.168.1.0/24 内部服务器网段</p>
<p>-o eno33554976 为路由转发服务器的外网网卡</p>
<p>-j SNAT --to-source 10.0.0.141 外网网卡IP地址</p>
<p>iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE (伪装,适合外网IP地址变化的配置)</p>
<p><strong>测试:</strong></p>
<p><img src="https://img2018.cnblogs.com/blog/1078825/201905/1078825-20190526004508925-221546188.png" alt=""></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<h1>linux iptables 用法与NAT</h1>
<div class="clear"> </div>
<div class="postBody">
<div id="cnblogs_post_body" class="blogpost-body">
<p>1.相关概念</p>
<p>2.iptables相关用法</p>
<p>3.NAT(DNAT与SNAT)</p>
<h2>相关概念</h2>
<p>防火墙除了软件及硬件的分类,也可对数据封包的取得方式来分类,可分为代理服务器(Proxy)及封包过滤机制(IP Filter)。</p>
<p>代理服务是一种网络服务,通常就架设在路由上面,可完整的掌控局域网的对外连接。</p>
<p>IP Filter这种方式可以直接分析最底层的封包表头数据来进行过滤,所以包括 MAC地址, IP, TCP, UDP, ICMP 等封包的信息都可以进行过滤分析的功能,用途非常广泛。</p>
<p>其实Iptables服务不是真正的防火墙,只是用来定义防火墙规则功能的"防火墙管理工具",将定义好的规则交由内核中的netfilter即网络过滤器来读取,从而真正实现防火墙功能。</p>
<p> </p>
<p>iptables抵挡封包的方式:</p>
<p>拒绝让 Internet 的封包进入 Linux 主机的某些 port</p>
<p>拒绝让某些来源 IP 的封包进入</p>
<p>拒绝让带有某些特殊标志( flag )的封包进入</p>
<p>分析硬件地址(MAC)来提供服务</p>
<p> </p>
<p>iptables命令中设置数据过滤或处理数据包的策略叫做规则,将多个规则合成一个链,叫规则链。<br>规则链则依据处理数据包的位置不同分类:</p>
<p><strong>PREROUTING:</strong> 在进行路由判断之前所要进行的规则(DNAT/REDIRECT)<br><strong>INPUT:</strong>处理入站的数据包<br><strong>OUTPUT:</strong>处理出站的数据包<br><strong>FORWARD:</strong>处理转发的数据包<br><strong>POSTROUTING:</strong> 在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)</p>
<p> </p>
<p> </p>
<p>iptables中的<strong>规则表</strong>是用于容纳<strong>规则链</strong>,规则表默认是允许状态的,那么规则链就是设置被禁止的规则,而反之如果规则表是禁止状态的,那么规则链就是设置被允许的规则。</p>
<p><strong>raw表:</strong>确定是否对该数据包进行状态跟踪</p>
<p><strong>mangle表:</strong>为数据包设置标记(较少使用)</p>
<p><strong>nat表:</strong>修改数据包中的源、目标IP地址或端口</p>
<p><strong>filter表:</strong>确定是否放行该数据包(过滤)</p>
<p><img src="https://images2018.cnblogs.com/blog/1387124/201806/1387124-20180606225916717-862172332.png" alt=""></p>
<p><strong>规则表的先后顺序:raw→mangle→nat→filter</strong></p>
<p> </p>
<p><strong>规则链的先后顺序:</strong></p>
<p><strong>入站顺序:</strong>PREROUTING→INPUT</p>
<p><strong>出站顺序:</strong>OUTPUT→POSTROUTING</p>
<p><strong>转发顺序:</strong>PREROUTING→FORWARD→POSTROUTING</p>
<p> </p>
<p><strong>内建表与链的关系流程图(去掉了mangle表):</strong></p>
<p><strong> <img src="https://images2018.cnblogs.com/blog/1387124/201806/1387124-20180606225917030-2102949092.png" alt=""></strong></p>
<p><strong>另外注意:</strong></p>
<p>1.没有指定规则表则默认指filter表。</p>
<p>2.不指定规则链则指表内所有的规则链。</p>
<p>3.在规则链中匹配规则时会依次检查,匹配即停止(<strong>LOG规则例外</strong>),若没匹配项则按链的默认状态处理。</p>
<p> </p>
<p> </p>
<p> </p>
<p>iptables命令中则常见的控制类型有:</p>
<p><strong>ACCEPT:</strong>允许通过.<br><strong>LOG:</strong>记录日志信息,然后传给下一条规则继续匹配.<br><strong>REJECT:</strong>拒绝通过,必要时会给出提示.<br><strong>DROP:</strong>直接丢弃,不给出任何回应.</p>
<p> </p>
<h2>iptables命令基本参数和用法</h2>
<p> 格式为:"iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]"。</p>
<p>以下格式的写法或许更为清楚明白:<br>"iptables – [-i|o 网络接口] [-p 协议] [-s 来源ip/网域] [-d 目标ip/网域] –j"</p>
<p>下表格为几乎所有常用的iptables参数,</p>
<div>
<table border="0"><colgroup><col><col></colgroup>
<tbody valign="top">
<tr>
<td>
<p>参数</p>
</td>
<td>
<p>作用</p>
</td>
</tr>
<tr>
<td>
<p>-P</p>
</td>
<td>
<p>设置默认策略:iptables -P INPUT (DROP|ACCEPT)</p>
</td>
</tr>
<tr>
<td>
<p>-F</p>
</td>
<td>
<p>清空规则链</p>
</td>
</tr>
<tr>
<td>
<p>-L</p>
</td>
<td>
<p>查看规则链</p>
</td>
</tr>
<tr>
<td>
<p>-A</p>
</td>
<td>
<p>在规则链的末尾加入新规则</p>
</td>
</tr>
<tr>
<td>
<p>-I num</p>
</td>
<td>
<p>在规则链的头部加入新规则</p>
</td>
</tr>
<tr>
<td>
<p>-D num</p>
</td>
<td>
<p>删除某一条规则</p>
</td>
</tr>
<tr>
<td>
<p>-s</p>
</td>
<td>
<p>匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。</p>
</td>
</tr>
<tr>
<td>
<p>-d</p>
</td>
<td>
<p>匹配目标地址</p>
</td>
</tr>
<tr>
<td>
<p>-i 网卡名称</p>
</td>
<td>
<p>匹配从这块网卡流入的数据</p>
</td>
</tr>
<tr>
<td>
<p>-o 网卡名称</p>
</td>
<td>
<p>匹配从这块网卡流出的数据</p>
</td>
</tr>
<tr>
<td>
<p>-p</p>
</td>
<td>
<p>匹配协议,如tcp,udp,icmp</p>
</td>
</tr>
<tr>
<td>
<p>--dport num</p>
</td>
<td>
<p>匹配目标端口号</p>
</td>
</tr>
<tr>
<td>
<p>--sport num</p>
</td>
<td>
<p>匹配来源端口号</p>
</td>
</tr>
</tbody>
</table>
</div>
<p> </p>
<p>Iptables规则查看与清除</p>
<p> </p>
<p>查看:</p>
<p><img src="https://images2018.cnblogs.com/blog/1387124/201806/1387124-20180606225917475-2147001271.png" alt=""></p>
<p><img src="https://images2018.cnblogs.com/blog/1387124/201806/1387124-20180606225917759-781041425.png" alt=""></p>
<p> </p>
<p>清除:</p>
<p> 规则的清除</p>
<p><img src="https://images2018.cnblogs.com/blog/1387124/201806/1387124-20180606225918035-1898694663.png" alt=""></p>
<p> </p>
<p>策略(Policy)的清除</p>
<p><img src="https://images2018.cnblogs.com/blog/1387124/201806/1387124-20180606225918494-2099201866.png" alt=""></p>
<p>Iptables 开放网口与ip来源</p>
<p>例:所有的来自 lo 这个网口的封包,都予以接受</p>
<p>iptables –A INPUT –i lo –j ACCEPT</p>
<p>例:目标来自 192.168.1.200 这个 IP 的封包都予以接受</p>
<p>iptables –A INPUT –i eth0 –s 192.168.1.200 –j ACCEPT</p>
<p>例:192.168.1.0/24 可接受,但 192.168.1.10 丢弃</p>
<p>iptalbes –A INPUT –i eth0 –s 192.168.1.0/24 –j ACCEPT</p>
<p>iptables -A INPUT -i eth0 -s 192.168.1.10 -j DROP</p>
<p> </p>
<p>Iptables 规则记录</p>
<p>例:# iptables -A INPUT -s 192.168.1.200 -j LOG</p>
<p><img src="https://images2018.cnblogs.com/blog/1387124/201806/1387124-20180606225919188-1510361996.png" alt=""></p>
<p>相关信息就会被写入到/var/log/messages当中,然后该封包会继续进行</p>
<p>后续的规则比对。LOG 这个动作仅在进行记录而已,并不会影响到这个封包的其它规则比对的。</p>
<p> </p>
<p>Iptables 开放tcp、udp端口</p>
<p>例:开放samba端口(udp137,138;tcp139,445)</p>
<p>iptables –A INPUT –i eth0 –p udp –dport 137:138 –j ACCEPT</p>
<p>iptables –A INPUT –i eth0 –p tcp –dport 139–j ACCEPT</p>
<p>iptables –A INPUT –i eth0 –p tcp –dport 445–j ACCEPT</p>
<p><img src="https://images2018.cnblogs.com/blog/1387124/201806/1387124-20180606225919533-1112115740.png" alt=""></p>
<p> </p>
<p>iptables匹配ICMP端口和ICMP类型</p>
<p>iptables –A INPUT –p icmp –icmp-type 类型 –j ACCEPT</p>
<p>参数:--icmp-type :后面必须要接 ICMP 的封包类型,也可以使用代号,</p>
<p>例如 8 代表 echo request 的意思。(可自查询ICMP-type对应表)</p>
<p> </p>
<p>Iptables –syn的处理方式</p>
<p>指定TCP匹配扩展</p>
<p>使用 –tcp-flags 选项可以根据tcp包的标志位进行过滤。</p>
<p>#iptables -A INPUT -p tcp –tcp-flags SYN,FIN,ACK SYN</p>
<p>#iptables -A FROWARD -p tcp –tcp-flags ALL SYN,ACK</p>
<p>上实例中第一个表示SYN、ACK、FIN的标志都检查,但是只有SYN匹配。第二个表示ALL(SYN,ACK,FIN,RST,URG,PSH)的标志都检查,但是只有设置了SYN和ACK的匹配。</p>
<p>#iptables -A FORWARD -p tcp --syn</p>
<p>选项—syn相当于"--tcp-flags SYN,RST,ACK SYN"的简写。</p>
<p> </p>
<p>Iptables 状态模块</p>
<p><img src="https://images2018.cnblogs.com/blog/1387124/201806/1387124-20180606225919898-1697916229.png" alt=""></p>
<p>例:只要已建立或相关封包就予以通过,只要是不合法封包就丢弃</p>
<p>iptables –A INPUT –m state –state RELATED ESTABLISHED –j ACCEPT</p>
<p>iptables –A INPUT –m state –state INVALID –j DORP</p>
<p>例:对局域网内mac地址为00:0C:29:56:A6:A2主机开放其联机</p>
<p># iptables -A INPUT -m mac --mac-source 00:0C:29:56:A6:A2 -j ACCEPT</p>
<p><img src="https://images2018.cnblogs.com/blog/1387124/201806/1387124-20180606225920267-2134680898.png" alt=""></p>
<p> </p>
<p>Iptables保存于恢复</p>
<p>iptables-save > /etc/sysconfig/iptables.20180606</p>
<p>iptables-restore < /etc/sysconfig/iptables.20180606</p>
<p><img src="https://images2018.cnblogs.com/blog/1387124/201806/1387124-20180606225920637-1970179073.png" alt=""></p>
<p> </p>
<p><img src="https://images2018.cnblogs.com/blog/1387124/201806/1387124-20180606225921067-736108580.png" alt=""></p>
<p> </p>
<p> </p>
<h2>NAT(Network AddressTranslation网络地址转换)</h2>
<p>首先说说局域网内封包的传送,</p>
<p>1. 先经过 NAT table 的 PREROUTING 链;</p>
<p>2. 经由路由判断确定这个封包是要进入本机与否,若不进入本机,则下一步;</p>
<p>3. 再经过 Filter table 的 FORWARD 链;</p>
<p>4. 通过 NAT table 的 POSTROUTING 链,最后传送出去。</p>
<p>NAT 主机的重点就在于上面流程的第 1,4 步骤,也就是 NAT table 的两条重要的链:PREROUTING 与POSTROUTING。 那这两条链重要功能在于修改IP,而这两条链修改的IP又是不一样的,POSTROUTING在修改来源IP,PREROUTING则在修改目标IP 。由于修改的 IP 不一样,所以就称为来源NAT (Source NAT, SNAT) 及目标 NAT (Destination NAT, DNAT)。</p>
<p> </p>
<p>SNAT即源地址转换,能够让多个内网用户通过一个外网地址上网,解决了IP资源匮乏的问题。一个无线路由器也就使用此技术。</p>
<p><img src="https://images2018.cnblogs.com/blog/1387124/201806/1387124-20180606225921518-615630194.png" alt=""></p>
<p>SNAT封包传送示意图</p>
<p>由上图可知,需要将192.168.10.10转换为111.196.211.212,iptables命令如下:</p>
<p>iptables –t nat –A POSTROUTING –s 192.168.10.10 –o eth1 –j SNAT --to-source 111.196.221.212</p>
<p>外网IP地址不稳定的情况即可使用MASQUERADE(动态伪装),能够自动的寻找外网地址并改为当前正确的外网IP地址</p>
<p>iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE</p>
<p> </p>
<p>DNAT即目地地址转换,则能够让外网用户访问局域网内不同的服务器。(相当于SNAT的反向代理)</p>
<p><img src="https://images2018.cnblogs.com/blog/1387124/201806/1387124-20180606225922056-339944898.png" alt=""></p>
<p>DNAT封包传送示意图</p>
<p> </p>
<p>由上图可知,目标地址192.168.10.6在路由前就转换成61.240.149.149,需在网关上运行iptables命令如下:</p>
<p>iptables –t nat –A PREROUTING –i eth1 –d 61.240.149.149 –p tcp –dport 80 –j DNAT --to-destination 192.168.10.6:80</p>
<p>eth1网口传入,且想要使用 port 80 的服务时,将该封包重新传导到 192.168.1.210:80 的 IP 及 port 上面,可以同时修改 IP 与 port。此为地址映射与端口转换。</p>
<p> </p>
<p>还可以使用REDIRECT单独进行端口转换</p>
<p>例:将 80 端口的封包转递到 8080端口</p>
<p>iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080</p>
<p># 使用 8080 这个 port 来启动 WWW ,但是别人都以80来联机</p>
</div>
</div><br><br>
来源:https://www.cnblogs.com/linuxws/p/10924817.html
頁:
[1]