只是想知道是否有人可以帮助我。 我目前正在构建 pfsense 防火墙,它使用 VPN 连接来保护流量。 VPN 提供商确实提供了端口转发机制,但传入端口号每小时都会发生变化。我有一个脚本可以让我发现新端口,但我需要一种脚本化方法来修改防火墙中的端口转发设置以匹配。
控制此功能的防火墙配置文件片段如下:
<?xml version="1.0"?>
<pfsense>
<nat>
<rule>
<source>
<any/>
</source>
<destination>
<any/>
<port>53400</port>
</destination>
<protocol>tcp/udp</protocol>
<target>192.168.0.15</target>
<local-port>53400</local-port>
<interface>opt2</interface>
<descr><![CDATA[Torrent]]></descr>
<associated-rule-id>nat_52d81d2dc904f5.77023355</associated-rule-id>
<created>
<time>1389894957</time>
<username>[email protected]</username>
</created>
<updated>
<time>1389980696</time>
<username>[email protected]</username>
</updated>
</rule>
</nat>
<filter>
<rule>
<id/>
<type>pass</type>
<interface>opt2</interface>
<ipprotocol>inet</ipprotocol>
<tag/>
<tagged/>
<max/>
<max-src-nodes/>
<max-src-conn/>
<max-src-states/>
<statetimeout/>
<statetype>keep state</statetype>
<os/>
<protocol>tcp/udp</protocol>
<source>
<any/>
</source>
<destination>
<address>192.168.0.15</address>
<port>53400</port>
</destination>
<log/>
<descr><![CDATA[NAT Torrent]]></descr>
<associated-rule-id>nat_52d81d2dc904f5.77023355</associated-rule-id>
<created>
<time>1389894957</time>
<username>NAT Port Forward</username>
</created>
<updated>
<time>1389899075</time>
<username>[email protected]</username>
</updated>
</rule>
</filter>
</pfsense>
在上面的 XML 中,我们有两部分组成 pfsense 的端口转发规则。
<nat>
部分包围的部分是端口向前。 <rule>
中的部分是接口特定的传入防火墙规则。必须修改两者才能使新的端口转发设置生效。
我正在考虑使用 xmlstarlet 来修改配置文件,使用
<descr>
作为识别要更改哪些部分的关键。
我知道您可以拥有以下数据:
<username><![CDATA[name]]></username>
<password><![CDATA[password]]></password>
<dbname><![CDATA[name]]></dbname>
并修改为:
xml ed -P -O -L \
-u '//username/text()' -v 'something' \
-u '//password/text()' -v 'somethingelse' \
-u '//dbname/text()' -v 'somethingdifferent' \
file.xml
而且你还可以有类似的东西:
<objects>
<object>
<name>Foo</name>
<constant1>10</constant1>
<constant2>20</constant2>
</object>
<object>
<name>Bar</name>
<constant1>15</constant1>
<constant2>40</constant2>
</object>
</objects>
并更新属性:
xmlstarlet ed -u '//object[name="Foo"]/const1' -v 18 sample.xml
但是,我正在努力将两者合并,以便我有一个匹配
<descr>="Torrent"
的语句,然后更新相关的 <port>
和 <local-port>
属性。
任何有关合适的 xmlstarlet 命令的帮助将不胜感激。
xmlstarlet ed \
-u '//rule[descr="Torrent"]/destination/port' -v 1111 \
-u '//rule[descr="Torrent"]/local-port' -v 2222 \
sample.xml