<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>iptables on Linkzz&#39;s Blog</title>
    <link>https://linkzz.org/tags/iptables/</link>
    <description>Recent content in iptables on Linkzz&#39;s Blog</description>
    <image>
      <title>Linkzz&#39;s Blog</title>
      <url>https://linkzz.org/logo.png</url>
      <link>https://linkzz.org/logo.png</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Tue, 07 Nov 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://linkzz.org/tags/iptables/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>一次防火墙纠错，让我更了解防火墙机制</title>
      <link>https://linkzz.org/posts/firewall-checkout/</link>
      <pubDate>Tue, 07 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://linkzz.org/posts/firewall-checkout/</guid>
      <description>&lt;h2 id=&#34;1-起因&#34;&gt;1. 起因&lt;/h2&gt;
&lt;p&gt;工作中我一直使用wireguard搭建公司 -&amp;gt; 家的桥梁，用于随时随地访问家中内网的各种服务，如gogs代码仓库、nextcloud同步工作文件，抑或是远程连接windows虚拟机用来摸鱼，然而尽管拥有公网ip，家里和公司之间只有区区10ms的网络时延，却还是因为运营商对UDPl的QOS而影响远程服务的传输体验。于是我就搭建了一套phantun服务用来将UDP流量转换为TCP流量而避过运营商的QOS，建好之后确实体验提升明显，远程的moonlight能稳定跑满30M上传带宽，然而当时搭建的时候的iptables规则未保存，今天的一次重启让我的phantun死活连不上，于是就有了今天的文章。&lt;/p&gt;
&lt;h2 id=&#34;2-排查&#34;&gt;2. 排查&lt;/h2&gt;
&lt;h3 id=&#34;21-报错日志&#34;&gt;2.1 报错日志&lt;/h3&gt;
&lt;p&gt;由于是客户端重启之后连不上的，排除服务端错误的情况，从客户端查起，查看phantun报错：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl status phantun.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Nov  8 10:22:11 new-business-dev-001 phantun_client[5517]:  ERROR client &amp;gt; Unable to connect to remote {my-home-ip}:25379
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Nov  8 10:22:14 new-business-dev-001 phantun_client[5517]:  ERROR client &amp;gt; Unable to connect to remote {my-home-ip}:25379
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;客户端一直报错连不上服务端，25379端口是&lt;code&gt;phantun_server&lt;/code&gt;的监听端口，之前连接是好的，不可能有问题。&lt;/p&gt;
&lt;h3 id=&#34;22-抓包分析&#34;&gt;2.2 抓包分析&lt;/h3&gt;
&lt;p&gt;遇到网络相关的问题，抓包分析是最为直观的解决方案，我们查看往来服务端的流量信息:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tcpdump -i any host &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;my-home-ip&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;10:28:48.652090 IP 192.168.200.2.61048 &amp;gt; {my-home-ip}.25379: Flags [S], seq 0, win 65535, options [nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;10:28:49.653239 IP 192.168.200.2.61048 &amp;gt; {my-home-ip}.25379: Flags [S], seq 0, win 65535, options [nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;10:28:50.654392 IP 192.168.200.2.61048 &amp;gt; {my-home-ip}.25379: Flags [S], seq 0, win 65535, options [nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;10:28:51.655551 IP 192.168.200.2.61048 &amp;gt; {my-home-ip}.25379: Flags [R], seq 0, win 65535, length 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;IP &lt;code&gt;192.168.200.2&lt;/code&gt; 一直在向服务端发送 SYN 握手包，而服务端是没有响应任何内容的，这明显可以看出这个包是没办法送达的，因为 &lt;code&gt;192.168.200.2&lt;/code&gt; 这个地址属于 phantun_client 创建的tun设备的地址，是没有互联网访问能力的，所以我们需要将该接口的包转发至具有互联网访问能力的接口，通俗的讲就是 lan 口，首先确认内核开启了 IP 转发：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo sysctl -a &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep ip.forward
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;net.ipv4.ip_forward = 1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;net.ipv4.ip_forward_update_priority = 1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;net.ipv4.ip_forward_use_pmtu = 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;看到 &lt;code&gt;net.ipv4.ip_forward = 1&lt;/code&gt; 的值为1已经开启了IP转发，如若不是需开启ip转发，开启ipv4的IP转发即可：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo sysctl -w net.ipv4.ip_forward&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启用源地址转换：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo iptables -t nat -A POSTROUTING -o ens160 -j MASQUERADE
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里 &lt;code&gt;ens160&lt;/code&gt; 是我可以访问互联网的接口，这里指的是对 &lt;code&gt;nat&lt;/code&gt; 表的 &lt;code&gt;POSTROUTING&lt;/code&gt; 链添加一条规则，对出口接口为 &lt;code&gt;ens160&lt;/code&gt; 的所有流量执行 &lt;code&gt;MASQUERADE&lt;/code&gt; 操作，&lt;code&gt;MASQUERADE&lt;/code&gt; 是源地址转换（SNAT）的一种实现，通过这样的操作即可实现局域网内的地址可转换为ens160的地址进行互联网访问，从而使得 &lt;code&gt;phantun_client&lt;/code&gt; 的流量包能成功发出。&lt;/p&gt;
&lt;h3 id=&#34;23-还是不行&#34;&gt;2.3 还是不行？&lt;/h3&gt;
&lt;p&gt;再看看看日志：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;11:09:26.356501 IP 192.168.200.2.5320 &amp;gt; {my-home-ip}.25379: Flags [S], seq 0, win 65535, options [nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;11:09:27.357822 IP 192.168.200.2.5320 &amp;gt; {my-home-ip}.25379: Flags [S], seq 0, win 65535, options [nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;11:09:28.358988 IP 192.168.200.2.5320 &amp;gt; {my-home-ip}.25379: Flags [S], seq 0, win 65535, options [nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;11:09:29.360160 IP 192.168.200.2.5320 &amp;gt; {my-home-ip}.25379: Flags [R], seq 0, win 65535, length 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;额。。。看样子我们并没有成功，日志还是和之前没有区别，这难道是分析有误？我不禁开始怀疑自己的水平，还是那么菜。然而消沉并没有用，问题还要解决，是时候祭出天书了，翻遍了我的书籍找到了下面这张图(鸟哥的Linux私房菜)： &lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/11/25f7a3eeb14f137bcfebef078dda4a30.png&#34; alt=&#34;image.png&#34;  /&gt;
 可以看到 &lt;code&gt;wireguard&lt;/code&gt; 的握手包是需要发出之前是需要经过 &lt;code&gt;FORWARD&lt;/code&gt; 链的，那会不会是被这条路阻了呢，查看 &lt;code&gt;iptables&lt;/code&gt; 详情：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo iptables -L -v -n
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/11/a880600760263e299c833553e857b63e.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;果然，&lt;code&gt;FORWARD&lt;/code&gt; 链默认策略是 &lt;code&gt;DROP&lt;/code&gt;，正是这个地方阻止了流量包，调整 &lt;code&gt;FORWARD&lt;/code&gt; 链默认策略：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo iptables -P FORWARD ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再来看抓包日志：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;13:52:54.939793 IP 192.168.200.2.11968 &amp;gt; {my-home-ip}.25379: Flags [S], seq 0, win 65535, options [nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;13:52:54.939857 IP 10.1.1.137.11968 &amp;gt; {my-home-ip}.25379: Flags [S], seq 0, win 65535, options [nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;13:52:54.949558 IP{my-home-ip}.25379 &amp;gt; 10.1.1.137.11968: Flags [S.], seq 0, ack 1, win 65535, options [mss 536,nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;13:52:54.949585 IP {my-home-ip}.25379 &amp;gt; 192.168.200.2.11968: Flags [S.], seq 0, ack 1, win 65535, options [mss 536,nop,wscale 14], length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;13:52:54.949644 IP 192.168.200.2.11968 &amp;gt; {my-home-ip}.25379: Flags [.], ack 1, win 65535, length 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;13:52:54.949658 IP 10.1.1.137.11968 &amp;gt; {my-home-ip}.25379: Flags [.], ack 1, win 65535, length 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看到握手包正常发出和接收了，再看 &lt;code&gt;wireguard&lt;/code&gt; 状态：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.linkzz.eu.org/main/images/2023/11/25551621cab65e23ef6dd0aeaf590be4.png&#34; alt=&#34;image.png&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;通过 &lt;code&gt;phantun&lt;/code&gt; 伪装的 &lt;code&gt;wireguard&lt;/code&gt; 也连接成功，至此问题解决。&lt;/p&gt;
&lt;h3 id=&#34;24-保存规则&#34;&gt;2.4 保存规则&lt;/h3&gt;
&lt;p&gt;至此就完结了吗，并没有，我们以上设置的 &lt;code&gt;iptables&lt;/code&gt; 规则并不是永久的，重启之后之前设置的规则都会重置，事实上之所有有此次问题正是因为我之前设置好的 &lt;code&gt;iptables&lt;/code&gt; 规则没有保存，无法开机自动应用规则导致的此次事件，下面我们就来保存规则：&lt;/p&gt;
&lt;p&gt;安装 &lt;code&gt;iptables-persistent&lt;/code&gt; 包&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install iptables-persistent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;保存规则：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo iptables-save &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /etc/iptables/rules.v4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样重启之后规则自会自动应用了&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>

