diff --git a/synapse/models/inet.py b/synapse/models/inet.py
index 97d9311f8..6df0a55c5 100644
--- a/synapse/models/inet.py
+++ b/synapse/models/inet.py
@@ -144,18 +144,31 @@ class Srv4Type(DataType):
         if s_compat.isstr(valu):
             return self._norm_str(valu, oldval=oldval)
 
+        if valu < 0 or valu > 281474976710655:
+            self._raiseBadValu(valu, mesg='Srv4Type integer is out of bounds')
+
         addr = valu >> 16
         port = valu & 0xffff
         return valu, {'port': port, 'ipv4': addr}
 
     def _norm_str(self, text, oldval=None):
+        if ':' not in text:
+            try:
+                valu = int(text)
+            except ValueError:
+                self._raiseBadValu(text, mesg='Srv4Type string is not a integer or a colon delimited string.')
+            return self.norm(valu)
+
         try:
             astr, pstr = text.split(':')
         except ValueError as e:
-            self._raiseBadValu(text)
+            self._raiseBadValu(text, mesg='Unable to split Srv4Type into two parts')
 
         addr = ipv4int(astr)
         port = int(pstr, 0)
+        if port < 0 or port > 65535:
+            self._raiseBadValu(text, port=port,
+                               mesg='Srv4 Port number is out of bounds')
         return (addr << 16) | port, {'port': port, 'ipv4': addr}
 
 srv6re = re.compile('^\[([a-f0-9:]+)\]:(\d+)$')

inet:srv4 type doesn't handle integer as string input
inet:tcp4="123456789012345" doesn't norm correctly 
diff --git a/synapse/tests/test_model_inet.py b/synapse/tests/test_model_inet.py
index d36f28b0a..16418b499 100644
--- a/synapse/tests/test_model_inet.py
+++ b/synapse/tests/test_model_inet.py
@@ -123,6 +123,39 @@ class InetModelTest(SynTest):
             self.eq(t3[1].get('inet:udp4:port'), 8443)
             self.eq(t3[1].get('inet:udp4:ipv4'), core.getTypeNorm('inet:ipv4', '1.2.3.4')[0])
 
+            # 1.2.3.4:8443
+            t4 = core.formTufoByProp('inet:udp4', '1108152164603')
+            self.eq(t4[1].get('inet:udp4:port'), 8443)
+            self.eq(t4[1].get('inet:udp4:ipv4'), core.getTypeNorm('inet:ipv4', '1.2.3.4')[0])
+
+            # Ensure boundaries are observed
+            for i in ['0', 0, '0.0.0.0:0']:
+                valu, subs = core.getTypeNorm('inet:srv4', i)
+                self.eq(valu, 0)
+                self.eq(subs.get('port'), 0)
+                self.eq(subs.get('ipv4'), 0)
+
+            for i in ['281474976710655', 281474976710655, '255.255.255.255:65535']:
+                valu, subs = core.getTypeNorm('inet:srv4', i)
+                self.eq(valu, 281474976710655)
+                self.eq(subs.get('port'), 0xFFFF)
+                self.eq(subs.get('ipv4'), 0xFFFFFFFF)
+
+            # Repr works as expected
+            self.eq(core.getTypeRepr('inet:srv4', 0), '0.0.0.0:0')
+            self.eq(core.getTypeRepr('inet:srv4', 1108152164603), '1.2.3.4:8443')
+            self.eq(core.getTypeRepr('inet:srv4', 281474976710655), '255.255.255.255:65535')
+
+            # Ensure bad input fails
+            self.raises(BadTypeValu, core.getTypeNorm, 'inet:srv4', '281474976710656')
+            self.raises(BadTypeValu, core.getTypeNorm, 'inet:srv4', 281474976710656)
+            self.raises(BadTypeValu, core.getTypeNorm, 'inet:srv4', '255.255.255.255:65536')
+            self.raises(BadTypeValu, core.getTypeNorm, 'inet:srv4', '255.255.255.255:-1')
+            self.raises(BadTypeValu, core.getTypeNorm, 'inet:srv4', -1)
+            self.raises(BadTypeValu, core.getTypeNorm, 'inet:srv4', '-1')
+            self.raises(BadTypeValu, core.getTypeNorm, 'inet:srv4', 'ruh roh')
+            self.raises(BadTypeValu, core.getTypeNorm, 'inet:srv4', '1.2.3.4:8080:9090')
+
     def test_model_inet_srv6_types(self):
         with self.getRamCore() as core:
             t0 = core.formTufoByProp('inet:tcp6', '[0:0:0:0:0:0:0:1]:80')

pip install -e .
parse_log_pytest
requirements.txt
pytest pytest-cov
apt-get update apt-get install -y build-essential libffi-dev libssl-dev python3 python3-dev python3-pip python3-setuptools
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
certifi==2021.5.30
cffi==1.15.1
coverage==6.2
cryptography==40.0.2
importlib-metadata==4.8.3
iniconfig==1.1.1
lmdb==1.6.2
msgpack-python==0.5.6
packaging==21.3
pluggy==1.0.0
py==1.11.0
pycparser==2.21
pyOpenSSL==23.2.0
pyparsing==3.1.4
pytest==7.0.1
pytest-cov==4.0.0
-e git+https://github.com/vertexproject/synapse.git@ca3e448523e3e09729f884f54d2135ebf9ff3c08#egg=synapse
tomli==1.2.3
tornado==6.1
typing_extensions==4.1.1
xxhash==3.2.0
zipp==3.6.0

name: synapse
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - cffi==1.15.1
      - coverage==6.2
      - cryptography==40.0.2
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - lmdb==1.6.2
      - msgpack-python==0.5.6
      - packaging==21.3
      - pluggy==1.0.0
      - py==1.11.0
      - pycparser==2.21
      - pyopenssl==23.2.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pytest-cov==4.0.0
      - tomli==1.2.3
      - tornado==6.1
      - typing-extensions==4.1.1
      - xxhash==3.2.0
      - zipp==3.6.0
prefix: /opt/conda/envs/synapse

synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_srv4_types
synapse/tests/test_model_inet.py::InetModelTest::test_model_fqdn_punycode synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_201706121318 synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_201706201837 synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_201709181501 synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_asnet4 synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_cast_defang synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_cidr4 synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_email synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_follows synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_fqdn synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_fqdn_set_sfx synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_fqdn_unicode synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_ipv4 synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_ipv4_raise synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_ipv6 synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_mac synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_netmemb synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_netmesg synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_netpost synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_passwd synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_srv6_types synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_url_fields synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_urlfile synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_weblogon synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_whois_recns synapse/tests/test_model_inet.py::InetModelTest::test_model_inet_whoisemail synapse/tests/test_model_inet.py::InetModelTest::test_model_whois_contact
synapse/models/inet.py
synapse/models/inet.py