<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>小鑫的GNU/Linux学习网站</title>
		<link>https://linux.xiazhengxin.name/rss.php/index.php</link>
		<description><![CDATA[小鑫的GNU/Linux学习网站]]></description>
		<copyright>Copyright 2026, 小鑫</copyright>
		<managingEditor>小鑫</managingEditor>
		<language>zh-CN</language>
		<generator>SPHPBLOG 0.7.0</generator>
		<item>
			<title>腾讯云开启ipv6，重启后地址失效</title>
			<link>https://linux.xiazhengxin.name/rss.php/index.php?entry=entry260102-070229</link>
			<description><![CDATA[这个脚本是在腾讯云后台的TAT执行脚本记录中找到的，内容:<br /><pre><br />[root@VM-4-3-rockylinux ~]# nl ipv6.sh<br />     1  if [ ! -f &quot;/etc/tencentcloud_ipv6_base.sh&quot; ]; then<br />     2  cat &lt;&lt;&#039;EOF&#039; &gt; &#039;/etc/tencentcloud_ipv6_base.sh&#039;<br />     3  #!/bin/bash<br /><br />     4  ## support ipv6 eip config from TAT<br />     5  ## Version:1.0<br /><br />     6  DEFAULTMODE=$1<br />     7  DEFAULTADDR=$2<br />     8  DEFAULTULA=$3<br />     9  DEFAULTISP=$4<br />    10  DEFAULTDEV=&quot;eth0&quot;<br /><br />    11  DEVCOUNT=0<br />    12  ADDRCOUNT=0<br />    13  MODE=&quot;&quot;<br />    14  ADDR=&quot;&quot;<br />    15  ULA=&quot;&quot;<br />    16  ISP=&quot;&quot; # XXX not used yet<br />    17  DEV=&quot;&quot;<br /><br />    18  determine_device_name() {<br />    19      # init default value<br />    20      local ula_addr=${1:-}<br />    21      local devices=&quot;&quot;<br />    22      local mac_addr=&quot;&quot;<br /><br />    23      # get dev from ula<br />    24      devices=($(ip -o link show 2&gt;/dev/null | awk -F&#039;: &#039; &#039;{print $2}&#039; || echo &quot;&quot;))<br />    25      if [[ -n &quot;$devices&quot; ]]; then<br />    26          for dev in &quot;${devices[@]}&quot;; do<br />    27              if ip -6 addr show dev &quot;$dev&quot; 2&gt;/dev/null | grep -q &quot;inet6 $ula_addr&quot; 2&gt;/dev/null; then<br />    28                  echo &quot;$dev&quot;<br />    29                  return<br />    30              fi<br />    31          done<br />    32      fi<br /><br />    33      # get dev from metadata<br />    34      mac_addr=$(curl -s -m 5 <a href="http://metadata.tencentyun.com/meta-data/mac" >http://metadata.tencentyun.com/meta-data/mac</a> 2&gt;/dev/null || echo &quot;&quot;)<br />    35      if [[ -n &quot;$mac_addr&quot; &amp;&amp; -n &quot;$devices&quot; ]]; then<br />    36          for dev in &quot;${devices[@]}&quot;; do<br />    37              if ip link show &quot;$dev&quot; 2&gt;/dev/null | grep -q &quot;$mac_addr&quot; 2&gt;/dev/null; then<br />    38                  echo &quot;$dev&quot;<br />    39                  return<br />    40              fi<br />    41          done<br />    42      fi<br /><br />    43      # fallback to default<br />    44      echo &quot;$DEFAULTDEV&quot;<br />    45  }<br /><br />    46  sync_config_from_meta() {<br />    47      MODE=$DEFAULTMODE<br />    48      ADDR=$DEFAULTADDR<br />    49      ULA=$DEFAULTULA<br />    50      ISP=$DEFAULTISP<br />    51      DEV=$(determine_device_name &quot;$ULA&quot;)<br />    52      # TODO<br />    53      DEVCOUNT=1<br />    54      ADDRCOUNT=1<br />    55  }<br /><br />    56  setup_dhcpclient_dhclient()<br />    57  {<br />    58      local dev=$1<br /><br />    59      if [[ $MODE == &quot;PASSTHROUGH&quot; ]]; then<br />    60          # stop client<br />    61          pid=`cat /var/run/dhclient6.pid`<br />    62          if [[ -n $pid ]]; then<br />    63              /usr/bin/kill -9 `cat /var/run/dhclient6.pid`<br />    64          fi<br />    65      else<br />    66          # start client<br />    67          if [[ ! -f /var/run/dhclient6.pid ]]; then<br />    68              /sbin/dhclient -6 -nw $dev<br />    69          fi<br />    70      fi<br />    71  }<br /><br />    72  setup_dhcpclient_systemd()<br />    73  {<br />    74      local dev=$1<br />    75      local profile=&quot;/run/systemd/network/10-netplan-$dev.network&quot;<br />    76      local disabled=`/usr/bin/grep &quot;IPv6AcceptRA=false&quot; $profile; echo $?`<br /><br />    77      sed -i &quot;/\[Network\]/aGateway=fe80::feee:ffff:feff:ffff&quot; $profile<br />    78      if [[ $MODE == &quot;PASSTHROUGH&quot; ]]; then<br />    79          if [[ $disabled == &quot;1&quot; ]]; then<br />    80              # stop client<br />    81              sed -i &quot;/\[Network\]/aIPv6AcceptRA=false&quot; $profile<br />    82              sed -i &quot;/\[Network\]/aAddress=${ADDR}&quot; $profile<br />    83              networkctl reload<br />    84              sleep 1<br />    85          fi<br />    86          # XXX persistent config causes cloud-init not bringing up $dev<br />    87          # /usr/bin/sed -i &quot;/eth0:/a\      accept_ra: false&quot; /etc/netplan/00-installer-config.yaml<br />    88      else<br />    89          if [[ $disabled == &quot;0&quot; ]]; then<br />    90              # start client<br />    91              sed -i &quot;/IPv6AcceptRA=false/d&quot; $profile<br />    92              sed -i &#039;/^Address=\([0-9a-fA-F]\{1,4\}:\)\{7\}[0-9a-fA-F]\{1,4\}/d&#039; $profile<br />    93              networkctl reload<br />    94              sleep 1<br />    95          fi<br />    96          # persistent config<br />    97          # /usr/bin/sed -i &quot;/accept-ra: false/d&quot; /etc/netplan/00-installer-config.yaml<br />    98      fi<br />    99  }<br /><br />   100  setup_dhcpclient_nm()<br />   101  {<br />   102      local dev=$1<br />   103      local connection=&quot;System $1&quot;<br />   104      local method=`/usr/bin/nmcli c s &quot;$connection&quot; | grep ipv6.method | awk &#039;{print $2}&#039;`<br /><br />   105      if [[ $MODE == &quot;PASSTHROUGH&quot; ]]; then<br />   106          if [[ $method == &quot;auto&quot; ]]; then<br />   107              # stop client<br />   108              /usr/bin/nmcli c m &quot;$connection&quot; ipv6.method ignore<br />   109          fi<br />   110      else<br />   111          if [[ $method == &quot;ignore&quot; ]]; then<br />   112              # start client<br />   113              /usr/bin/nmcli c m &quot;$connection&quot; ipv6.method auto<br />   114              /usr/bin/nmcli c up &quot;$connection&quot;<br />   115          fi<br />   116      fi<br />   117  }<br /><br />   118  setup_dhclient()<br />   119  {<br />   120      if [[ -f /etc/opencloudos-release ]]; then<br />   121          setup_dhcpclient_nm $1<br />   122          return<br />   123      fi<br />   124      /usr/bin/ps -elF | /usr/bin/grep -w NetworkManager | /usr/bin/grep -v grep &gt;/dev/null<br />   125      if (( $? == 0 )); then<br />   126          setup_dhcpclient_nm $1<br />   127          return<br />   128      fi<br />   129      /usr/bin/ps -elF | /usr/bin/grep -w systemd-networkd | /usr/bin/grep -v grep &gt;/dev/null<br />   130      if (( $? == 0 )); then<br />   131          setup_dhcpclient_systemd $1<br />   132          return<br />   133      fi<br />   134      setup_dhcpclient_dhclient $1<br />   135  }<br /><br />   136  setup_route()<br />   137  {<br />   138      if (( $DEVCOUNT == 1 &amp;&amp; $ADDRCOUNT == 1 )); then<br />   139          /sbin/ip -6 route replace default dev $DEV via fe80::feee:ffff:feff:ffff<br />   140      fi<br />   141      # TODO policy route<br />   142  }<br /><br />   143  # remove wrong addresses and config needed address<br />   144  # PASSTHROUGH mode: remove ULA and other GUA, config right GUA<br />   145  # NAT mode: do nothing<br />   146  # DUAL mode: remove other GUA, config right GUA<br />   147  setup_addr()<br />   148  {<br />   149      local dev=$1<br />   150      local addr=$2<br />   151      local ula=$3<br />   152      local old=<br /><br />   153      if [[ $MODE == &quot;PASSTHROUGH&quot; ]]; then<br />   154          old=`/sbin/ip -6 addr show dev $dev | grep inet6 | grep -v &#039;inet6 fe80&#039; | grep -v &quot;inet6 $addr&quot; | awk &#039;{print $2}&#039;`<br />   155      elif [[ $MODE == &quot;DUAL&quot; ]]; then<br />   156          old=`/sbin/ip -6 addr show dev $dev | grep inet6 | grep -v &#039;inet6 fe80&#039; | grep -v &quot;inet6 $ula&quot; | grep -v &quot;inet6 $addr&quot; | awk &#039;{print $2}&#039;`<br />   157      else<br />   158          return 0<br />   159      fi<br />   160      for o in $old; do<br />   161          echo &quot;removing $o&quot;<br />   162          /sbin/ip -6 addr del dev $dev $o<br />   163      done<br />   164      /sbin/ip -6 addr add dev $dev $addr<br />   165  }<br /><br />   166  sync_config_from_meta<br />   167  setup_dhclient $DEV<br />   168  setup_addr $DEV $ADDR $ULA<br />   169  setup_route<br />   170  EOF<br />   171  fi<br /><br />   172  mode={{mode}}<br />   173  gua={{gua}}<br />   174  ula={{ula}}<br />   175  DEV=&quot;eth0&quot; # default device<br /><br />   176  rclocal=1<br /><br />   177  config_rclocal()<br />   178  {<br />   179      local conf=&quot;/etc/rc.local&quot;<br />   180      if (( $rclocal != 1 )); then<br />   181          return<br />   182      fi<br /><br />   183      if [[ -h $conf ]]; then<br />   184          conf=&quot;/etc/rc.d/rc.local&quot;<br />   185      fi<br />   186      grep -w tencentcloud_ipv6_base $conf | grep &quot;$gua $ula&quot;<br />   187      if (( $? == 1 )); then<br />   188          echo &quot;bash /etc/tencentcloud_ipv6_base.sh $mode $gua $ula CAP&quot; &gt;&gt; $conf<br />   189      fi<br />   190      chmod +x $conf<br />   191  }<br /><br />   192  config_sysconfig()<br />   193  {<br />   194      local conf=&quot;/etc/sysconfig/network-scripts/init.ipv6-global&quot;<br />   195      local key=&quot;Add some routes which should never appear on the wire&quot;<br />   196      if [[ -f $conf ]]; then<br />   197          # duplicate check<br />   198          grep -w tencentcloud_ipv6_base $conf | grep &quot;$gua $ula&quot;<br />   199          if (( $? == 1 )); then<br />   200              lb=`grep -n &quot;$key&quot; $conf | awk -F: &#039;{print $1}&#039; | head -1`<br />   201              if [[ -n $lb ]]; then<br />   202                  sed -i &quot;${lb} i          bash /etc/tencentcloud_ipv6_base.sh ${mode} ${gua} ${ula} CAP&quot; $conf<br />   203              else<br />   204                  # cannot config<br />   205                  return<br />   206              fi<br />   207          fi<br />   208          rclocal=0<br />   209      fi<br />   210  }<br /><br />   211  config_systemd_networking()<br />   212  {<br />   213      local conf=&quot;/lib/systemd/system/networking.service&quot;<br />   214      local key=&quot;ExecStart&quot;<br />   215      if [[ -f $conf ]]; then<br />   216          # duplicate check<br />   217          grep -w tencentcloud_ipv6_base $conf | grep &quot;$gua $ula&quot;<br />   218          if (( $? == 1 )); then<br />   219              lb=`grep -n $key $conf | awk -F: &#039;{print $1}&#039; | tail -1`<br />   220              if [[ -n $lb ]]; then<br />   221                  sed -i &quot;${lb} a ExecStartPost=/bin/sh -c &#039;bash /etc/tencentcloud_ipv6_base.sh ${mode} ${gua} ${ula} CAP&#039;&quot; $conf<br />   222                  systemctl daemon-reload<br />   223              else<br />   224                  # cannot config<br />   225                  return<br />   226              fi<br />   227          fi<br />   228          rclocal=0<br />   229      fi<br />   230  }<br /><br />   231  config_systemd_NetworkManager()<br />   232  {<br />   233      local conf=&quot;/lib/systemd/system/NetworkManager.service&quot;<br />   234      local key=&quot;ExecStart&quot;<br />   235      if [[ -f $conf ]]; then<br />   236          # duplicate check<br />   237          grep -w tencentcloud_ipv6_base $conf | grep &quot;$gua $ula&quot;<br />   238          if (( $? == 1 )); then<br />   239              lb=`grep -n $key $conf | awk -F: &#039;{print $1}&#039; | tail -1`<br />   240              if [[ -n $lb ]]; then<br />   241                  sed -i &quot;${lb} a ExecStartPost=/bin/sh -c &#039;bash /etc/tencentcloud_ipv6_base.sh ${mode} ${gua} ${ula} CAP&#039;&quot; $conf<br />   242                  systemctl daemon-reload<br />   243              else<br />   244                  # cannot config<br />   245                  return<br />   246              fi<br />   247          fi<br />   248          rclocal=0<br />   249      fi<br />   250  }<br /><br />   251  config_sysconfig<br />   252  config_systemd_networking<br />   253  config_systemd_NetworkManager<br />   254  config_rclocal<br /><br />   255  # generic config<br />   256  bash /etc/tencentcloud_ipv6_base.sh PASSTHROUGH 机器外网IPV6地址 机器内网IPV6地址 CAP<br /></pre><br />机器外网IPV6地址 和 机器内网IPV6地址都可以在管理后台找到，填进去，执行下脚本IPV6就又行了.<br /><pre><br />Jan  2 14:20:37 localhost cloud-init[906]: Cloud-init v. 20.1 running &#039;init&#039; at Fri, 02 Jan 2026 06:20:37 +0000. Up 6.03 seconds.<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: ++++++++++++++++++++++++++++++++++++++Net device info++++++++++++++++++++++++++++++++++++++<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: +--------+------+----------------------------+---------------+--------+-------------------+<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: | Device |  Up  |          Address           |      Mask     | Scope  |     Hw-Address    |<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: +--------+------+----------------------------+---------------+--------+-------------------+<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: |  eth0  | True |          10.0.4.3          | 255.255.252.0 | global | 52:54:00:1a:13:c8 |<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: |  eth0  | True | fe80::5054:ff:fe1a:13c8/64 |       .       |  link  | 52:54:00:1a:13:c8 |<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: |   lo   | True |         127.0.0.1          |   255.0.0.0   |  host  |         .         |<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: |   lo   | True |          ::1/128           |       .       |  host  |         .         |<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: +--------+------+----------------------------+---------------+--------+-------------------+<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: +++++++++++++++++++++++++++Route IPv4 info++++++++++++++++++++++++++++<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: +-------+-------------+----------+---------------+-----------+-------+<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: | Route | Destination | Gateway  |    Genmask    | Interface | Flags |<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: +-------+-------------+----------+---------------+-----------+-------+<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: |   0   |   0.0.0.0   | 10.0.4.1 |    0.0.0.0    |    eth0   |   UG  |<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: |   1   |   10.0.4.0  | 0.0.0.0  | 255.255.252.0 |    eth0   |   U   |<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: +-------+-------------+----------+---------------+-----------+-------+<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: ++++++++++++++++++++++++++++Route IPv6 info++++++++++++++++++++++++++++<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: +-------+-------------+---------------------------+-----------+-------+<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: | Route | Destination |          Gateway          | Interface | Flags |<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: +-------+-------------+---------------------------+-----------+-------+<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: |   1   |  fe80::/64  |             ::            |    eth0   |   U   |<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: |   2   |     ::/0    | fe80::feee:ffff:feff:ffff |    eth0   |   UG  |<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: |   4   |  multicast  |             ::            |    eth0   |   U   |<br />Jan  2 14:20:37 localhost cloud-init[906]: ci-info: +-------+-------------+---------------------------+-----------+-------+<br /></pre><br /><br /><pre><br />[root@VM-4-3-rockylinux ~]# ip addr<br />1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />    inet 127.0.0.1/8 scope host lo<br />       valid_lft forever preferred_lft forever<br />    inet6 ::1/128 scope host<br />       valid_lft forever preferred_lft forever<br />2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc mq state UP group default qlen 1000<br />    link/ether 52:54:00:1a:13:c8 brd ff:ff:ff:ff:ff:ff<br />    altname enp0s5<br />    altname ens5<br />    inet 10.0.4.3/22 brd 10.0.7.255 scope global noprefixroute eth0<br />       valid_lft forever preferred_lft forever<br />    inet6 240d:xxxx:xxxx:xxxx:xxxx:xxxx:ce54:0/128 scope global<br />       valid_lft forever preferred_lft forever<br />    inet6 fe80::5054:ff:fe1a:13c8/64 scope link noprefixroute<br />       valid_lft forever preferred_lft forever<br /><br /></pre>]]></description>
			<category></category>
			<guid isPermaLink="true">https://linux.xiazhengxin.name/rss.php/index.php?entry=entry260102-070229</guid>
			<author>小鑫</author>
			<pubDate>Fri, 02 Jan 2026 07:02:29 GMT</pubDate>
		</item>
		<item>
			<title>Rocky Linux 9.7 docker 安装 php5.6 mariadb10.1 等老旧中间件服务</title>
			<link>https://linux.xiazhengxin.name/rss.php/index.php?entry=entry260102-065103</link>
			<description><![CDATA[<blockquote>docker pull 拉取所需指定版本的镜像<br /><pre><br />[root@VM-4-3-rockylinux ~]# docker images                                                                                                                                                                                                                         <br />IMAGE               ID             DISK USAGE   CONTENT SIZE   EXTRA<br />caddy:2.11-alpine   c006ba74d79d       76.8MB         20.8MB    U<br />gogs/gogs:0.12.9    0979e2a099f2        131MB         43.7MB    U<br />mariadb:10.1.48     1205b21b7138        486MB          113MB    U<br />php:5.6.40-fpm      4f070f1b7b93        495MB          126MB    U<br /></pre><br /><br />数据库 docker-compose.yml:<br /><pre><br />[root@VM-4-3-rockylinux mariadb]# nl db.yaml<br />     1  # Use root/example as user/password credentials<br /><br />     2  services:<br /><br />     3    db:<br />     4      image: mariadb:10.1.48<br />     5      restart: always<br />     6      environment:<br />     7        MARIADB_ROOT_PASSWORD: xxxxx<br />     8        MYSQL_ROOT_PASSWORD: xxxxx<br />     9      volumes:<br />    10        - /root/mariadb/data/:/var/lib/mysql:z<br />    11        - /root/mariadb/run/:/var/run/mysqld:z<br />    12      ports:<br />    13        - &quot;172.17.0.1:3306:3306&quot; #使用docker ip<br /></pre><br /><br />php docker-compose.yml:<br /><pre><br />[root@VM-4-3-rockylinux php]# nl php.yaml<br />     1  # Use root/example as user/password credentials<br /><br />     2  services:<br /><br />     3    php:<br />     4      image: php:5.6.40-fpm<br />     5      restart: always<br /><br />     9      command: php-fpm #启动php-fpm 进程<br />    10      volumes:<br />    11        - /root/php/cfg/www.conf:/usr/local/etc/php-fpm.d/www.conf<br />    12        - /root/caddy/wwwroot:/home:Z #挂载caddy webroot，同一路径<br />    13      ports:<br />    14        - &quot;127.0.0.1:9000:9000&quot;<br /></pre><br /><br />镜像内php默认mod 缺少 pdo_mysql 和 gd，使用官方提供的 docker-php-ext-configure 和 docker-php-ext-install 命令安装,<br />docker 内安装 pdo_mysql:<br />docker-php-ext-configure pdo_mysql &amp;&amp; docker-php-ext-install pdo_mysql<br />docker 内安装 gd:<br />需要安装 libjpeg62-turbo-dev 和 libpng-dev 依赖<br />docker-php-ext-configure gd &amp;&amp; docker-php-ext-install gd<br /><br />安装完毕后:<br /><pre><br />[root@VM-4-3-rockylinux ~]# docker exec ddd138aef61b php-fpm -v<br />PHP 5.6.40 (fpm-fcgi) (built: Jan 23 2019 00:16:23)<br />Copyright (c) 1997-2016 The PHP Group<br />Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies<br />[root@VM-4-3-rockylinux ~]# docker exec ddd138aef61b php-fpm -m<br />[PHP Modules]<br />cgi-fcgi<br />Core<br />ctype<br />curl<br />date<br />dom<br />ereg<br />fileinfo<br />filter<br />ftp<br />gd<br />hash<br />iconv<br />json<br />libxml<br />mbstring<br />mhash<br />mysqlnd<br />openssl<br />pcre<br />PDO<br />pdo_mysql<br />pdo_sqlite<br />Phar<br />posix<br />readline<br />Reflection<br />session<br />SimpleXML<br />SPL<br />sqlite3<br />standard<br />tokenizer<br />xml<br />xmlreader<br />xmlwriter<br />zlib<br /><br />[Zend Modules]<br /><br /></pre><br /><br />具体支持的php mod 可以看：<br /><a href="https://github.com/mlocati/docker-php-extension-installer?tab=readme-ov-file#supported-php-extensions" >https://github.com/mlocati/docker-php-extension-installer?tab=readme-ov-file#supported-php-extensions</a><br /><br />caddy docker-compose.yml:<br /><pre><br />[root@VM-4-3-rockylinux caddy]# nl caddy.yaml<br />     1  # Use root/example as user/password credentials<br /><br />     2  services:<br /><br />     3    caddy:<br />     4      image: caddy:2.11-alpine<br />     5      user: root<br />     6      restart: always<br /><br />    10      volumes:<br />    11        - /root/caddy/conf:/etc/caddy<br />    12        - /root/caddy/wwwroot:/home:Z #挂载caddy webroot，同一路径<br />    13        - /root/caddy/caddy_data:/data<br />    14        - /root/caddy/caddy_config:/config<br />    15      network_mode: host<br /></pre><br /><br />gogs docker-compose.yml:<br /><pre><br />[root@VM-4-3-rockylinux gogs]# nl gogs.yaml<br />     1  # Use root/example as user/password credentials<br /><br />     2  services:<br /><br />     3    gogs:<br />     4      image: gogs/gogs:0.12.9<br />     5      restart: always<br /><br />     9      volumes:<br />    10        - /root/gogs/data:/data:Z<br />    11      ports:<br />    12        - &quot;127.0.0.1:3000:3000&quot;<br />    13        - &quot;127.0.0.1:22:22&quot;<br /></pre><br /><br />服务运行OK:<br /><pre><br />[root@VM-4-3-rockylinux ~]# docker compose ls<br />NAME                STATUS              CONFIG FILES<br />caddy               running(1)          /root/caddy/caddy.yaml<br />gogs                running(1)          /root/gogs/gogs.yaml<br />mariadb             running(1)          /root/mariadb/db.yaml<br />php                 running(1)          /root/php/php.yaml<br /></pre></blockquote>]]></description>
			<category></category>
			<guid isPermaLink="true">https://linux.xiazhengxin.name/rss.php/index.php?entry=entry260102-065103</guid>
			<author>小鑫</author>
			<pubDate>Fri, 02 Jan 2026 06:51:03 GMT</pubDate>
		</item>
		<item>
			<title>腾讯云轻量服务器DD OpenBSD 7.5</title>
			<link>https://linux.xiazhengxin.name/rss.php/index.php?entry=entry240520-142033</link>
			<description><![CDATA[登入腾讯云后台，重装系统为Centos 7，使用初始密码ssh 登入系统<br />1.下载openbsd cd75.iso 镜像，dd 到虚拟本地磁盘/dev/vda<br /><pre><br />[root@VM-4-3-centos ~]# lsblk<br />NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT<br />sr0     11:0    1 223.6M  0 rom<br />vda    253:0    0    30G  0 disk<br />└─vda1 253:1    0    30G  0 part /<br />[root@VM-4-3-centos ~]# wget <a href="https://cdn.openbsd.org/pub/OpenBSD/7.5/amd64/cd75.iso" >https://cdn.openbsd.org/pub/OpenBSD/7.5/amd64/cd75.iso</a><br />--2024-05-20 20:59:11--  <a href="https://cdn.openbsd.org/pub/OpenBSD/7.5/amd64/cd75.iso" >https://cdn.openbsd.org/pub/OpenBSD/7.5/amd64/cd75.iso</a><br />Resolving cdn.openbsd.org (cdn.openbsd.org)... 151.101.43.52, 2a04:4e42:a::820<br />Connecting to cdn.openbsd.org (cdn.openbsd.org)|151.101.43.52|:443... connected.<br />HTTP request sent, awaiting response... 200 OK<br />Length: 11429888 (11M) [application/octet-stream]<br />Saving to: ‘cd75.iso’<br /><br />100%[===================================================================================================================================================================================================&gt;] 11,429,888  21.0MB/s   in 0.5s<br /><br />2024-05-20 20:59:12 (21.0 MB/s) - ‘cd75.iso’ saved [11429888/11429888]<br />[root@VM-4-3-centos ~]# ll<br />total 11164<br />-rw-r--r-- 1 root root 11429888 Mar 21 05:54 cd75.iso<br />[root@VM-4-3-centos ~]# dd if=cd75.iso of=/dev/vda bs=512k<br />21+1 records in<br />21+1 records out<br />11429888 bytes (11 MB) copied, 0.00920571 s, 1.2 GB/s<br />[root@VM-4-3-centos ~]# reboot<br /></pre><br />重启进VNC 提示“not boot device” 失败<br />再次重装系统为Centos 7，使用初始密码ssh 登入系统<br /><br />2.下载openbsd miniroot75.img 镜像，dd 到虚拟本地磁盘/dev/vda<br /><pre><br />[root@VM-4-3-centos ~]# lsblk<br />NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT<br />sr0     11:0    1 223.6M  0 rom<br />vda    253:0    0    30G  0 disk<br />└─vda1 253:1    0    30G  0 part /<br />[root@VM-4-3-centos ~]# ll<br />total 0<br />[root@VM-4-3-centos ~]# wget <a href="https://cdn.openbsd.org/pub/OpenBSD/7.5/amd64/miniroot75.img" >https://cdn.openbsd.org/pub/OpenBSD/7.5/amd64/miniroot75.img</a><br />--2024-05-20 21:03:39--  <a href="https://cdn.openbsd.org/pub/OpenBSD/7.5/amd64/miniroot75.img" >https://cdn.openbsd.org/pub/OpenBSD/7.5/amd64/miniroot75.img</a><br />Resolving cdn.openbsd.org (cdn.openbsd.org)... 151.101.43.52, 2a04:4e42:a::820<br />Connecting to cdn.openbsd.org (cdn.openbsd.org)|151.101.43.52|:443... connected.<br />HTTP request sent, awaiting response... 200 OK<br />Length: 5832704 (5.6M) [application/octet-stream]<br />Saving to: ‘miniroot75.img’<br /><br />100%[===================================================================================================================================================================================================&gt;] 5,832,704   13.8MB/s   in 0.4s<br /><br />2024-05-20 21:03:39 (13.8 MB/s) - ‘miniroot75.img’ saved [5832704/5832704]<br /><br />[root@VM-4-3-centos ~]# ls -lh<br />total 5.6M<br />-rw-r--r-- 1 root root 5.6M Mar 21 05:54 miniroot75.img<br />[root@VM-4-3-centos ~]# dd if=miniroot75.img of=/dev/vda bs=512k<br />11+1 records in<br />11+1 records out<br />5832704 bytes (5.8 MB) copied, 0.00625355 s, 933 MB/s<br />[root@VM-4-3-centos ~]# reboot<br /></pre><br />重启进VNC grub 花屏了 又失败<br />重装系统为Centos 7，使用初始密码ssh 登入系统<br /><br />3.下载openbsd install75.img 镜像，dd 到虚拟本地磁盘/dev/vda<br /><pre><br />[root@VM-4-3-centos ~]# lsblk<br />NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT<br />sr0     11:0    1 223.6M  0 rom<br />vda    253:0    0    30G  0 disk<br />└─vda1 253:1    0    30G  0 part /<br />[root@VM-4-3-centos ~]# wget <a href="https://cdn.openbsd.org/pub/OpenBSD/7.5/amd64/install75.img" >https://cdn.openbsd.org/pub/OpenBSD/7.5/amd64/install75.img</a><br />--2024-05-20 21:14:45--  <a href="https://cdn.openbsd.org/pub/OpenBSD/7.5/amd64/install75.img" >https://cdn.openbsd.org/pub/OpenBSD/7.5/amd64/install75.img</a><br />Resolving cdn.openbsd.org (cdn.openbsd.org)... 151.101.43.52, 2a04:4e42:a::820<br />Connecting to cdn.openbsd.org (cdn.openbsd.org)|151.101.43.52|:443... connected.<br />HTTP request sent, awaiting response... 200 OK<br />Length: 696745984 (664M) [application/octet-stream]<br />Saving to: ‘install75.img’<br /><br />100%[===================================================================================================================================================================================================&gt;] 696,745,984 57.0MB/s   in 12s<br /><br />2024-05-20 21:14:58 (54.0 MB/s) - ‘install75.img’ saved [696745984/696745984]<br /><br />[root@VM-4-3-centos ~]# ls -lh<br />total 665M<br />-rw-r--r-- 1 root root 665M Mar 21 06:14 install75.img<br />[root@VM-4-3-centos ~]# fdisk -l<br /><br />Disk /dev/vda: 32.2 GB, 32212254720 bytes, 62914560 sectors<br />Units = sectors of 1 * 512 = 512 bytes<br />Sector size (logical/physical): 512 bytes / 512 bytes<br />I/O size (minimum/optimal): 512 bytes / 512 bytes<br />Disk label type: dos<br />Disk identifier: 0x0009ac89<br /><br />   Device Boot      Start         End      Blocks   Id  System<br />/dev/vda1   *        2048    62914526    31456239+  83  Linux<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />1328+1 records in<br />1328+1 records out<br />696745984 bytes (697 MB) copied, 2.51045 s, 278 MB/s<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# dd if=install75.img of=/dev/vda bs=512k<br />Segmentation fault<br />[root@VM-4-3-centos ~]# reboot<br />Segmentation fault<br /></pre><br />直接dd sf了，又疯狂dd了好几次，重启命令也挂了，好家伙~直接腾讯云后台硬重启<br />重启时间有点长，重启完毕完了后进VNC看看，openbsd 文字安装向导出来了 NB!玄学<br /><br />注：操作时候参考了以下文章：<br /><a href="https://marcocetica.com/posts/openbsd_digitalocean/" >https://marcocetica.com/posts/openbsd_digitalocean/</a><br /><a href="https://book.bsdcn.org/di-2-zhang-an-zhuang-freebsd/di-2.5-jie-teng-xun-yun-qing-liang-yun-ji-qi-ta-fu-wu-qi-dd-an-zhuang-freebsd" >https://book.bsdcn.org/di-2-zhang-an-zhuang-freebsd/di-2.5-jie-teng-xun-yun-qing-liang-yun-ji-qi-ta-fu-wu-qi-dd-an-zhuang-freebsd</a><br /><a href="https://www.openbsd.org/faq/faq4.html#Download" >https://www.openbsd.org/faq/faq4.html#Download</a><br /><a href="https://cloudflare.cdn.openbsd.org/pub/OpenBSD/7.5/amd64/" >https://cloudflare.cdn.openbsd.org/pub/OpenBSD/7.5/amd64/</a>]]></description>
			<category></category>
			<guid isPermaLink="true">https://linux.xiazhengxin.name/rss.php/index.php?entry=entry240520-142033</guid>
			<author>小鑫</author>
			<pubDate>Mon, 20 May 2024 14:20:33 GMT</pubDate>
		</item>
		<item>
			<title>安装完 OpenWrt 23.05.0 后，扩展ROOT分区</title>
			<link>https://linux.xiazhengxin.name/rss.php/index.php?entry=entry231017-043715</link>
			<description><![CDATA[OP一直有这个问题，就是把镜像写入到SD卡或者本地磁盘后，默认只使用了100多M的空间，导致SD卡有大量存储空间限制。<br /><br />之前一直使用的方法是 fdisk 删除，重建分区大法，不过这方法会导致分区UUID变更，需要更新GRUB.CFG文件才行。<br /><br />今天刚安装了OP最新稳定版 OpenWrt 23.05.0，就按照官方最新的DOC试试新方法。<br /><br />ssh 登录系统,可见磁盘mmcblk0p2 需要扩容。<br /><pre><br />BusyBox v1.36.1 (2023-10-09 21:45:35 UTC) built-in shell (ash)<br /><br />  _______                     ________        __<br /> |       |.-----.-----.-----.|  |  |  |.----.|  |_<br /> |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|<br /> |_______||   __|_____|__|__||________||__|  |____|<br />          |__| W I R E L E S S   F R E E D O M<br /> -----------------------------------------------------<br /> OpenWrt 23.05.0, r23497-6637af95aa<br /> -----------------------------------------------------<br />root@OpenWrt:~# uname -a<br />Linux OpenWrt 5.15.134 #0 SMP Mon Oct 9 21:45:35 2023 aarch64 GNU/Linux<br />root@OpenWrt:~# df -h<br />Filesystem                Size      Used Available Use% Mounted on<br />/dev/root               102.3M     16.8M     83.5M  17% /<br />tmpfs                   245.2M     92.0K    245.1M   0% /tmp<br />tmpfs                   512.0K         0    512.0K   0% /dev<br />root@OpenWrt:~# lsblk<br />NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS<br />mmcblk0     179:0    0 14.4G  0 disk<br />├─mmcblk0p1 179:1    0   20M  0 part<br />└─mmcblk0p2 179:2    0  104M  0 part /<br /></pre><br /><br />更新OPKG源，安装需要用到工具 parted losetup resize2fs.<br /><pre><br />root@OpenWrt:~# opkg update<br />Downloading <a href="https://downloads.openwrt.org/releases/23.05.0/targets/sunxi/cortexa53/packages/Packages.gz" >https://downloads.openwrt.org/releases/23.05.0/targets/sunxi/cortexa53/packages/Packages.gz</a><br />Updated list of available packages in /var/opkg-lists/openwrt_core<br />Downloading <a href="https://downloads.openwrt.org/releases/23.05.0/targets/sunxi/cortexa53/packages/Packages.sig" >https://downloads.openwrt.org/releases/23.05.0/targets/sunxi/cortexa53/packages/Packages.sig</a><br />Signature check passed.<br />Downloading <a href="https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/base/Packages.gz" >https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/base/Packages.gz</a><br />Updated list of available packages in /var/opkg-lists/openwrt_base<br />Downloading <a href="https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/base/Packages.sig" >https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/base/Packages.sig</a><br />Signature check passed.<br />Downloading <a href="https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/luci/Packages.gz" >https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/luci/Packages.gz</a><br />Updated list of available packages in /var/opkg-lists/openwrt_luci<br />Downloading <a href="https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/luci/Packages.sig" >https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/luci/Packages.sig</a><br />Signature check passed.<br />Downloading <a href="https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/packages/Packages.gz" >https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/packages/Packages.gz</a><br />Updated list of available packages in /var/opkg-lists/openwrt_packages<br />Downloading <a href="https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/packages/Packages.sig" >https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/packages/Packages.sig</a><br />Signature check passed.<br />Downloading <a href="https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/routing/Packages.gz" >https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/routing/Packages.gz</a><br />Updated list of available packages in /var/opkg-lists/openwrt_routing<br />Downloading <a href="https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/routing/Packages.sig" >https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/routing/Packages.sig</a><br />Signature check passed.<br />Downloading <a href="https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/telephony/Packages.gz" >https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/telephony/Packages.gz</a><br />Updated list of available packages in /var/opkg-lists/openwrt_telephony<br />Downloading <a href="https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/telephony/Packages.sig" >https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/telephony/Packages.sig</a><br />Signature check passed.<br />root@OpenWrt:~# opkg install parted losetup resize2fs<br />Installing parted (3.6-1) to root...<br />Downloading <a href="https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/packages/parted_3.6-1_aarch64_cortex-a53.ipk" >https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/packages/parted_3.6-1_aarch64_cortex-a53.ipk</a><br />Installing libparted (3.6-1) to root...<br />Downloading <a href="https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/packages/libparted_3.6-1_aarch64_cortex-a53.ipk" >https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/packages/libparted_3.6-1_aarch64_cortex-a53.ipk</a><br />Installing libreadline8 (8.2-1) to root...<br />Downloading <a href="https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/base/libreadline8_8.2-1_aarch64_cortex-a53.ipk" >https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/base/libreadline8_8.2-1_aarch64_cortex-a53.ipk</a><br />Installing losetup (2.39-2) to root...<br />Downloading <a href="https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/base/losetup_2.39-2_aarch64_cortex-a53.ipk" >https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/base/losetup_2.39-2_aarch64_cortex-a53.ipk</a><br />Installing resize2fs (1.47.0-2) to root...<br />Downloading <a href="https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/base/resize2fs_1.47.0-2_aarch64_cortex-a53.ipk" >https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a53/base/resize2fs_1.47.0-2_aarch64_cortex-a53.ipk</a><br />Configuring resize2fs.<br />Configuring losetup.<br />Configuring libparted.<br />Configuring libreadline8.<br />Configuring parted.<br /></pre><br /><br />扩容磁盘mmcblk0 分区2,第一次重启。<br /><pre><br />root@OpenWrt:~# echo -e &quot;ok\nfix&quot; | parted -l ---pretend-input-tty<br />Model: SD SD16G (sd/mmc)<br />Disk /dev/mmcblk0: 15.5GB<br />Sector size (logical/physical): 512B/512B<br />Partition Table: msdos<br />Disk Flags:<br /><br />Number  Start   End     Size    Type     File system  Flags<br /> 1      1049kB  22.0MB  21.0MB  primary  fat16        boot, lba<br /> 2      23.1MB  132MB   109MB   primary  ext2<br /><br /><br />root@OpenWrt:~# parted -s /dev/mmcblk0 resizepart 2 100%<br />root@OpenWrt:~# reboot<br /></pre><br /><br />扩容分区 mmcblk0p2 对应的ext文件系统 /，第二次重启。<br /><pre><br />root@OpenWrt:~# lsblk<br />NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS<br />mmcblk0     179:0    0 14.4G  0 disk<br />├─mmcblk0p1 179:1    0   20M  0 part<br />└─mmcblk0p2 179:2    0 14.4G  0 part / #这里可以看到分区2已经被扩容了<br />root@OpenWrt:~# df -h<br />Filesystem                Size      Used Available Use% Mounted on<br />/dev/root               102.3M     20.0M     80.3M  20% /<br />tmpfs                   245.2M     88.0K    245.1M   0% /tmp<br />tmpfs                   512.0K         0    512.0K   0% /dev<br />root@OpenWrt:~# losetup /dev/loop1 /dev/mmcblk0p2<br />root@OpenWrt:~# resize2fs -f /dev/loop1<br />resize2fs 1.47.0 (5-Feb-2023)<br />Resizing the filesystem on /dev/loop1 to 3779072 (4k) blocks.<br />The filesystem on /dev/loop1 is now 3779072 (4k) blocks long.<br /><br />root@OpenWrt:~# reboot<br /></pre><br /><br />2次重启完成后，进入系统，扩容已经完成。<br /><pre><br />root@OpenWrt:~# df -h<br />Filesystem                Size      Used Available Use% Mounted on<br />/dev/root                14.2G     20.0M     14.2G   0% / #文件也已经被扩容<br />tmpfs                   245.2M     84.0K    245.1M   0% /tmp<br />tmpfs                   512.0K         0    512.0K   0% /dev<br />root@OpenWrt:~# lsblk<br />NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS<br />mmcblk0     179:0    0 14.4G  0 disk<br />├─mmcblk0p1 179:1    0   20M  0 part<br />└─mmcblk0p2 179:2    0 14.4G  0 part /<br /></pre><br /><br />相对于fdisk，这个还是比较方便的。<br /><br />参考文档：<br /><a href="https://openwrt.org/docs/guide-user/installation/openwrt_x86#expanding_root_partition" >https://openwrt.org/docs/guide-user/installation/openwrt_x86#expanding_root_partition</a><br /><a href="https://openwrt.org/docs/guide-user/installation/openwrt_x86#expanding_root_filesystem" >https://openwrt.org/docs/guide-user/installation/openwrt_x86#expanding_root_filesystem</a><br /><a href="https://openwrt.org/docs/guide-user/installation/installation_methods/sd_card" >https://openwrt.org/docs/guide-user/installation/installation_methods/sd_card</a><br /><a href="https://openwrt.org/docs/guide-user/advanced/expand_root" >https://openwrt.org/docs/guide-user/advanced/expand_root</a>]]></description>
			<category></category>
			<guid isPermaLink="true">https://linux.xiazhengxin.name/rss.php/index.php?entry=entry231017-043715</guid>
			<author>小鑫</author>
			<pubDate>Tue, 17 Oct 2023 04:37:15 GMT</pubDate>
		</item>
		<item>
			<title>搭建带WEB用户管理的openvpn</title>
			<link>https://linux.xiazhengxin.name/rss.php/index.php?entry=entry231002-040952</link>
			<description><![CDATA[前段时间老大给了任务，要搭建一个供内部同事使用的openvpn，为了方便管理需要支持网页管理UI，故而折腾了一下。<br /><br />1.下载开源的一键部署脚本，使用这位大佬的项目 <a href="https://github.com/Nyr/openvpn-install" >https://github.com/Nyr/openvpn-install</a><br /><br /><pre><br />wget <a href="https://git.io/vpn" >https://git.io/vpn</a> -O openvpn-install.sh &amp;&amp; bash openvpn-install.sh<br /></pre><br />执行 下载，安装 就完事了。<br /><br />如果是个人使用的话，到这里就结束了。缺点是添加、删除用户需要反复的执行该脚本，有点麻烦。<br /><br />2.编辑 /lib/systemd/system/openvpn-server@.service 服务文件，在执行命令后面追加 --management 127.0.0.1 8989 开启管理端口。<br />如下：<br /><pre><br />[Unit]<br />Description=OpenVPN service for %I<br />After=network-online.target<br />Wants=network-online.target<br />Documentation=man:openvpn(8)<br />Documentation=https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage<br />Documentation=https://community.openvpn.net/openvpn/wiki/HOWTO<br /><br />[Service]<br />Type=notify<br />PrivateTmp=true<br />WorkingDirectory=/etc/openvpn/server<br />ExecStart=/usr/sbin/openvpn --status %t/openvpn-server/status-%i.log --status-version 2 --suppress-timestamps --config %i.conf --management 127.0.0.1 8989<br />CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_OVERRIDE CAP_AUDIT_WRITE<br />LimitNPROC=10<br />DeviceAllow=/dev/null rw<br />DeviceAllow=/dev/net/tun rw<br />ProtectSystem=true<br />ProtectHome=true<br />KillMode=process<br />RestartSec=5s<br />Restart=on-failure<br /><br />[Install]<br />WantedBy=multi-user.target<br /></pre><br /><br />3.重载服务列表，重启openvpn服务，使配置生效。并查看端口情况。<br /><pre><br />root@ip:~# systemctl daemon-reload<br />root@ip:~# systemctl restart <a href="mailto:openvpn-server@server.servic" >openvpn-server@server.servic</a>e <br />root@ip:~# netstat -nlp | grep openvpn<br />tcp        0      0 172.31.35.111:12345     0.0.0.0:*               LISTEN      19285/openvpn       <br />tcp        0      0 127.0.0.1:8989          0.0.0.0:*               LISTEN      19285/openvpn     <br /></pre><br /><br />4.确认管理端口开启后，下载ovpn-admin 用户管理服务，解压便可得到可执行的二进制文件。<br /><pre><br />root@ip:~# wget <a href="https://github.com/sharljimhtsin/ovpn-admin/releases/download/v3/ovpn-admin-linux-amd64.tar.gz" >https://github.com/sharljimhtsin/ovpn-admin/releases/download/v3/ovpn-admin-linux-amd64.tar.gz</a><br /></pre><br /><br />5.复制easyrsa 可执行文件 到 $PATH 目录下，ovpn-admin 需要用到。<br /><pre><br />root@ip:~# cp /etc/openvpn/server/easy-rsa/easyrsa /usr/local/bin/<br />root@ip:~# ls -lh /usr/local/bin/<br />total 172K<br />-rwxr-xr-x 1 root root 170K Jul 14 02:45 easyrsa<br /></pre><br /><br />6.启动ovpn-admin.命令如下：<br /><pre><br />root@ip:~# EASYRSA_BATCH=1 ./ovpn-admin --listen.host=&quot;0.0.0.0&quot; --listen.port=&quot;8080&quot; --ovpn.network=&quot;TUN网卡IP/24&quot; --ovpn.server=WANIP:12345:tcp --easyrsa.path=/etc/openvpn/server/easy-rsa/ --easyrsa.index-path=/etc/openvpn/server/easy-rsa/pki/index.txt --log.level=trace <br />--web.basic-auth.user=admin --web.basic-auth.password=12345<br />DEBU[0000] mgmtStatusTimeFormat: 2006-01-02 15:04:05    <br />DEBU[0000] mgmtSetTimeFormat: successful connection to main/127.0.0.1:8989 <br />TRAC[0000] OpenVPN Version: OpenVPN 2.5.1 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on May 14 2021<br />Management Version: 3<br /> ND<br />INFO[0000] Bind: <a href="http://0.0.0.0:8080" >http://0.0.0.0:8080</a> <br /></pre><br /><br />比较关键的参数就是 --web.basic-auth.user=admin --web.basic-auth.password=12345 这2个是用于webui 管理的登录认证。<br />由于该进程需要常驻，我是用的是 screen，也可以用 nohup 之类的。或者使用 <a href="https://mysystemd.talos.sh/" >https://mysystemd.talos.sh/</a> 生成一个 systemd 服务。<br /><br />7.检查服务端口情况。<br /><pre><br />root@ip:~# netstat -nlp | grep vpn<br />tcp        0      0 172.31.35.111:12345     0.0.0.0:*               LISTEN      19285/openvpn       <br />tcp        0      0 127.0.0.1:8989          0.0.0.0:*               LISTEN      19285/openvpn       <br />tcp6       0      0 :::8080                 :::*                    LISTEN      19300/./ovpn-admin  <br /></pre><br /><br />8.确认一切OK后，就可以使用 <a href="http://wanip:8080" >http://wanip:8080</a> + 之前配置的用户名密码 访问openvpn 的用户管理后台了。]]></description>
			<category></category>
			<guid isPermaLink="true">https://linux.xiazhengxin.name/rss.php/index.php?entry=entry231002-040952</guid>
			<author>小鑫</author>
			<pubDate>Mon, 02 Oct 2023 04:09:52 GMT</pubDate>
		</item>
		<item>
			<title>caddy2 域名站点禁用 http to https 自动跳转</title>
			<link>https://linux.xiazhengxin.name/rss.php/index.php?entry=entry210911-132916</link>
			<description><![CDATA[caddy 这个web server 不用多说了，auto TLS 是它的最大卖点。<br /><br />但是有时候确实会有一些奇葩需求，<br /><br />比如我就是要访问http 版本，我不需要自动跳转到 https.但是同时我需要https 也可以用。<br /><br />只需要http 的场景，直接 tls off 就完事了。（caddy 1 是这么配置的，caddy 2 不清楚）<br /><br />所以我需要的情况是 http 和 https 共存，两者都可以独立访问。<br /><br />通过查阅资料，看到了 caddy 2 有个auto_https 的全局选项，可以选择off、disable_redirects、ignore_loaded_certs三个选项。<br />先不说这玩意有用没用，这是全局开关，我不可能为了一个站点，影响其他正常的站点。故不考虑。<br /><br />继续查。。。<br /><br />终于找到了解决方案，就是在 hostname 上做手脚。。。。<br /><pre><br /><a href="http://debug.xzx.im:80" >http://debug.xzx.im:80</a> <a href="https://debug.xzx.im" >https://debug.xzx.im</a> {<br />        root * /var/www<br />        file_server<br />}<br /></pre><br />这就完事了。查看效果：<br /><pre><br />[root@VM-4-3-centos ~]# curl <a href="http://debug.xzx.im" >http://debug.xzx.im</a> -I<br />HTTP/1.1 200 OK<br />Accept-Ranges: bytes<br />Content-Length: 6841<br />Content-Type: text/html; charset=utf-8<br />Etag: &quot;qz7q685a1&quot;<br />Last-Modified: Fri, 10 Sep 2021 09:54:08 GMT<br />Server: Caddy<br />Date: Sat, 11 Sep 2021 13:44:55 GMT<br /><br />[root@VM-4-3-centos ~]# curl <a href="https://debug.xzx.im" >https://debug.xzx.im</a> -I<br />HTTP/1.1 200 OK<br />Accept-Ranges: bytes<br />Content-Length: 6841<br />Content-Type: text/html; charset=utf-8<br />Etag: &quot;qz7q685a1&quot;<br />Last-Modified: Fri, 10 Sep 2021 09:54:08 GMT<br />Server: Caddy<br />Date: Sat, 11 Sep 2021 13:45:00 GMT<br /></pre><br /><br />再看个同一个CADDY下没改的站点的：<br /><pre><br />[root@VM-4-3-centos ~]# curl <a href="http://us.xzx.im" >http://us.xzx.im</a> -I<br />HTTP/1.1 308 Permanent Redirect<br />Connection: close<br />Location: <a href="https://us.xzx.im/" >https://us.xzx.im/</a><br />Server: Caddy<br />Date: Sat, 11 Sep 2021 13:46:55 GMT<br /><br />[root@VM-4-3-centos ~]# curl <a href="https://us.xzx.im" >https://us.xzx.im</a> -I<br />HTTP/1.1 200 OK<br />Content-Length: 5514<br />Content-Type: text/html; charset=utf-8<br />Date: Sat, 11 Sep 2021 13:46:58 GMT<br />Server: Caddy<br />Server: swoole-http-server<br />Set-Cookie: SWOFT_SESSION_ID=eo0e72sbt0kqiqvco1kkflfqc6; expires=Sun, 12-Sep-2021 01:46:58 GMT; path=/; httponly<br /></pre><br /><br />效果十分明显，没有了不想要http to https redirect. good!!!!<br /><br />查阅了以下文档：<br /><a href="https://caddyserver.com/docs/automatic-https" >https://caddyserver.com/docs/automatic-https</a><br /><a href="https://caddyserver.com/docs/caddyfile/options#auto-https" >https://caddyserver.com/docs/caddyfile/options#auto-https</a><br /><a href="https://caddy.community/t/making-sense-of-auto-https-and-why-disabling-it-still-serves-https-instead-of-http/9761" >https://caddy.community/t/making-sense-of-auto-https-and-why-disabling-it-still-serves-https-instead-of-http/9761</a>]]></description>
			<category></category>
			<guid isPermaLink="true">https://linux.xiazhengxin.name/rss.php/index.php?entry=entry210911-132916</guid>
			<author>小鑫</author>
			<pubDate>Sat, 11 Sep 2021 13:29:16 GMT</pubDate>
		</item>
		<item>
			<title>Quantumult X 下使用SS + v2ray-plugin 配置容易踩的坑</title>
			<link>https://linux.xiazhengxin.name/rss.php/index.php?entry=entry210219-064438</link>
			<description><![CDATA[在 Quantumult X 下添加自己的ss + v2ray-plugin 服务器节点相较与小火箭本身就有一点麻烦，因为不提供GUI方式添加，只能自己编辑CONF文件。<br /><br />之前就是照着官方的SAMPLE格式加了自己的VMESS节点，不过还行，添加一次就成功了。<br /><br />这次添加ss + v2ray-plugin 死活测试延迟失败。。。结果仔仔细细的看了文档，才发现显式需要设置 mux=0 ，默认值是1.<br /><br />文档里有说明：<br /><pre><br /># When using obfs=ws and obfs=wss the server side can be deployed by v2ray-plugin with mux = 0 or by v2ray-core.<br /></pre><br /><br />修正后的go-shadowsocks2 服务端启动命令:<br /><blockquote><br />nohup go-shadowsocks2 -password ****** -plugin v2ray-plugin -plugin-opts &quot;server;tls;host=kr.xzx.im;key=/path/to/kr.xzx.im.key;cert=/path/to/kr.xzx.im.crt;<strong>mux=0</strong>&quot; -s &quot;:####&quot; -verbose &amp;<br /></blockquote><br /><br />对应的Quantumult X 本地配置文件的server_local 节点配置：<br /><blockquote><br />shadowsocks=kr.xzx.im:####,method=chacha20-ietf-poly1305,password=******,obfs=wss,obfs-uri=/,obfs-host=kr.xzx.im,tls13=false,fast-open=false,udp-relay=false,tag=ss-v2ray-plugin<br /></blockquote><br /><br />折腾了好久，结果还是吃了没仔细看文档的亏，所以以后文档还得看啊~<br /><br />参考了：https://github.com/crossutility/Quantumult-X/blob/master/sample.conf]]></description>
			<category></category>
			<guid isPermaLink="true">https://linux.xiazhengxin.name/rss.php/index.php?entry=entry210219-064438</guid>
			<author>小鑫</author>
			<pubDate>Fri, 19 Feb 2021 06:44:38 GMT</pubDate>
		</item>
		<item>
			<title>Caddy 1 迁移到 Caddy 2 配置文件改动</title>
			<link>https://linux.xiazhengxin.name/rss.php/index.php?entry=entry200423-060301</link>
			<description><![CDATA[之前一直用的是CADDY 1，最近随着CADDY 2 越来越接近生产环境，故而借由查看服务器情况下载升级了一下。<br /><br />升级BIN 很简单，直接下载官方提供的BIN 包解压即可。如果要自己编译得话，GOLANG 的版本需要Go 1.14 以上了。 v1的话 1.13 版本就行。<br /><br />这里不赘述。主要讲讲配置文件格式的变化。改动还是蛮大的，v1的CaddyFile 直接无法启动。需要自己根据官方迁移文档挨个修改。。。。。<br /><br />这里是我V1 和 V2 的区别.<br /><br />v1 版本：<br /><pre><br />sgp.xzx.im<br />root /home/admin/http<br />proxy /caonima 127.0.0.1:9700 {<br />        websocket<br />        header_upstream -Origin<br />}<br />browse /<br />status 403 /forbidden<br />basicauth &quot;username&quot; password{<br />    realm &quot;password plz&quot;<br />    /pdf<br />    /rinima<br />}<br />rewrite {<br />#  if {file} starts_with .<br />  r ^/\..*<br />  to /forbidden<br />}<br />fastcgi / /run/php-fpm/www.sock php<br /></pre><br /><br />v2 版本：<br /><pre><br />sgp.xzx.im {<br />        root * /home/admin/http<br />        reverse_proxy /caonima 127.0.0.1:9700<br />        respond /forbidden 403<br />        basicauth /pdf/* {<br />                username JDJhJDEwJEhrMGVjT2s1ZWNoSnM1VUFhUThnV090dUttU3ZYc1kyZGVTLmhoNGVVZUVtY0lwcXRuRG1T<br />        }<br />        basicauth /rinima/* {<br />                username JDJhJDEwJEhrMGVjT2s1ZWNoSnM1VUFhUThnV090dUttU3ZYc1kyZGVTLmhoNGVVZUVtY0lwcXRuRG1T<br />        }<br />        @dotFiles {<br />                path_regexp ^/\..*<br />        }<br />        rewrite @dotFiles /forbidden<br />        # Proxy PHP files to the FastCGI responder<br />        @phpFiles {<br />                path *.php<br />        }<br />        reverse_proxy @phpFiles unix//var/run/php-fpm-www.sock {<br />                transport fastcgi {<br />                        split .php<br />                }<br />        }<br />        #php_fastcgi unix//var/run/php-fpm-www.sock #这个应该是有用的，之前忘了加 unix:// 前缀,还以为没作用<br />        file_server /* browse<br />}<br /></pre><br /><br />基本一目了然。要注意的是<br />1.HTTP 认证密码不在存放明文，跟NGINX、APACHE HTTPD 学了，通过密码工具生成密文。具体看<br /><pre><br />root@iZt4nbvac3vpa6uqd0l17kZ:~ # caddy help hash-password<br />Convenient way to hash a plaintext password. The resulting<br />hash is written to stdout as a base64 string.<br /><br />--algorithm may be bcrypt or scrypt. If script, the default<br />parameters are used.<br /><br />Use the --salt flag for algorithms which require a salt to<br />be provided (scrypt).<br /><br />usage:<br />  caddy hash-password --plaintext &lt;password&gt; [--salt &lt;string&gt;] [--algorithm &lt;name&gt;]<br /><br />flags:<br />  -algorithm string<br />        Name of the hash algorithm (default &quot;bcrypt&quot;)<br />  -plaintext string<br />        The plaintext password<br />  -salt string<br />        The password salt<br /><br />Full documentation is available at:<br /><a href="https://caddyserver.com/docs/command-line" >https://caddyserver.com/docs/command-line</a><br />root@iZt4nbvac3vpa6uqd0l17kZ:~ # caddy hash-password --plaintext &quot;caonima&quot;<br />JDJhJDEwJEV1VTFDbk94WnJFaEZJZndMb0tob081U01JOEtVTEpuMW1tbGZRNW16QXJFb3gubm8yM2RX #生成的密文<br /></pre><br /><br />2.其次就是 php_fastcgi 其实 reverse_proxy 包装了一下，算是个“存储过程”吧。。。。<br />负责的事情比v1 版本的 fastcgi 多了很多，因为是专门为PHP 解释器转发设计的。<br />更方便你部署PHP站点了，特别是lumen 这类bootstrap 单一入口，控制器做转发的框架。<br />可以省去 try_files 等很多逻辑。一键集成PHP....<br /><br />具体看：https://caddyserver.com/docs/caddyfile/directives/php_fastcgi#expanded-form<br /><br /><br />除了配置之外，启动方式也变了。<br />之前：<br /><pre><br />echo &quot;start caddy&quot;<br />nohup go/bin/caddy -agree -log log/web.log -conf cfg/Caddyfile &gt;&amp; log/caddy.log &amp;<br /></pre><br /><br />现在：<br /><pre><br /> \--- 17397 root caddy run --pingback 127.0.0.1:26860 --config cfg/Caddyfile<br />#  start           Starts the Caddy process in the background and then returns<br />默认后台运行，不需要再用 nohup 了<br /></pre><br /><br />注：本文在实践&amp;撰写时参考了以下文档：<br /><a href="https://caddyserver.com/docs/v2-upgrade" >https://caddyserver.com/docs/v2-upgrade</a><br /><a href="https://caddyserver.com/docs/caddyfile/directives" >https://caddyserver.com/docs/caddyfile/directives</a><br /><a href="https://caddyserver.com/docs/caddyfile/matchers" >https://caddyserver.com/docs/caddyfile/matchers</a><br /><a href="https://caddyserver.com/docs/caddyfile-tutorial" >https://caddyserver.com/docs/caddyfile-tutorial</a>]]></description>
			<category></category>
			<guid isPermaLink="true">https://linux.xiazhengxin.name/rss.php/index.php?entry=entry200423-060301</guid>
			<author>小鑫</author>
			<pubDate>Thu, 23 Apr 2020 06:03:01 GMT</pubDate>
		</item>
		<item>
			<title>利用 iptables 做端口转发，实现代理中转</title>
			<link>https://linux.xiazhengxin.name/rss.php/index.php?entry=entry200103-032251</link>
			<description><![CDATA[最近得了一台TW 的NAT机器，考虑到是TW的原生IP，打算好好利用一番。可是直连过去丢包情况严重，考虑到我手里有一台HK的机器，到我，到TW的线路都还不错。<br /><br />所以决定使用这台机器来做中转功能。这里就需要用到端口转发。<br /><br />端口转发有很多解决方案，支持反代的软件有很多，比如nginx,apache,haproxy,socat 等.<br /><br />这些都是应用层面的，而且得安装对应的软件包，配置，监听端口，运行才行。但是如果想到操作系统内核底层操作的话，就不得不说iptables 了。<br /><br />首先修改kernel 内核参数，开启端口转发功能。<br /><pre><br />[root@hk_uc ~]# cat /etc/sysctl.conf<br /># sysctl settings are defined through files in<br /># /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.<br />#<br /># Vendors settings live in /usr/lib/sysctl.d/.<br /># To override a whole file, create a new file with the same in<br /># /etc/sysctl.d/ and put new settings there. To override<br /># only specific settings, add a file with a lexically later<br /># name in /etc/sysctl.d/ and put new settings there.<br />#<br /># For more information, see sysctl.conf(5) and sysctl.d(5).<br />kernel.msgmnb = 65536<br />kernel.msgmax = 65536<br />kernel.unknown_nmi_panic = 0<br />kernel.sysrq = 1<br />fs.file-max = 1000000<br />vm.swappiness = 10<br />fs.inotify.max_user_watches = 10000000<br />net.core.wmem_max = 327679<br />net.core.rmem_max = 327679<br />net.ipv4.conf.all.send_redirects = 0<br />net.ipv4.conf.default.send_redirects = 0<br />net.ipv4.conf.all.secure_redirects = 0<br />net.ipv4.conf.default.secure_redirects = 0<br />net.ipv4.conf.all.accept_redirects = 0<br />net.ipv4.conf.default.accept_redirects = 0<br />fs.inotify.max_queued_events = 327679<br />kernel.shmmax = 68719476736<br />kernel.shmall = 4294967296<br />net.ipv4.neigh.default.gc_thresh1 = 2048<br />net.ipv4.neigh.default.gc_thresh2 = 4096<br />net.ipv4.neigh.default.gc_thresh3 = 8192<br />net.ipv6.conf.all.disable_ipv6 = 1<br />net.ipv4.ip_forward = 1 //开启端口转发 1=&gt;开启 0=&gt;关闭<br /></pre><br />编辑保存后，重载配置，使之生效。<br /><pre><br />[root@hk_uc ~]# sysctl -p<br />kernel.msgmnb = 65536<br />kernel.msgmax = 65536<br />kernel.unknown_nmi_panic = 0<br />kernel.sysrq = 1<br />fs.file-max = 1000000<br />vm.swappiness = 10<br />fs.inotify.max_user_watches = 10000000<br />net.core.wmem_max = 327679<br />net.core.rmem_max = 327679<br />net.ipv4.conf.all.send_redirects = 0<br />net.ipv4.conf.default.send_redirects = 0<br />net.ipv4.conf.all.secure_redirects = 0<br />net.ipv4.conf.default.secure_redirects = 0<br />net.ipv4.conf.all.accept_redirects = 0<br />net.ipv4.conf.default.accept_redirects = 0<br />fs.inotify.max_queued_events = 327679<br />kernel.shmmax = 68719476736<br />kernel.shmall = 4294967296<br />net.ipv4.neigh.default.gc_thresh1 = 2048<br />net.ipv4.neigh.default.gc_thresh2 = 4096<br />net.ipv4.neigh.default.gc_thresh3 = 8192<br />net.ipv6.conf.all.disable_ipv6 = 1<br />net.ipv4.ip_forward = 1<br /></pre><br /><br />接下来就是操作iptables，加入相关的转发规则链。现在比较主流的方式通过 前置路由链、和后置路由链 的方式去实现转发。<br /><br />我现在要把HK机器9800 端口上进来的TCP请求，统统转发到TW机器(210.203.57.103)的19600 端口上去。<br />加入前置路由规则:<br /><blockquote><br />iptables -t nat -A PREROUTING -p tcp -m tcp --dport 9800 -j DNAT --to-destination 210.203.57.103:19600<br /></blockquote><br />加入后置路由规则:<br /><blockquote><br />iptables -t nat -A POSTROUTING -d 210.203.57.103 -p tcp -m tcp --dport 19600 -j SNAT --to-source 10.8.32.28<br /></blockquote><br />10.8.32.28 是我的网卡eth0 IP.<br /><pre><br />[root@hk_uc ~]# ifconfig<br />eth0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt;  mtu 1454<br />        inet 10.8.32.28  netmask 255.255.0.0  broadcast 10.8.255.255<br />        ether 52:54:00:1a:5d:55  txqueuelen 1000  (Ethernet)<br />        RX packets 83091504  bytes 30721120125 (28.6 GiB)<br />        RX errors 0  dropped 891  overruns 0  frame 0<br />        TX packets 98367783  bytes 33007019179 (30.7 GiB)<br />        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0<br /><br />lo: flags=73&lt;UP,LOOPBACK,RUNNING&gt;  mtu 65536<br />        inet 127.0.0.1  netmask 255.0.0.0<br />        loop  txqueuelen 1000  (Local Loopback)<br />        RX packets 14612734  bytes 19897570061 (18.5 GiB)<br />        RX errors 0  dropped 0  overruns 0  frame 0<br />        TX packets 14612734  bytes 19897570061 (18.5 GiB)<br />        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0<br /></pre><br />到这步，iptables 端口转发就已经配置好了。保存下iptables 配置。<br /><pre><br />[root@hk_uc ~]# iptables-save<br /># Generated by iptables-save v1.4.21 on Fri Jan  3 11:52:32 2020<br />*nat<br />:PREROUTING ACCEPT [7618:365173]<br />:INPUT ACCEPT [7618:365173]<br />:OUTPUT ACCEPT [1727:118684]<br />:POSTROUTING ACCEPT [1727:118684]<br />-A PREROUTING -p tcp -m tcp --dport 9800 -j DNAT --to-destination 210.203.57.103:19600<br />-A PREROUTING -p tcp -m tcp --dport 9900 -j DNAT --to-destination 140.238.11.39:9600<br />-A POSTROUTING -d 210.203.57.103/32 -p tcp -m tcp --dport 19600 -j SNAT --to-source 10.8.32.28<br />-A POSTROUTING -d 140.238.11.39/32 -p tcp -m tcp --dport 9600 -j SNAT --to-source 10.8.32.28<br />COMMIT<br /># Completed on Fri Jan  3 11:52:32 2020<br /># Generated by iptables-save v1.4.21 on Fri Jan  3 11:52:32 2020<br />*filter<br />:INPUT ACCEPT [433680:111523114]<br />:FORWARD ACCEPT [360898:155486678]<br />:OUTPUT ACCEPT [476261:116542832]<br />COMMIT<br /># Completed on Fri Jan  3 11:52:32 2020<br /></pre><br />至此，所有操作完成。可以看到HK 机器的9800端口已经可以ping 通了。我本地到TW机器的延迟约等于 本地到HK + HK 到 TW 的延迟总和。牺牲一点延迟，换来线路的稳定，也是值得的。<br /><br />本文在实践撰写的过程参考一下文章:<br /><a href="http://xstarcd.github.io/wiki/Linux/iptables_forward_internetshare.html" >http://xstarcd.github.io/wiki/Linux/ipt ... share.html</a><br /><a href="https://coolnull.com/3322.html" >https://coolnull.com/3322.html</a><br /><a href="https://doubibackup.com/3we1qxzj-3.html" >https://doubibackup.com/3we1qxzj-3.html</a>]]></description>
			<category></category>
			<guid isPermaLink="true">https://linux.xiazhengxin.name/rss.php/index.php?entry=entry200103-032251</guid>
			<author>小鑫</author>
			<pubDate>Fri, 03 Jan 2020 03:22:51 GMT</pubDate>
		</item>
		<item>
			<title>在NAT机器上搭建 shadowsocks + v2ray-plugin (websocket SSL) 组合</title>
			<link>https://linux.xiazhengxin.name/rss.php/index.php?entry=entry191220-052047</link>
			<description><![CDATA[最近入了一台套路云的TW NAT机器，就寻思着把它搭建起来用于代理，本来打算是还用v2ray websocket + caddy 那套，不过由于是NAT机器，80,443 这样的端口基本是不用想了，我还得去研究caddy 第三方SSL证书怎么配置使用、还得去freessl.org 这样的网站自己去生成一套SSL证书。因为caddy 的自动签名证书只能用在常规的https 443端口。<br /><br />想想就麻烦。但是shadowsocks 基于我之前使用情况，发现已经大概率被识别了。在这种情况下，我想试试之前听说过，但一直没用过的 v2ray-plugin 插件.<br /><br /><strong>如果你的机器没有golang 环境，请先安装并配置好GOPATH、PATH.参见：https://go-repo.io/</strong><br /><strong>最好也安装一下开发者套件，比如 yum groupinstall &#039;development tools&#039;</strong><br /><strong>确认防火墙已经关闭，或者指定端口已经放行.比如 systemctl stop firewalld</strong><br /><br />首先下载 go-shadowsocks2,<br /><pre><br />go get -u -v github.com/shadowsocks/go-shadowsocks2<br /></pre><br />一行命令搞定。<br /><br />接下来是v2ray-plugin.(它的项目主页提供了bin 包下载。图省事的可以直接下载解压，复制到PATH目录即可。)<br /><pre><br />git clone <a href="https://github.com/shadowsocks/v2ray-plugin.git" >https://github.com/shadowsocks/v2ray-plugin.git</a><br /></pre><br />签出代码，进入目录。编辑里面的 build-release.sh 文件，删除除了 linux,x64 之外的所有系统平台、架构。下面的几个ARM 平台的也删了。<br />运行 build-release.sh 编译文件，完成后你会在当前目录看到适合你平台架构的可执行文件。<br /><br />复制到PATH 目录下，改名为 v2ray-plugin.<br /><pre><br />mv v2ray-plugin_linux_amd64 ~/go/bin/v2ray-plugin<br /></pre><br /><br />按说到这里就差不多了，但是因为需要跑websocket + SSL.还需要一个 SSL证书。<br />用到了acme.sh 工具。<br /><pre><br />git clone <a href="https://github.com/Neilpang/acme.sh" >https://github.com/Neilpang/acme.sh</a><br /></pre><br />签出代码，进入目录。<br />因为是NAT模式，所以一般的 --standalone 模式是行不通的。(我试过给 --httpport 参数，没效果)<br />故而使用 DNS 验证模式，执行脚本<br /><pre><br />./acme.sh --issue --dns -d  tw.xzx.im --yes-I-know-dns-manual-mode-enough-go-ahead-please<br /></pre><br />之后进入自己的DNS SERVER ISP 后台，添加一条TXT记录，内容就是脚本返回里面的。不难找~<br />确认域名记录生效后，再次执行脚本：<br /><pre><br />./acme.sh --renew --dns -d  tw.xzx.im --yes-I-know-dns-manual-mode-enough-go-ahead-please<br /></pre><br />不出意外，基本就成功了。SSL证书的公私钥啥的就都保存到本地的 ~/.acme.sh 目录下了。<br /><br />证书搞定后就起服务了。<br /><pre><br />nohup go-shadowsocks2 -password ***** -plugin v2ray-plugin -plugin-opts &quot;server;tls;host=tw.xzx.im&quot; -s &quot;:9600&quot; &amp;<br /></pre><br />htop 看一下，服务已经起来了，go-shadowsocks 成功的调起了 v2ray-plugin 进程。<br /><pre><br />  |-go-shadowsocks2,29874 -password ***** -plugin v2ray-plugin -plugin-opts server;tls;host=tw.xzx.im -s :9600<br />  |   |-v2ray-plugin,29879<br />  |   |   |-{v2ray-plugin},29881<br />  |   |   |-{v2ray-plugin},29882<br />  |   |   |-{v2ray-plugin},29883<br />  |   |   |-{v2ray-plugin},29884<br />  |   |   |-{v2ray-plugin},29885<br />  |   |   |-{v2ray-plugin},29886<br />  |   |   |-{v2ray-plugin},30461<br />  |   |   |-{v2ray-plugin},30462<br />  |   |   `-{v2ray-plugin},30476<br />  |   |-{go-shadowsocks2},29875<br />  |   |-{go-shadowsocks2},29876<br />  |   |-{go-shadowsocks2},29877<br />  |   |-{go-shadowsocks2},29878<br />  |   |-{go-shadowsocks2},29880<br />  |   |-{go-shadowsocks2},30458<br />  |   |-{go-shadowsocks2},30459<br />  |   |-{go-shadowsocks2},30464<br />  |   |-{go-shadowsocks2},30477<br />  |   |-{go-shadowsocks2},30699<br />  |   |-{go-shadowsocks2},30701<br />  |   `-{go-shadowsocks2},30710<br /></pre><br />端口监听正常.<br /><pre><br />[root@vm1219610 ~]# netstat -nlp | grep 9600<br />tcp        0      0 0.0.0.0:9600            0.0.0.0:*               LISTEN      29879/v2ray-plugin<br />udp        0      0 0.0.0.0:9600            0.0.0.0:*                           29874/go-shadowsock<br /></pre><br /><br />服务端搞定了。接下来配置一下自己本地的代理工具，我用的是netch,GUI 上添加一个新SS服务器，配置一下就OK了。<br /><pre><br />    {<br />      &quot;Remark&quot;: &quot;TW&quot;,<br />      &quot;Group&quot;: &quot;None&quot;,<br />      &quot;Type&quot;: &quot;SS&quot;,<br />      &quot;Rate&quot;: 1.0,<br />      &quot;Hostname&quot;: &quot;tw.xzx.im&quot;,<br />      &quot;Port&quot;: 19600, #这里是NAT端口转发的外网开放端口<br />      &quot;Username&quot;: null,<br />      &quot;Password&quot;: &quot;*******&quot;,<br />      &quot;UserID&quot;: &quot;&quot;,<br />      &quot;AlterID&quot;: 0,<br />      &quot;EncryptMethod&quot;: &quot;chacha20-ietf-poly1305&quot;,<br />      &quot;Plugin&quot;: &quot;v2ray-plugin&quot;,<br />      &quot;PluginOption&quot;: &quot;tls;host=tw.xzx.im&quot;,<br />      &quot;Protocol&quot;: null,<br />      &quot;ProtocolParam&quot;: null,<br />      &quot;OBFS&quot;: null,<br />      &quot;OBFSParam&quot;: null,<br />      &quot;TransferProtocol&quot;: &quot;tcp&quot;,<br />      &quot;FakeType&quot;: &quot;&quot;,<br />      &quot;Host&quot;: &quot;&quot;,<br />      &quot;Path&quot;: &quot;&quot;,<br />      &quot;QUICSecure&quot;: &quot;none&quot;,<br />      &quot;QUICSecret&quot;: &quot;&quot;,<br />      &quot;TLSSecure&quot;: false,<br />      &quot;Delay&quot;: 49<br />    }<br /></pre><br /><br />这是我netch 的json 配置，仅供参考。<br /><br />注：本文在实践、撰写时参考了一下项目文档:<br /><a href="https://github.com/shadowsocks/go-shadowsocks2/blob/master/README.md" >https://github.com/shadowsocks/go-shadowsocks2/blob/master/README.md</a><br /><a href="https://github.com/shadowsocks/v2ray-plugin/blob/master/README.md" >https://github.com/shadowsocks/v2ray-plugin/blob/master/README.md</a><br /><a href="https://github.com/Neilpang/acme.sh/blob/master/README.md" >https://github.com/Neilpang/acme.sh/blob/master/README.md</a>]]></description>
			<category></category>
			<guid isPermaLink="true">https://linux.xiazhengxin.name/rss.php/index.php?entry=entry191220-052047</guid>
			<author>小鑫</author>
			<pubDate>Fri, 20 Dec 2019 05:20:47 GMT</pubDate>
		</item>
	</channel>
</rss>
